Skip to content

Commit f131785

Browse files
authored
fix: Add a node representing an omitted expression (#1394)
1 parent 0234c8b commit f131785

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

src/ast.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export enum NodeKind {
5959
LITERAL,
6060
NEW,
6161
NULL,
62+
OMITTED,
6263
PARENTHESIZED,
6364
PROPERTYACCESS,
6465
TERNARY,
@@ -209,7 +210,7 @@ export abstract class Node {
209210
}
210211

211212
static createArrayLiteralExpression(
212-
elementExpressions: (Expression | null)[],
213+
elementExpressions: Expression[],
213214
range: Range
214215
): ArrayLiteralExpression {
215216
return new ArrayLiteralExpression(elementExpressions, range);
@@ -326,6 +327,12 @@ export abstract class Node {
326327
return new ObjectLiteralExpression(names, values, range);
327328
}
328329

330+
static createOmittedExpression(
331+
range: Range
332+
): OmittedExpression {
333+
return new OmittedExpression(range);
334+
}
335+
329336
static createParenthesizedExpression(
330337
expression: Expression,
331338
range: Range
@@ -1101,7 +1108,7 @@ export abstract class LiteralExpression extends Expression {
11011108
export class ArrayLiteralExpression extends LiteralExpression {
11021109
constructor(
11031110
/** Nested element expressions. */
1104-
public elementExpressions: (Expression | null)[],
1111+
public elementExpressions: Expression[],
11051112
/** Source range. */
11061113
range: Range
11071114
) {
@@ -1347,6 +1354,16 @@ export class ObjectLiteralExpression extends LiteralExpression {
13471354
}
13481355
}
13491356

1357+
/** Represents an omitted expression, e.g. within an array literal. */
1358+
export class OmittedExpression extends Expression {
1359+
constructor(
1360+
/** Source range. */
1361+
range: Range
1362+
) {
1363+
super(NodeKind.OMITTED, range);
1364+
}
1365+
}
1366+
13501367
/** Represents a parenthesized expression. */
13511368
export class ParenthesizedExpression extends Expression {
13521369
constructor(

src/compiler.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8795,11 +8795,11 @@ export class Compiler extends DiagnosticEmitter {
87958795
var expressions = expression.elementExpressions;
87968796
var length = expressions.length;
87978797
var values = new Array<ExpressionRef>(length);
8798-
var isStatic = true;
8798+
var isStatic = !elementType.is(TypeFlags.HOST);
87998799
var nativeElementType = elementType.toNativeType();
88008800
for (let i = 0; i < length; ++i) {
88018801
let elementExpression = expressions[i];
8802-
if (elementExpression) {
8802+
if (elementExpression.kind != NodeKind.OMITTED) {
88038803
let expr = this.compileExpression(<Expression>elementExpression, elementType,
88048804
Constraints.CONV_IMPLICIT | Constraints.WILL_RETAIN
88058805
);
@@ -8811,7 +8811,7 @@ export class Compiler extends DiagnosticEmitter {
88118811
}
88128812
values[i] = expr;
88138813
} else {
8814-
values[i] = this.makeZero(elementType, expression);
8814+
values[i] = this.makeZero(elementType, elementExpression);
88158815
}
88168816
}
88178817

@@ -8966,10 +8966,10 @@ export class Compiler extends DiagnosticEmitter {
89668966
var length = expressions.length;
89678967
var values = new Array<ExpressionRef>(length);
89688968
var nativeElementType = elementType.toNativeType();
8969-
var isStatic = true;
8969+
var isStatic = !elementType.is(TypeFlags.HOST);
89708970
for (let i = 0; i < length; ++i) {
89718971
let elementExpression = expressions[i];
8972-
if (elementExpression) {
8972+
if (elementExpression.kind != NodeKind.OMITTED) {
89738973
let expr = this.compileExpression(elementExpression, elementType,
89748974
Constraints.CONV_IMPLICIT | Constraints.WILL_RETAIN
89758975
);
@@ -8981,7 +8981,7 @@ export class Compiler extends DiagnosticEmitter {
89818981
}
89828982
values[i] = expr;
89838983
} else {
8984-
values[i] = this.makeZero(elementType, expression);
8984+
values[i] = this.makeZero(elementType, elementExpression);
89858985
}
89868986
}
89878987

@@ -10670,7 +10670,7 @@ export class Compiler extends DiagnosticEmitter {
1067010670
this.error(
1067110671
DiagnosticCode.Not_implemented_0,
1067210672
reportNode.range,
10673-
"ref.null<externref>"
10673+
"ref.null"
1067410674
);
1067510675
return module.unreachable();
1067610676
}

src/parser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3668,11 +3668,11 @@ export class Parser extends DiagnosticEmitter {
36683668
}
36693669
// ArrayLiteralExpression
36703670
case Token.OPENBRACKET: {
3671-
let elementExpressions = new Array<Expression | null>();
3671+
let elementExpressions = new Array<Expression>();
36723672
while (!tn.skip(Token.CLOSEBRACKET)) {
36733673
let expr: Expression | null;
36743674
if (tn.peek() == Token.COMMA) {
3675-
expr = null; // omitted
3675+
expr = Node.createOmittedExpression(tn.range(tn.pos));
36763676
} else {
36773677
expr = this.parseExpression(tn, Precedence.COMMA + 1);
36783678
if (!expr) return null;

0 commit comments

Comments
 (0)