Skip to content

Commit e9c3932

Browse files
crisbetokirjs
authored andcommitted
refactor(compiler): add spread elements to the output AST
Adds spread elements to the output AST which can be used in arrays and function calls.
1 parent 63b0ad7 commit e9c3932

5 files changed

Lines changed: 45 additions & 0 deletions

File tree

packages/compiler-cli/src/ngtsc/translator/src/translator.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,11 @@ export class ExpressionTranslatorVisitor<TFile, TStatement, TExpression>
415415
throw new Error('Method not implemented');
416416
}
417417

418+
visitSpreadElementExpr(ast: o.outputAst.SpreadElementExpr, context: any): TExpression {
419+
const expression = ast.expression.visitExpression(this, context);
420+
return this.setSourceMapRange(this.factory.createSpreadElement(expression), ast.sourceSpan);
421+
}
422+
418423
visitWrappedNodeExpr(ast: o.WrappedNodeExpr<any>, _context: Context): any {
419424
this.recordWrappedNode(ast);
420425
return ast.node;

packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ class TypeTranslatorVisitor implements o.ExpressionVisitor, o.TypeVisitor {
280280
throw new Error('Method not implemented.');
281281
}
282282

283+
visitSpreadElementExpr(ast: o.outputAst.SpreadElementExpr, context: any) {
284+
const typeNode = this.translateExpression(ast.expression, context);
285+
return ts.factory.createRestTypeNode(typeNode);
286+
}
287+
283288
private translateType(type: o.Type, context: Context): ts.TypeNode {
284289
const typeNode = type.visitType(this, context);
285290
if (!ts.isTypeNode(typeNode)) {

packages/compiler/src/compiler.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export {
118118
WrappedNodeExpr,
119119
LiteralMapPropertyAssignment,
120120
LiteralMapSpreadAssignment,
121+
SpreadElementExpr,
121122
} from './output/output_ast';
122123
export {JitEvaluator} from './output/output_jit';
123124
export {SourceMap} from './output/source_map';

packages/compiler/src/output/abstract_emitter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,10 @@ export abstract class AbstractEmitterVisitor implements o.StatementVisitor, o.Ex
486486
// TODO: Do we *need* to parenthesize everything?
487487
ast.expr.visitExpression(this, ctx);
488488
}
489+
visitSpreadElementExpr(ast: o.SpreadElementExpr, ctx: EmitterVisitorContext) {
490+
ctx.print(ast, '...');
491+
ast.expression.visitExpression(this, ctx);
492+
}
489493
visitAllExpressions(
490494
expressions: o.Expression[],
491495
ctx: EmitterVisitorContext,

packages/compiler/src/output/output_ast.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,6 +1425,31 @@ export class CommaExpr extends Expression {
14251425
}
14261426
}
14271427

1428+
export class SpreadElementExpr extends Expression {
1429+
constructor(
1430+
public expression: Expression,
1431+
sourceSpan?: ParseSourceSpan | null,
1432+
) {
1433+
super(null, sourceSpan);
1434+
}
1435+
1436+
override isEquivalent(e: Expression): boolean {
1437+
return e instanceof SpreadElementExpr && this.expression.isEquivalent(e.expression);
1438+
}
1439+
1440+
override isConstant() {
1441+
return this.expression.isConstant();
1442+
}
1443+
1444+
override visitExpression(visitor: ExpressionVisitor, context: any): any {
1445+
return visitor.visitSpreadElementExpr(this, context);
1446+
}
1447+
1448+
override clone(): SpreadElementExpr {
1449+
return new SpreadElementExpr(this.expression.clone(), this.sourceSpan);
1450+
}
1451+
}
1452+
14281453
export interface ExpressionVisitor {
14291454
visitReadVarExpr(ast: ReadVarExpr, context: any): any;
14301455
visitInvokeFunctionExpr(ast: InvokeFunctionExpr, context: any): any;
@@ -1452,6 +1477,7 @@ export interface ExpressionVisitor {
14521477
visitArrowFunctionExpr(ast: ArrowFunctionExpr, context: any): any;
14531478
visitParenthesizedExpr(ast: ParenthesizedExpr, context: any): any;
14541479
visitRegularExpressionLiteral(ast: RegularExpressionLiteralExpr, context: any): any;
1480+
visitSpreadElementExpr(ast: SpreadElementExpr, context: any): any;
14551481
}
14561482

14571483
export const NULL_EXPR = new LiteralExpr(null, null, null);
@@ -1772,6 +1798,10 @@ export class RecursiveAstVisitor implements StatementVisitor, ExpressionVisitor
17721798
ast.expr.visitExpression(this, context);
17731799
return this.visitExpression(ast, context);
17741800
}
1801+
visitSpreadElementExpr(ast: SpreadElementExpr, context: any): any {
1802+
ast.expression.visitExpression(this, context);
1803+
return this.visitExpression(ast, context);
1804+
}
17751805
visitAllExpressions(exprs: Expression[], context: any): void {
17761806
exprs.forEach((expr) => expr.visitExpression(this, context));
17771807
}

0 commit comments

Comments
 (0)