diff --git a/src/ast.ts b/src/ast.ts index e6ff46924e..81b07e2b9d 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -8,7 +8,8 @@ import { PATH_DELIMITER, STATIC_DELIMITER, INSTANCE_DELIMITER, - LIBRARY_PREFIX + LIBRARY_PREFIX, + Symbols } from "./common"; import { @@ -144,6 +145,8 @@ export abstract class Node { parent: Node | null = null; /** Common flags indicating specific traits. */ flags: CommonFlags = CommonFlags.NONE; + /** Underlying text. */ + get text(): string { return this.range.source.text.substring(this.range.start, this.range.end); } /** Tests if this node has the specified flag or flags. */ is(flag: CommonFlags): bool { return (this.flags & flag) == flag; } @@ -172,7 +175,7 @@ export abstract class Node { range: Range ): TypeNode { return Node.createType( - Node.createIdentifierExpression("", range), + Node.createIdentifierExpression(Symbols.OMITTED, range), null, false, range @@ -241,26 +244,24 @@ export abstract class Node { } static createComment( - text: string, kind: CommentKind, range: Range ): CommentNode { var node = new CommentNode(); node.range = range; node.commentKind = kind; - node.text = text; return node; } // expressions static createIdentifierExpression( - name: string, + symbol: symbol, range: Range ): IdentifierExpression { var expr = new IdentifierExpression(); expr.range = range; - expr.text = name; + expr.symbol = symbol; return expr; } @@ -269,7 +270,7 @@ export abstract class Node { ): IdentifierExpression { var expr = new IdentifierExpression(); expr.range = range; - expr.text = ""; + expr.symbol = Symbols.EMPTY; return expr; } @@ -1236,8 +1237,6 @@ export class CommentNode extends Node { /** Comment kind. */ commentKind: CommentKind; - /** Comment text. */ - text: string; } // expressions @@ -1249,8 +1248,8 @@ export abstract class Expression extends Node { } export class IdentifierExpression extends Expression { kind = NodeKind.IDENTIFIER; - /** Textual name. */ - text: string; + /** Symbol. */ + symbol: symbol; } /** Indicates the kind of a literal. */ @@ -1340,7 +1339,7 @@ export class CommaExpression extends Expression { /** Represents a `constructor` expression. */ export class ConstructorExpression extends IdentifierExpression { kind = NodeKind.CONSTRUCTOR; - text = "constructor"; + symbol = Symbols.CONSTRUCTOR; } /** Represents an element access expression, e.g., array access. */ @@ -1395,7 +1394,7 @@ export class NewExpression extends CallExpression { /** Represents a `null` expression. */ export class NullExpression extends IdentifierExpression { kind = NodeKind.NULL; - text = "null"; + symbol = Symbols.NULL; } /** Represents an object literal expression. */ @@ -1459,25 +1458,25 @@ export class StringLiteralExpression extends LiteralExpression { /** Represents a `super` expression. */ export class SuperExpression extends IdentifierExpression { kind = NodeKind.SUPER; - text = "super"; + symbol = Symbols.SUPER; } /** Represents a `this` expression. */ export class ThisExpression extends IdentifierExpression { kind = NodeKind.THIS; - text = "this"; + symbol = Symbols.THIS; } /** Represents a `true` expression. */ export class TrueExpression extends IdentifierExpression { kind = NodeKind.TRUE; - text = "true"; + symbol = Symbols.TRUE; } /** Represents a `false` expression. */ export class FalseExpression extends IdentifierExpression { kind = NodeKind.FALSE; - text = "false"; + symbol = Symbols.FALSE; } /** Base class of all unary expressions. */ @@ -1544,7 +1543,7 @@ export class Source extends Node { /** Contained statements. */ statements: Statement[]; /** Full source text. */ - text: string; + private _text: string; /** Tokenizer reference. */ tokenizer: Tokenizer | null = null; /** Source map index. */ @@ -1563,13 +1562,15 @@ export class Source extends Node { this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath; this.statements = new Array(); this.range = new Range(this, 0, text.length); - this.text = text; + this._text = text; } /** Tests if this source is an entry file. */ get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; } /** Tests if this source is a stdlib file. */ get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; } + /** Full source text of this source. */ + get text(): string { return this._text; } } /** Base class of all declaration statements. */ diff --git a/src/common.ts b/src/common.ts index 925a88b850..8efa488957 100644 --- a/src/common.ts +++ b/src/common.ts @@ -100,3 +100,31 @@ export const LIBRARY_SUBST = "~lib"; export const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER; /** Prefix used to indicate a filespace element. */ export const FILESPACE_PREFIX = "file:"; + +/** Common symbols. */ +export namespace Symbols { + /** Symbol representing "void". */ + export const VOID = Symbol.for("void"); + /** Symbol representing "this". */ + export const THIS = Symbol.for("this"); + /** Symbol representing "super". */ + export const SUPER = Symbol.for("super"); + /** Symbol representing "true". */ + export const TRUE = Symbol.for("true"); + /** Symbol representing "false". */ + export const FALSE = Symbol.for("false"); + /** Symbol representing "null". */ + export const NULL = Symbol.for("null"); + /** Symbol representing "bool". */ + export const BOOL = Symbol.for("bool"); + /** Symbol representing "string". */ + export const STRING = Symbol.for("string"); + /** Symbol representing "Array". */ + export const ARRAY = Symbol.for("Array"); + /** Symbol representing "constructor". */ + export const CONSTRUCTOR = Symbol.for("constructor"); + /** Symbol representing "" (empty string). */ + export const EMPTY = Symbol.for(""); + /** Symbol representing omitted text. */ + export const OMITTED = Symbol(); +} diff --git a/src/compiler.ts b/src/compiler.ts index 3e020df2ce..fad3d4a485 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -332,21 +332,8 @@ export class Compiler extends DiagnosticEmitter { this.currentFunction = startFunctionInstance; // add a mutable heap base dummy - if (options.isWasm64) { - module.addGlobal( - "HEAP_BASE", - NativeType.I64, - true, - module.createI64(0, 0) - ); - } else { - module.addGlobal( - "HEAP_BASE", - NativeType.I32, - false, - module.createI32(0) - ); - } + if (options.isWasm64) module.addGlobal("HEAP_BASE", NativeType.I64, true, module.createI64(0)); + else module.addGlobal("HEAP_BASE", NativeType.I32, true, module.createI32(0)); // compile entry file(s) while traversing reachable elements var sources = program.sources; @@ -354,7 +341,7 @@ export class Compiler extends DiagnosticEmitter { if (sources[i].isEntry) this.compileSource(sources[i]); } - // compile the start function if not empty or called by main + // compile the start function if not empty / utilized by an explicit main function if (startFunctionBody.length || program.mainFunction !== null) { let signature = startFunctionInstance.signature; let funcRef = module.addFunction( @@ -377,17 +364,11 @@ export class Compiler extends DiagnosticEmitter { this.memoryOffset = memoryOffset; module.removeGlobal("HEAP_BASE"); if (options.isWasm64) { - module.addGlobal( - "HEAP_BASE", - NativeType.I64, - false, + module.addGlobal("HEAP_BASE", NativeType.I64, false, module.createI64(i64_low(memoryOffset), i64_high(memoryOffset)) ); } else { - module.addGlobal( - "HEAP_BASE", - NativeType.I32, - false, + module.addGlobal("HEAP_BASE", NativeType.I32, false, module.createI32(i64_low(memoryOffset)) ); } diff --git a/src/diagnostics.ts b/src/diagnostics.ts index c1b31bf7b6..683a5cd460 100644 --- a/src/diagnostics.ts +++ b/src/diagnostics.ts @@ -249,8 +249,8 @@ export abstract class DiagnosticEmitter { ): void { var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range); this.diagnostics.push(message); - // console.log(formatDiagnosticMessage(message, true, true) + "\n"); // temporary - // console.log(new Error("stack").stack); + console.log(formatDiagnosticMessage(message, true, true) + "\n"); // temporary + console.log(new Error("stack").stack); } /** Emits an informatory diagnostic message. */ diff --git a/src/extra/ast.ts b/src/extra/ast.ts index 79e99adc36..f8d993d7ff 100644 --- a/src/extra/ast.ts +++ b/src/extra/ast.ts @@ -92,7 +92,7 @@ import { } from "../util"; import { - CommonFlags + CommonFlags, Symbols } from "../common"; /** An AST builder. */ @@ -358,22 +358,28 @@ export class ASTBuilder { return; } var typeNode = node; - assert(typeNode.name.text.length); - this.visitIdentifierExpression(typeNode.name); - var typeArguments = typeNode.typeArguments; - if (typeArguments) { - let numTypeArguments = typeArguments.length; - let sb = this.sb; - if (numTypeArguments) { - sb.push("<"); - this.visitTypeNode(typeArguments[0]); - for (let i = 1; i < numTypeArguments; ++i) { - sb.push(", "); - this.visitTypeNode(typeArguments[i]); + if (typeNode.name.symbol == Symbols.ARRAY && typeNode.name.text.startsWith("[")) { + let typeArguments = assert(typeNode.typeArguments); + assert(typeArguments.length == 1); + this.visitTypeNode(typeArguments[0]); + this.sb.push("[]"); + } else { + this.visitIdentifierExpression(typeNode.name); + let typeArguments = typeNode.typeArguments; + if (typeArguments) { + let numTypeArguments = typeArguments.length; + let sb = this.sb; + if (numTypeArguments) { + sb.push("<"); + this.visitTypeNode(typeArguments[0]); + for (let i = 1; i < numTypeArguments; ++i) { + sb.push(", "); + this.visitTypeNode(typeArguments[i]); + } + sb.push(">"); } - sb.push(">"); + if (node.isNullable) sb.push(" | null"); } - if (node.isNullable) sb.push(" | null"); } } @@ -423,8 +429,7 @@ export class ASTBuilder { // expressions visitIdentifierExpression(node: IdentifierExpression): void { - if (node.is(CommonFlags.QUOTED)) this.visitStringLiteral(node.text); - else this.sb.push(node.text); + this.sb.push(node.text); } visitArrayLiteralExpression(node: ArrayLiteralExpression): void { diff --git a/src/parser.ts b/src/parser.ts index 24c0b0dd88..4553ffa126 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -6,7 +6,8 @@ import { CommonFlags, LIBRARY_PREFIX, - PATH_DELIMITER + PATH_DELIMITER, + Symbols } from "./common"; import { @@ -431,7 +432,7 @@ export class Parser extends DiagnosticEmitter { // 'void' } else if (token == Token.VOID) { type = Node.createType( - Node.createIdentifierExpression("void", tn.range()), [], false, tn.range(startPos, tn.pos) + Node.createIdentifierExpression(Symbols.VOID, tn.range()), [], false, tn.range(startPos, tn.pos) ); // 'this' @@ -443,19 +444,19 @@ export class Parser extends DiagnosticEmitter { // 'true' } else if (token == Token.TRUE || token == Token.FALSE) { type = Node.createType( - Node.createIdentifierExpression("bool", tn.range()), [], false, tn.range(startPos, tn.pos) + Node.createIdentifierExpression(Symbols.BOOL, tn.range()), [], false, tn.range(startPos, tn.pos) ); // StringLiteral } else if (token == Token.STRINGLITERAL) { tn.readString(); type = Node.createType( - Node.createIdentifierExpression("string", tn.range()), [], false, tn.range(startPos, tn.pos) + Node.createIdentifierExpression(Symbols.STRING, tn.range()), [], false, tn.range(startPos, tn.pos) ); // Identifier } else if (token == Token.IDENTIFIER) { - let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); let parameters = new Array(); let nullable = false; @@ -531,7 +532,7 @@ export class Parser extends DiagnosticEmitter { } } type = Node.createType( - Node.createIdentifierExpression("Array", bracketRange), + Node.createIdentifierExpression(Symbols.ARRAY, bracketRange), [ type ], nullable, tn.range(startPos, tn.pos) @@ -593,7 +594,7 @@ export class Parser extends DiagnosticEmitter { return null; } } else if (tn.skipIdentifier()) { - let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos)); + let name = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range(tn.tokenPos, tn.pos)); if (tn.skip(Token.QUESTION)) { isSignature = true; tn.discard(state); @@ -696,14 +697,14 @@ export class Parser extends DiagnosticEmitter { var startPos = tn.tokenPos; if (tn.skipIdentifier()) { - let name = tn.readIdentifier(); - let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos)); + let text = tn.readIdentifier(); + let expression: Expression = Node.createIdentifierExpression(Symbol.for(text), tn.range(tn.tokenPos, tn.pos)); while (tn.skip(Token.DOT)) { if (tn.skipIdentifier()) { - name = tn.readIdentifier(); + text = tn.readIdentifier(); expression = Node.createPropertyAccessExpression( expression, - Node.createIdentifierExpression(name, tn.range()), + Node.createIdentifierExpression(Symbol.for(text), tn.range()), tn.range(startPos, tn.pos) ); } else { @@ -768,7 +769,7 @@ export class Parser extends DiagnosticEmitter { ); return null; } - var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + var identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); var flags = parentFlags; if (tn.skip(Token.EXCLAMATION)) { flags |= CommonFlags.DEFINITE_ASSIGNMENT; @@ -836,7 +837,7 @@ export class Parser extends DiagnosticEmitter { ); return null; } - var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + var identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); if (tn.next() != Token.OPENBRACE) { this.error( DiagnosticCode._0_expected, @@ -886,7 +887,7 @@ export class Parser extends DiagnosticEmitter { ); return null; } - var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + var identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); var value: Expression | null = null; if (tn.skip(Token.EQUALS)) { value = this.parseExpression(tn, Precedence.COMMA + 1); @@ -970,7 +971,7 @@ export class Parser extends DiagnosticEmitter { if (tn.next() == Token.IDENTIFIER) { let identifier = Node.createIdentifierExpression( - tn.readIdentifier(), + Symbol.for(tn.readIdentifier()), tn.range() ); let extendsType: TypeNode | null = null; @@ -1155,7 +1156,7 @@ export class Parser extends DiagnosticEmitter { } if (tn.skipIdentifier()) { if (!isRest) startRange = tn.range(); - let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); let type: CommonTypeNode | null = null; if (isOptional = tn.skip(Token.QUESTION)) { if (isRest) { @@ -1234,7 +1235,7 @@ export class Parser extends DiagnosticEmitter { return null; } - var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + var name = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); var signatureStart: i32 = -1; var typeParameters: TypeParameterNode[] | null = null; @@ -1355,7 +1356,7 @@ export class Parser extends DiagnosticEmitter { if (tn.token == Token.FUNCTION) { if (tn.skipIdentifier()) { - name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + name = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } else { // empty name name = Node.createEmptyIdentifierExpression(tn.range(tn.pos)); } @@ -1478,11 +1479,7 @@ export class Parser extends DiagnosticEmitter { return null; } - var identifier = Node.createIdentifierExpression( - tn.readIdentifier(), - tn.range() - ); - + var identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); var typeParameters: TypeParameterNode[] | null; if (tn.skip(Token.LESSTHAN)) { typeParameters = this.parseTypeParameters(tn); @@ -1576,7 +1573,7 @@ export class Parser extends DiagnosticEmitter { var name: IdentifierExpression; if (tn.skipIdentifier()) { - name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + name = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } else { name = Node.createEmptyIdentifierExpression(tn.range(tn.pos)); } @@ -1835,7 +1832,7 @@ export class Parser extends DiagnosticEmitter { ); return null; } - name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + name = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } var typeParameters: TypeParameterNode[] | null = null; if (tn.skip(Token.LESSTHAN)) { @@ -2128,7 +2125,7 @@ export class Parser extends DiagnosticEmitter { // at 'namespace': Identifier '{' (Variable | Function)* '}' if (tn.skipIdentifier()) { - let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); if (tn.skip(Token.OPENBRACE)) { let members = new Array(); let ns = Node.createNamespaceDeclaration( @@ -2250,11 +2247,11 @@ export class Parser extends DiagnosticEmitter { // before: Identifier ('as' Identifier)? if (tn.skipIdentifier()) { - let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); let asIdentifier: IdentifierExpression | null = null; if (tn.skip(Token.AS)) { if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) { - asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + asIdentifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } else { this.error( DiagnosticCode.Identifier_expected, @@ -2312,7 +2309,7 @@ export class Parser extends DiagnosticEmitter { } else if (tn.skip(Token.ASTERISK)) { if (tn.skip(Token.AS)) { if (tn.skipIdentifier()) { - namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + namespaceName = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } else { this.error( DiagnosticCode.Identifier_expected, @@ -2370,11 +2367,11 @@ export class Parser extends DiagnosticEmitter { // before: Identifier ('as' Identifier)? if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) { - let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); let asIdentifier: IdentifierExpression | null = null; if (tn.skip(Token.AS)) { if (tn.skipIdentifier()) { - asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + asIdentifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } else { this.error( DiagnosticCode.Identifier_expected, @@ -2407,10 +2404,10 @@ export class Parser extends DiagnosticEmitter { // at 'export' 'import': Identifier ('=' Identifier)? ';'? if (tn.skipIdentifier()) { - let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let asIdentifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); if (tn.skip(Token.EQUALS)) { if (tn.skipIdentifier()) { - let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos)); tn.skip(Token.SEMICOLON); return ret; @@ -2572,7 +2569,7 @@ export class Parser extends DiagnosticEmitter { var identifier: IdentifierExpression | null = null; if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) { tn.next(IdentifierHandling.PREFER); - identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } var ret = Node.createBreakStatement(identifier, tn.range()); tn.skip(Token.SEMICOLON); @@ -2588,7 +2585,7 @@ export class Parser extends DiagnosticEmitter { var identifier: IdentifierExpression | null = null; if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) { tn.next(IdentifierHandling.PREFER); - identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + identifier = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } var ret = Node.createContinueStatement(identifier, tn.range()); tn.skip(Token.SEMICOLON); @@ -2914,7 +2911,7 @@ export class Parser extends DiagnosticEmitter { ); return null; } - catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + catchVariable = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); if (!tn.skip(Token.CLOSEPAREN)) { this.error( DiagnosticCode._0_expected, @@ -2986,7 +2983,7 @@ export class Parser extends DiagnosticEmitter { // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'? if (tn.skipIdentifier()) { - let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + let name = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); let typeParameters: TypeParameterNode[] | null = null; if (tn.skip(Token.LESSTHAN)) { typeParameters = this.parseTypeParameters(tn); @@ -3257,10 +3254,10 @@ export class Parser extends DiagnosticEmitter { ); return null; } - name = Node.createIdentifierExpression(tn.readString(), tn.range()); + name = Node.createIdentifierExpression(Symbol.for(tn.readString()), tn.range()); name.set(CommonFlags.QUOTED); } else { - name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + name = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } names.push(name); if (tn.skip(Token.COLON)) { @@ -3311,7 +3308,7 @@ export class Parser extends DiagnosticEmitter { ); } case Token.IDENTIFIER: { - return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos)); + return Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range(startPos, tn.pos)); } case Token.THIS: { return Node.createThisExpression(tn.range(startPos, tn.pos)); @@ -3544,7 +3541,7 @@ export class Parser extends DiagnosticEmitter { // PropertyAccessExpression if (token == Token.DOT) { if (tn.skipIdentifier()) { - next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range()); + next = Node.createIdentifierExpression(Symbol.for(tn.readIdentifier()), tn.range()); } else { next = this.parseExpression(tn, isRightAssociative(token) diff --git a/src/resolver.ts b/src/resolver.ts index d023d5b324..bcb7d14e9e 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -62,7 +62,8 @@ import { import { PATH_DELIMITER, INSTANCE_DELIMITER, - CommonFlags + CommonFlags, + Symbols } from "./common"; import { @@ -115,7 +116,7 @@ export class Resolver extends DiagnosticEmitter { // now dealing with TypeNode assert(node.kind == NodeKind.TYPE); var typeNode = node; - var simpleName = typeNode.name.text; + var simpleName = typeNode.name.symbol == Symbols.ARRAY ? "Array" : typeNode.name.text; // FIXME: monkey patched var globalName = simpleName; var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName; // TODO cache diff --git a/tests/parser/parameter-order.ts.fixture.ts b/tests/parser/parameter-order.ts.fixture.ts index 583bb3ced5..c6a0ef3c13 100644 --- a/tests/parser/parameter-order.ts.fixture.ts +++ b/tests/parser/parameter-order.ts.fixture.ts @@ -1,6 +1,6 @@ -function restValid(a: i32, ...b: Array): void {} +function restValid(a: i32, ...b: i32[]): void {} function optionalValid(a: i32, b?: i32): void {} -function restParameterMustBeLast(...a: Array, b: i32): void {} +function restParameterMustBeLast(...a: i32[], b: i32): void {} function optionalCannotPrecedeRequired(a?: i32, b: i32): void {} function optionalWithInitializerCannotPrecedeRequired(a?: i32 = 1, b: i32): void {} // ERROR 1014: "A rest parameter must be last in a parameter list." in parameter-order.ts:5:36