From 943a475c3592149aad6062ad235338da548365ea Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Thu, 9 Jul 2026 09:28:40 +0800 Subject: [PATCH] Angular: Support expression for exhaustive typechecking (#19571) --- changelog_unreleased/angular/19571.md | 19 +++++++++++++ package.json | 2 +- .../print/angular-control-flow-block.js | 18 ++++++++---- .../__snapshots__/format.test.js.snap | 28 +++++++++++++++++-- .../angular/control-flow/default-never.html | 16 +++++++++-- yarn.lock | 10 +++---- 6 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 changelog_unreleased/angular/19571.md diff --git a/changelog_unreleased/angular/19571.md b/changelog_unreleased/angular/19571.md new file mode 100644 index 000000000..5ece540ab --- /dev/null +++ b/changelog_unreleased/angular/19571.md @@ -0,0 +1,19 @@ +#### Support expression for exhaustive typechecking (#19571 by @fisker) + + +```html + +@switch (state.mode) { + @default never(state); +} + + +@switch (state.mode) { + @default never; +} + + +@switch (state.mode) { + @default never(state); +} +``` diff --git a/package.json b/package.json index bd98e6443..4855c43bd 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "acorn": "8.17.0", "acorn-jsx": "5.3.2", "angular-estree-parser": "15.5.0", - "angular-html-parser": "10.10.0", + "angular-html-parser": "10.11.0", "camelcase": "9.0.0", "ci-info": "4.4.0", "cjk-regex": "3.4.0", diff --git a/src/language-html/print/angular-control-flow-block.js b/src/language-html/print/angular-control-flow-block.js index 6281a5c1b..ab69b7ae5 100644 --- a/src/language-html/print/angular-control-flow-block.js +++ b/src/language-html/print/angular-control-flow-block.js @@ -20,13 +20,21 @@ function printAngularControlFlowBlock(path, options, print) { docs.push("@", node.name); - if (isSwitchExhaustiveCheck(node)) { - docs.push(";"); - return docs; - } + const isDefaultNever = isSwitchExhaustiveCheck(node); if (node.parameters) { - docs.push(" ", "(", group(print("parameters")), ")"); + // No space in `@default never(state)` + // https://github.com/prettier/prettier/issues/19570#issuecomment-4916194365 + if (!isDefaultNever) { + docs.push(" "); + } + + docs.push("(", group(print("parameters")), ")"); + } + + if (isDefaultNever) { + docs.push(";"); + return docs; } if (!isSwitchFallthroughCase(node)) { diff --git a/tests/format/angular/control-flow/__snapshots__/format.test.js.snap b/tests/format/angular/control-flow/__snapshots__/format.test.js.snap index deac6b286..8cf72183e 100644 --- a/tests/format/angular/control-flow/__snapshots__/format.test.js.snap +++ b/tests/format/angular/control-flow/__snapshots__/format.test.js.snap @@ -161,8 +161,20 @@ parsers: ["angular"] @default never; } -@switch ( cond.kind) { - @default never ; +@switch ( cond.kind ) { + @default never ; +} + +@switch ( state.mode) { + @default never(state); +} + +@switch ( state.mode ) { + @default never ( state ) ; +} + +@switch ( expr) { + @default never(expr.prop); } =====================================output===================================== @@ -174,6 +186,18 @@ parsers: ["angular"] @default never; } +@switch (state.mode) { + @default never(state); +} + +@switch (state.mode) { + @default never(state); +} + +@switch (expr) { + @default never(expr.prop); +} + ================================================================================ `; diff --git a/tests/format/angular/control-flow/default-never.html b/tests/format/angular/control-flow/default-never.html index 9f954fd91..5beac259b 100644 --- a/tests/format/angular/control-flow/default-never.html +++ b/tests/format/angular/control-flow/default-never.html @@ -2,6 +2,18 @@ @default never; } -@switch ( cond.kind) { - @default never ; +@switch ( cond.kind ) { + @default never ; +} + +@switch ( state.mode) { + @default never(state); +} + +@switch ( state.mode ) { + @default never ( state ) ; +} + +@switch ( expr) { + @default never(expr.prop); } diff --git a/yarn.lock b/yarn.lock index 01c7198dd..5cb2c0ab4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3088,10 +3088,10 @@ __metadata: languageName: node linkType: hard -"angular-html-parser@npm:10.10.0": - version: 10.10.0 - resolution: "angular-html-parser@npm:10.10.0" - checksum: 10/820a1e96439d1ab02d4fb3524ac6a09a2b9a8622879692732508ee96c6f9847fdd899a3750714e6e39aff06ec864c405c5555167ed8068fd1e613b0f151c633f +"angular-html-parser@npm:10.11.0": + version: 10.11.0 + resolution: "angular-html-parser@npm:10.11.0" + checksum: 10/b311b3e984eaba422d41ecff8ea1255c1e5d5cd86ffd88f8651b12323b33104a0099711e1f4104dfe4f4383ff926ac43df4f072bf616f5dbbc5e86ef76e33383 languageName: node linkType: hard @@ -8212,7 +8212,7 @@ __metadata: acorn: "npm:8.17.0" acorn-jsx: "npm:5.3.2" angular-estree-parser: "npm:15.5.0" - angular-html-parser: "npm:10.10.0" + angular-html-parser: "npm:10.11.0" base64-arraybuffer-es6: "npm:3.1.0" browserslist: "npm:4.28.5" browserslist-to-esbuild: "npm:2.1.1"