diff --git a/src/ast.ts b/src/ast.ts index f789983047..b3b4df6258 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -59,6 +59,7 @@ export enum NodeKind { LITERAL, NEW, NULL, + OMITTED, PARENTHESIZED, PROPERTYACCESS, TERNARY, @@ -209,7 +210,7 @@ export abstract class Node { } static createArrayLiteralExpression( - elementExpressions: (Expression | null)[], + elementExpressions: Expression[], range: Range ): ArrayLiteralExpression { return new ArrayLiteralExpression(elementExpressions, range); @@ -326,6 +327,12 @@ export abstract class Node { return new ObjectLiteralExpression(names, values, range); } + static createOmittedExpression( + range: Range + ): OmittedExpression { + return new OmittedExpression(range); + } + static createParenthesizedExpression( expression: Expression, range: Range @@ -1101,7 +1108,7 @@ export abstract class LiteralExpression extends Expression { export class ArrayLiteralExpression extends LiteralExpression { constructor( /** Nested element expressions. */ - public elementExpressions: (Expression | null)[], + public elementExpressions: Expression[], /** Source range. */ range: Range ) { @@ -1347,6 +1354,16 @@ export class ObjectLiteralExpression extends LiteralExpression { } } +/** Represents an omitted expression, e.g. within an array literal. */ +export class OmittedExpression extends Expression { + constructor( + /** Source range. */ + range: Range + ) { + super(NodeKind.OMITTED, range); + } +} + /** Represents a parenthesized expression. */ export class ParenthesizedExpression extends Expression { constructor( diff --git a/src/compiler.ts b/src/compiler.ts index 7bcc8cf1a8..991b643920 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -8795,11 +8795,11 @@ export class Compiler extends DiagnosticEmitter { var expressions = expression.elementExpressions; var length = expressions.length; var values = new Array(length); - var isStatic = true; + var isStatic = !elementType.is(TypeFlags.HOST); var nativeElementType = elementType.toNativeType(); for (let i = 0; i < length; ++i) { let elementExpression = expressions[i]; - if (elementExpression) { + if (elementExpression.kind != NodeKind.OMITTED) { let expr = this.compileExpression(elementExpression, elementType, Constraints.CONV_IMPLICIT | Constraints.WILL_RETAIN ); @@ -8811,7 +8811,7 @@ export class Compiler extends DiagnosticEmitter { } values[i] = expr; } else { - values[i] = this.makeZero(elementType, expression); + values[i] = this.makeZero(elementType, elementExpression); } } @@ -8966,10 +8966,10 @@ export class Compiler extends DiagnosticEmitter { var length = expressions.length; var values = new Array(length); var nativeElementType = elementType.toNativeType(); - var isStatic = true; + var isStatic = !elementType.is(TypeFlags.HOST); for (let i = 0; i < length; ++i) { let elementExpression = expressions[i]; - if (elementExpression) { + if (elementExpression.kind != NodeKind.OMITTED) { let expr = this.compileExpression(elementExpression, elementType, Constraints.CONV_IMPLICIT | Constraints.WILL_RETAIN ); @@ -8981,7 +8981,7 @@ export class Compiler extends DiagnosticEmitter { } values[i] = expr; } else { - values[i] = this.makeZero(elementType, expression); + values[i] = this.makeZero(elementType, elementExpression); } } @@ -10670,7 +10670,7 @@ export class Compiler extends DiagnosticEmitter { this.error( DiagnosticCode.Not_implemented_0, reportNode.range, - "ref.null" + "ref.null" ); return module.unreachable(); } diff --git a/src/parser.ts b/src/parser.ts index a6f1459bd1..0673e0dd7b 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -3668,11 +3668,11 @@ export class Parser extends DiagnosticEmitter { } // ArrayLiteralExpression case Token.OPENBRACKET: { - let elementExpressions = new Array(); + let elementExpressions = new Array(); while (!tn.skip(Token.CLOSEBRACKET)) { let expr: Expression | null; if (tn.peek() == Token.COMMA) { - expr = null; // omitted + expr = Node.createOmittedExpression(tn.range(tn.pos)); } else { expr = this.parseExpression(tn, Precedence.COMMA + 1); if (!expr) return null;