Skip to content

Commit a0be043

Browse files
devversionalxhub
authored andcommitted
reactor(compiler-cli): account for babel types change (#45967)
This commit accounts for the Babel types changes. Some properties can now also be `undefined` so existing checks/assertions had to be adjusted to also capture `undefined` (along with `null`). Additionally, in preparation for a new ECMA proposal, Babel types seem to have been updated to include private names in object property keys. This is not necessarily the case for object expressions, but could be for object patterns (in the future -- when implemented). More details: babel/babel#14304 and https://github.com/tc39/proposal-destructuring-private. PR Close #45967
1 parent 71e4bf5 commit a0be043

File tree

9 files changed

+22
-17
lines changed

9 files changed

+22
-17
lines changed

packages/compiler-cli/linker/babel/src/ast/babel_ast_host.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ export class BabelAstHost implements AstHost<t.Expression> {
7171
for (const property of obj.properties) {
7272
assert(property, t.isObjectProperty, 'a property assignment');
7373
assert(property.value, t.isExpression, 'an expression');
74-
assert(property.key, isPropertyName, 'a property name');
74+
assert(property.key, isObjectExpressionPropertyName, 'a property name');
75+
7576
const key = t.isIdentifier(property.key) ? property.key.name : property.key.value;
7677
result.set(`${key}`, property.value);
7778
}
@@ -124,7 +125,7 @@ export class BabelAstHost implements AstHost<t.Expression> {
124125
}
125126

126127
getRange(node: t.Expression): Range {
127-
if (node.loc == null || node.start === null || node.end === null) {
128+
if (node.loc == null || node.start == null || node.end == null) {
128129
throw new FatalLinkerError(
129130
node, 'Unable to read range for node - it is missing location information.');
130131
}
@@ -156,10 +157,14 @@ function isNotSpreadElement(e: t.Expression|t.SpreadElement): e is t.Expression
156157

157158

158159
/**
159-
* Return true if the expression can be considered a text based property name.
160+
* Return true if the node can be considered a text based property name for an
161+
* object expression.
162+
*
163+
* Notably in the Babel AST, object patterns (for destructuring) could be of type
164+
* `t.PrivateName` so we need a distinction between object expressions and patterns.
160165
*/
161-
function isPropertyName(e: t.Expression): e is t.Identifier|t.StringLiteral|t.NumericLiteral {
162-
return t.isIdentifier(e) || t.isStringLiteral(e) || t.isNumericLiteral(e);
166+
function isObjectExpressionPropertyName(n: t.Node): n is t.Identifier|t.StringLiteral|t.NumericLiteral {
167+
return t.isIdentifier(n) || t.isStringLiteral(n) || t.isNumericLiteral(n);
163168
}
164169

165170
/**

packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/ng_for_simple_partial.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
.ɵɵelementStart(0, "div");\n // SOURCE: "/ng_for_simple.ts" "<div *ngFor="let item "
1+
.ɵɵelementStart(0, "div");\n // SOURCE: "/ng_for_simple.ts" "<div *ngFor="let item "
22
3-
.ɵɵtext(1);\n // SOURCE: "/ng_for_simple.ts" "{{ item }}"
3+
.ɵɵtext(1);\n // SOURCE: "/ng_for_simple.ts" "{{ item }}"
44
55
// TODO: Work out how to fix the broken segment for the last item in a template
66
.ɵɵelem // SOURCE: "/ng_for_simple.ts" "</div>'"
77
8-
.ɵɵadvance(1);\n // SOURCE: "/ng_for_simple.ts" "{{ item }}"
8+
.ɵɵadvance(1);\n // SOURCE: "/ng_for_simple.ts" "{{ item }}"
99
1010
.ɵɵtextInterpolate(item_r1);\n }\n}\n\n // SOURCE: "/ng_for_simple.ts" "{{ item }}"
1111

packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/ng_for_templated_partial.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.ɵɵtext(0);\n }\n\n if (rf & 2) {\n const item_r1 = ctx.$implicit;\n // SOURCE: "/ng_for_templated.ts" "{{ item }}</ng-template>`"
1+
.ɵɵtext(0);\n }\n\n if (rf & 2) {\n const item_r1 = ctx.$implicit;\n // SOURCE: "/ng_for_templated.ts" "{{ item }}</ng-template>`"
22
33
// TODO - map the bindings better
44
// TODO: Work out how to fix the broken segment for the last item in a template

packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/ng_if_simple_partial.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
.ɵɵelementStart(0, "div");\n // SOURCE: "/ng_if_simple.ts" "<div *"
1+
.ɵɵelementStart(0, "div");\n // SOURCE: "/ng_if_simple.ts" "<div *"
22
3-
.ɵɵtext(1);\n // SOURCE: "/ng_if_simple.ts" "{{ name }}"
3+
.ɵɵtext(1);\n // SOURCE: "/ng_if_simple.ts" "{{ name }}"
44
55
// TODO: Work out how to fix the broken segment for the last item in a template
66
.ɵɵelem // SOURCE: "/ng_if_simple.ts" "</div>'"
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
.ɵɵelementStart(0, "div");\n // SOURCE: "/ng_if_templated.ts" "<div>"
1+
.ɵɵelementStart(0, "div");\n // SOURCE: "/ng_if_templated.ts" "<div>"
22
33
// TODO - map the bindings better
44
// TODO: Work out how to fix the broken segment for the last item in a template
5-
.ɵɵelementEnd();\n // SOURCE: "/ng_if_templated.ts" "</div>\n"
5+
.ɵɵelementEnd();\n // SOURCE: "/ng_if_templated.ts" "</div>\n"
66
77
// TODO: the `ctx_r...` appears to be dependent upon previous tests!!!
88
// TODO: expectMapping(mappings, { source: '{{ name }}', generated: 'i0.ɵɵtextInterpolate(ctx_r0.name)', sourceUrl: '../ng_if_templated.ts'});

packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/output_binding_complex_partial.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.ɵɵelementStart(0, "button", 0) // SOURCE: "/output_binding_complex.ts" "<button "
22
3-
.ɵɵlistener("click", function TestCmp_Template_button_click_0_listener() {\n // SOURCE: "/output_binding_complex.ts" "(click)=""
3+
.ɵɵlistener("click", function TestCmp_Template_button_click_0_listener() {\n // SOURCE: "/output_binding_complex.ts" "(click)=""
44
55
ctx.items.push( // SOURCE: "/output_binding_complex.ts" "items.push("
66

packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/output_binding_simple_partial.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.ɵɵelementStart(0, "button", 0) // SOURCE: "/output_binding_simple.ts" "<button "
22
3-
.ɵɵlistener("click", function TestCmp_Template_button_click_0_listener() {\n // SOURCE: "/output_binding_simple.ts" "(click)=\""
3+
.ɵɵlistener("click", function TestCmp_Template_button_click_0_listener() {\n // SOURCE: "/output_binding_simple.ts" "(click)=\""
44
55
ctx.doSomething() // SOURCE: "/output_binding_simple.ts" "doSomething()\">"
66
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.ɵɵelementStart(1, "input", 0) // SOURCE: "/two_way_binding_longhand.ts" "<input "
22
33
// TODO: improve mappings here
4-
.ɵɵlistener("ngModelChange", function TestCmp_Template_input_ngModelChange_1_listener($event) {\n // SOURCE: "/two_way_binding_longhand.ts" "bindon-ngModel=\"name\">'"
4+
.ɵɵlistener("ngModelChange", function TestCmp_Template_input_ngModelChange_1_listener($event) {\n // SOURCE: "/two_way_binding_longhand.ts" "bindon-ngModel=\"name\">'"
55
66
// TODO: Work out how to fix the broken segment for the last item in a template
77
.ɵɵelementEnd() // SOURCE: "/two_way_binding_longhand.ts" "<input "

packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/two_way_binding_simple_partial.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
.ɵɵelementStart(1, "input", 0) // SOURCE: "/two_way_binding_simple.ts" "<input "
33
44
// TODO: improve mappings here
5-
.ɵɵlistener("ngModelChange", function TestCmp_Template_input_ngModelChange_1_listener($event) {\n // SOURCE: "/two_way_binding_simple.ts" "[(ngModel)]=\"name\">'"
5+
.ɵɵlistener("ngModelChange", function TestCmp_Template_input_ngModelChange_1_listener($event) {\n // SOURCE: "/two_way_binding_simple.ts" "[(ngModel)]=\"name\">'"
66
77
.ɵɵelementEnd() // SOURCE: "/two_way_binding_simple.ts" "<input "

0 commit comments

Comments
 (0)