Skip to content

Commit

Permalink
reactor(compiler-cli): account for babel types change
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
devversion committed May 20, 2022
1 parent cace1b0 commit c360a59
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions packages/compiler-cli/linker/babel/src/ast/babel_ast_host.ts
Expand Up @@ -71,7 +71,8 @@ export class BabelAstHost implements AstHost<t.Expression> {
for (const property of obj.properties) {
assert(property, t.isObjectProperty, 'a property assignment');
assert(property.value, t.isExpression, 'an expression');
assert(property.key, isPropertyName, 'a property name');
assert(property.key, isObjectExpressionPropertyName, 'a property name');

const key = t.isIdentifier(property.key) ? property.key.name : property.key.value;
result.set(`${key}`, property.value);
}
Expand Down Expand Up @@ -124,7 +125,7 @@ export class BabelAstHost implements AstHost<t.Expression> {
}

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


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

/**
Expand Down

0 comments on commit c360a59

Please sign in to comment.