diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index c2159d920c0..50672e136a7 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1312,13 +1312,6 @@ module ts { return result; } - function createNodeArray(node: T): NodeArray { - var result = >[node]; - result.pos = node.pos; - result.end = node.end; - return result; - } - function parseBracketedList(kind: ParsingContext, parseElement: () => T, startToken: SyntaxKind, endToken: SyntaxKind): NodeArray { if (parseExpected(startToken)) { var result = parseDelimitedList(kind, parseElement); @@ -1471,7 +1464,11 @@ module ts { } function parseParameterType(): TypeNode { - return parseOptional(SyntaxKind.ColonToken) ? token === SyntaxKind.StringLiteral ? parseStringLiteral() : parseType() : undefined; + return parseOptional(SyntaxKind.ColonToken) + ? token === SyntaxKind.StringLiteral + ? parseStringLiteral() + : parseType() + : undefined; } function isStartOfParameter(): boolean { @@ -1485,7 +1482,7 @@ module ts { } } - function parseParameter(flags: NodeFlags = 0): ParameterDeclaration { + function parseParameter(): ParameterDeclaration { var node = createNode(SyntaxKind.Parameter); var modifiers = parseModifiers(); setModifiers(node, modifiers); @@ -1523,28 +1520,25 @@ module ts { } function parseSignature(kind: SyntaxKind, returnToken: SyntaxKind, returnTokenRequired: boolean): ParsedSignature { + var signature = {}; + fillSignature(kind, returnToken, returnTokenRequired, signature); + return signature; + } + + function fillSignature(kind: SyntaxKind, returnToken: SyntaxKind, returnTokenRequired: boolean, signature: ParsedSignature): void { if (kind === SyntaxKind.ConstructSignature) { parseExpected(SyntaxKind.NewKeyword); } - var typeParameters = parseTypeParameters(); - var parameters = parseParameterList(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken); - - var type: TypeNode; + signature.typeParameters = parseTypeParameters(); + signature.parameters = parseParameterList(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken); if (returnTokenRequired) { parseExpected(returnToken); - type = parseType(); + signature.type = parseType(); } - else if (parseOptional(returnToken)) - { - type = parseType(); + else if (parseOptional(returnToken)) { + signature.type = parseType(); } - - return { - typeParameters, - parameters, - type: type - }; } // Because we use this for index signatures as well, we sometimes use @@ -1555,18 +1549,14 @@ module ts { function parseSignatureMember(kind: SyntaxKind, returnToken: SyntaxKind): SignatureDeclaration { var node = createNode(kind); - var sig = parseSignature(kind, returnToken, /* returnTokenRequired */ false); - node.typeParameters = sig.typeParameters; - node.parameters = sig.parameters; - node.type = sig.type; + fillSignature(kind, returnToken, /* returnTokenRequired */ false, node); parseSemicolon(); return finishNode(node); } - function parseIndexSignatureMember(modifiers: ModifiersArray, pos?: number): SignatureDeclaration { - var node = createNode(SyntaxKind.IndexSignature, pos); + function parseIndexSignatureMember(fullStart: number, modifiers: ModifiersArray): SignatureDeclaration { + var node = createNode(SyntaxKind.IndexSignature, fullStart); setModifiers(node, modifiers); - node.parameters = parseParameterList(SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken); node.type = parseTypeAnnotation(); parseSemicolon(); @@ -1574,24 +1564,29 @@ module ts { } function parsePropertyOrMethod(): Declaration { - var node = createNode(SyntaxKind.Unknown); - node.name = parsePropertyName(); + var fullStart = scanner.getStartPos(); + var name = parsePropertyName(); + var flags = 0; if (parseOptional(SyntaxKind.QuestionToken)) { - node.flags |= NodeFlags.QuestionMark; + flags = NodeFlags.QuestionMark; } + if (token === SyntaxKind.OpenParenToken || token === SyntaxKind.LessThanToken) { - node.kind = SyntaxKind.Method; - var sig = parseSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false); - (node).typeParameters = sig.typeParameters; - (node).parameters = sig.parameters; - (node).type = sig.type; + var method = createNode(SyntaxKind.Method, fullStart); + method.name = name; + method.flags = flags; + fillSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false, method); + parseSemicolon(); + return finishNode(method); } else { - node.kind = SyntaxKind.Property; - (node).type = parseTypeAnnotation(); + var property = createNode(SyntaxKind.Property, fullStart); + property.name = name; + property.flags = flags; + property.type = parseTypeAnnotation(); + parseSemicolon(); + return finishNode(property); } - parseSemicolon(); - return finishNode(node); } function isStartOfTypeMember(): boolean { @@ -1612,7 +1607,7 @@ module ts { case SyntaxKind.LessThanToken: return parseSignatureMember(SyntaxKind.CallSignature, SyntaxKind.ColonToken); case SyntaxKind.OpenBracketToken: - return parseIndexSignatureMember(/*modifiers:*/ undefined); + return parseIndexSignatureMember(scanner.getStartPos(), /*modifiers:*/ undefined); case SyntaxKind.NewKeyword: if (lookAhead(() => nextToken() === SyntaxKind.OpenParenToken || token === SyntaxKind.LessThanToken)) { return parseSignatureMember(SyntaxKind.ConstructSignature, SyntaxKind.ColonToken); @@ -1629,14 +1624,21 @@ module ts { function parseTypeLiteral(): TypeLiteralNode { var node = createNode(SyntaxKind.TypeLiteral); + node.members = parseObjectType(); + return finishNode(node); + } + + function parseObjectType(): NodeArray { + var members: NodeArray; if (parseExpected(SyntaxKind.OpenBraceToken)) { - node.members = parseList(ParsingContext.TypeMembers, /*checkForStrictMode*/ false, parseTypeMember); + members = parseList(ParsingContext.TypeMembers, /*checkForStrictMode*/ false, parseTypeMember); parseExpected(SyntaxKind.CloseBraceToken); } else { - node.members = createMissingList(); + members = createMissingList(); } - return finishNode(node); + + return members; } function parseTupleType(): TupleTypeNode { @@ -1654,15 +1656,10 @@ module ts { } function parseFunctionType(typeKind: SyntaxKind): SignatureDeclaration { - var member = createNode(typeKind); - var sig = parseSignature(typeKind === SyntaxKind.FunctionType ? SyntaxKind.CallSignature : SyntaxKind.ConstructSignature, - SyntaxKind.EqualsGreaterThanToken, /* returnTokenRequired */ true); - - member.typeParameters = sig.typeParameters; - member.parameters = sig.parameters; - member.type = sig.type; - finishNode(member); - return member; + var node = createNode(typeKind); + fillSignature(typeKind === SyntaxKind.FunctionType ? SyntaxKind.CallSignature : SyntaxKind.ConstructSignature, + SyntaxKind.EqualsGreaterThanToken, /* returnTokenRequired */ true, node); + return finishNode(node); } function parseKeywordAndNoDot(): Node { @@ -2771,10 +2768,6 @@ module ts { return finishNode(node); } - function isIterationStatementStart(): boolean { - return token === SyntaxKind.WhileKeyword || token === SyntaxKind.DoKeyword || token === SyntaxKind.ForKeyword; - } - function isLabel(): boolean { return isIdentifier() && lookAhead(() => nextToken() === SyntaxKind.ColonToken); } @@ -2783,8 +2776,7 @@ module ts { var node = createNode(SyntaxKind.LabeledStatement); node.label = parseIdentifier(); parseExpected(SyntaxKind.ColonToken); - - node.statement = isLabel() ? parseLabeledStatement() : parseStatement(); + node.statement = parseStatement(); return finishNode(node); } @@ -2865,9 +2857,9 @@ module ts { case SyntaxKind.LetKeyword: case SyntaxKind.ConstKeyword: // const here should always be parsed as const declaration because of check in 'isStatement' - return parseVariableStatement(); + return parseVariableStatement(scanner.getStartPos(), /*modifiers:*/ undefined); case SyntaxKind.FunctionKeyword: - return parseFunctionDeclaration(); + return parseFunctionDeclaration(scanner.getStartPos(), /*modifiers:*/ undefined); case SyntaxKind.SemicolonToken: return parseEmptyStatement(); case SyntaxKind.IfKeyword: @@ -2924,10 +2916,7 @@ module ts { node.flags = flags; node.name = parseIdentifier(); node.type = parseTypeAnnotation(); - - // Issue any initializer-related errors on the equals token node.initializer = parseInitializer(/*inParameter*/ false, noIn); - return finishNode(node); } @@ -2935,11 +2924,9 @@ module ts { return parseDelimitedList(ParsingContext.VariableDeclarations, () => parseVariableDeclaration(flags, noIn)); } - function parseVariableStatement(pos?: number, flags?: NodeFlags): VariableStatement { - var node = createNode(SyntaxKind.VariableStatement, pos); - if (flags) { - node.flags = flags; - } + function parseVariableStatement(fullStart: number, modifiers: ModifiersArray): VariableStatement { + var node = createNode(SyntaxKind.VariableStatement, fullStart); + setModifiers(node, modifiers); if (token === SyntaxKind.LetKeyword) { node.flags |= NodeFlags.Let; @@ -2957,15 +2944,12 @@ module ts { return finishNode(node); } - function parseFunctionDeclaration(pos?: number, flags?: NodeFlags): FunctionLikeDeclaration { - var node = createNode(SyntaxKind.FunctionDeclaration, pos); - if (flags) node.flags = flags; + function parseFunctionDeclaration(fullStart: number, modifiers: ModifiersArray): FunctionLikeDeclaration { + var node = createNode(SyntaxKind.FunctionDeclaration, fullStart); + setModifiers(node, modifiers); parseExpected(SyntaxKind.FunctionKeyword); node.name = parseIdentifier(); - var sig = parseSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false); - node.typeParameters = sig.typeParameters; - node.parameters = sig.parameters; - node.type = sig.type; + fillSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false, node); node.body = parseFunctionBlockOrSemicolon(); return finishNode(node); } @@ -2973,18 +2957,13 @@ module ts { function parseConstructorDeclaration(pos: number, modifiers: ModifiersArray): ConstructorDeclaration { var node = createNode(SyntaxKind.Constructor, pos); setModifiers(node, modifiers); - parseExpected(SyntaxKind.ConstructorKeyword); - var sig = parseSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false); - node.typeParameters = sig.typeParameters; - node.parameters = sig.parameters; - node.type = sig.type; + fillSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false, node); node.body = parseFunctionBlockOrSemicolon(); - return finishNode(node); } - function parsePropertyMemberDeclaration(pos: number, modifiers: ModifiersArray): Declaration { + function parsePropertyMemberDeclaration(fullStart: number, modifiers: ModifiersArray): Declaration { var name = parsePropertyName(); var flags = modifiers ? modifiers.flags : 0; if (parseOptional(SyntaxKind.QuestionToken)) { @@ -2994,47 +2973,35 @@ module ts { } if (token === SyntaxKind.OpenParenToken || token === SyntaxKind.LessThanToken) { - var method = createNode(SyntaxKind.Method, pos); + var method = createNode(SyntaxKind.Method, fullStart); setModifiers(method, modifiers); - if (flags) { method.flags = flags; } method.name = name; - var sig = parseSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false); - method.typeParameters = sig.typeParameters; - method.parameters = sig.parameters; - method.type = sig.type; + fillSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false, method); method.body = parseFunctionBlockOrSemicolon(); - return finishNode(method); } else { - var property = createNode(SyntaxKind.Property, pos); + var property = createNode(SyntaxKind.Property, fullStart); setModifiers(property, modifiers); - if (flags) { property.flags = flags; } property.name = name; property.type = parseTypeAnnotation(); - property.initializer = parseInitializer(/*inParameter*/ false); parseSemicolon(); - return finishNode(property); } } - function parseMemberAccessorDeclaration(kind: SyntaxKind, pos: number, modifiers: ModifiersArray): MethodDeclaration { - var node = createNode(kind, pos); + function parseMemberAccessorDeclaration(kind: SyntaxKind, fullStart: number, modifiers: ModifiersArray): MethodDeclaration { + var node = createNode(kind, fullStart); setModifiers(node, modifiers); - node.name = parsePropertyName(); - var sig = parseSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false); - node.typeParameters = sig.typeParameters; - node.parameters = sig.parameters; - node.type = sig.type; + fillSignature(SyntaxKind.CallSignature, SyntaxKind.ColonToken, /* returnTokenRequired */ false, node); node.body = parseFunctionBlockOrSemicolon(); return finishNode(node); } @@ -3094,15 +3061,17 @@ module ts { var modifiers: ModifiersArray; while (true) { var modifierStart = scanner.getTokenPos(); - var modifierToken = token; + var modifierKind = token; - if (!parseAnyContextualModifier()) break; + if (!parseAnyContextualModifier()) { + break; + } if (!modifiers) { modifiers = []; } - flags |= modifierToFlag(modifierToken); - modifiers.push(finishNode(createNode(modifierToken, modifierStart))); + flags |= modifierToFlag(modifierKind); + modifiers.push(finishNode(createNode(modifierKind, modifierStart))); } if (modifiers) { modifiers.flags = flags; @@ -3111,36 +3080,36 @@ module ts { } function parseClassMemberDeclaration(): Declaration { - var pos = getNodePos(); + var fullStart = getNodePos(); var modifiers = parseModifiers(); if (parseContextualModifier(SyntaxKind.GetKeyword)) { - return parseMemberAccessorDeclaration(SyntaxKind.GetAccessor, pos, modifiers); + return parseMemberAccessorDeclaration(SyntaxKind.GetAccessor, fullStart, modifiers); } if (parseContextualModifier(SyntaxKind.SetKeyword)) { - return parseMemberAccessorDeclaration(SyntaxKind.SetAccessor, pos, modifiers); + return parseMemberAccessorDeclaration(SyntaxKind.SetAccessor, fullStart, modifiers); } if (token === SyntaxKind.ConstructorKeyword) { - return parseConstructorDeclaration(pos, modifiers); + return parseConstructorDeclaration(fullStart, modifiers); } if (token >= SyntaxKind.Identifier || token === SyntaxKind.StringLiteral || token === SyntaxKind.NumericLiteral) { - return parsePropertyMemberDeclaration(pos, modifiers); + return parsePropertyMemberDeclaration(fullStart, modifiers); } if (token === SyntaxKind.OpenBracketToken) { - return parseIndexSignatureMember(modifiers, pos); + return parseIndexSignatureMember(fullStart, modifiers); } // 'isClassMemberStart' should have hinted not to attempt parsing. Debug.fail("Should not have attempted to parse class member declaration."); } - function parseClassDeclaration(pos: number, flags: NodeFlags): ClassDeclaration { - var node = createNode(SyntaxKind.ClassDeclaration, pos); - node.flags = flags; + function parseClassDeclaration(fullStart: number, modifiers: ModifiersArray): ClassDeclaration { + var node = createNode(SyntaxKind.ClassDeclaration, fullStart); + setModifiers(node, modifiers); parseExpected(SyntaxKind.ClassKeyword); node.name = parseIdentifier(); node.typeParameters = parseTypeParameters(); - // TODO(jfreeman): Parse arbitrary sequence of heritage clauses and error for order and duplicates + // TODO(jfreeman): Parse arbitrary sequence of heritage clauses and error for order and duplicates node.baseType = parseOptional(SyntaxKind.ExtendsKeyword) ? parseTypeReference() : undefined; if (parseOptional(SyntaxKind.ImplementsKeyword)) { node.implementedTypes = parseDelimitedList(ParsingContext.BaseTypeReferences, parseTypeReference); @@ -3155,9 +3124,9 @@ module ts { return finishNode(node); } - function parseInterfaceDeclaration(pos: number, flags: NodeFlags): InterfaceDeclaration { - var node = createNode(SyntaxKind.InterfaceDeclaration, pos); - node.flags = flags; + function parseInterfaceDeclaration(fullStart: number, modifiers: ModifiersArray): InterfaceDeclaration { + var node = createNode(SyntaxKind.InterfaceDeclaration, fullStart); + setModifiers(node, modifiers); parseExpected(SyntaxKind.InterfaceKeyword); node.name = parseIdentifier(); node.typeParameters = parseTypeParameters(); @@ -3165,13 +3134,13 @@ module ts { if (parseOptional(SyntaxKind.ExtendsKeyword)) { node.baseTypes = parseDelimitedList(ParsingContext.BaseTypeReferences, parseTypeReference); } - node.members = parseTypeLiteral().members; + node.members = parseObjectType(); return finishNode(node); } - function parseTypeAliasDeclaration(pos: number, flags: NodeFlags): TypeAliasDeclaration { - var node = createNode(SyntaxKind.TypeAliasDeclaration, pos); - node.flags = flags; + function parseTypeAliasDeclaration(fullStart: number, modifiers: ModifiersArray): TypeAliasDeclaration { + var node = createNode(SyntaxKind.TypeAliasDeclaration, fullStart); + setModifiers(node, modifiers); parseExpected(SyntaxKind.TypeKeyword); node.name = parseIdentifier(); parseExpected(SyntaxKind.EqualsToken); @@ -3180,23 +3149,21 @@ module ts { return finishNode(node); } - function parseAndCheckEnumDeclaration(pos: number, flags: NodeFlags): EnumDeclaration { - var enumIsConst = flags & NodeFlags.Const; + // In an ambient declaration, the grammar only allows integer literals as initializers. + // In a non-ambient declaration, the grammar allows uninitialized members only in a + // ConstantEnumMemberSection, which starts at the beginning of an enum declaration + // or any time an integer literal initializer is encountered. + function parseEnumMember(): EnumMember { + var node = createNode(SyntaxKind.EnumMember, scanner.getStartPos()); + node.name = parsePropertyName(); + node.initializer = parseInitializer(/*inParameter*/ false); + return finishNode(node); + } - // In an ambient declaration, the grammar only allows integer literals as initializers. - // In a non-ambient declaration, the grammar allows uninitialized members only in a - // ConstantEnumMemberSection, which starts at the beginning of an enum declaration - // or any time an integer literal initializer is encountered. - function parseEnumMember(): EnumMember { - var node = createNode(SyntaxKind.EnumMember); - node.name = parsePropertyName(); - node.initializer = parseInitializer(/*inParameter*/ false); - return finishNode(node); - } - - var node = createNode(SyntaxKind.EnumDeclaration, pos); + function parseAndCheckEnumDeclaration(fullStart: number, flags: NodeFlags): EnumDeclaration { + var node = createNode(SyntaxKind.EnumDeclaration, fullStart); node.flags = flags; - if (enumIsConst) { + if (flags & NodeFlags.Const) { parseExpected(SyntaxKind.ConstKeyword); } parseExpected(SyntaxKind.EnumKeyword); @@ -3212,7 +3179,7 @@ module ts { } function parseModuleBody(): Block { - var node = createNode(SyntaxKind.ModuleBlock); + var node = createNode(SyntaxKind.ModuleBlock, scanner.getStartPos()); if (parseExpected(SyntaxKind.OpenBraceToken)) { node.statements = parseList(ParsingContext.ModuleElements, /*checkForStrictMode*/ false, parseModuleElement); parseExpected(SyntaxKind.CloseBraceToken); @@ -3223,35 +3190,34 @@ module ts { return finishNode(node); } - function parseInternalModuleTail(pos: number, flags: NodeFlags): ModuleDeclaration { - var node = createNode(SyntaxKind.ModuleDeclaration, pos); + function parseInternalModuleTail(fullStart: number, flags: NodeFlags): ModuleDeclaration { + var node = createNode(SyntaxKind.ModuleDeclaration, fullStart); node.flags = flags; node.name = parseIdentifier(); - if (parseOptional(SyntaxKind.DotToken)) { - node.body = parseInternalModuleTail(getNodePos(), NodeFlags.Export); - } - else { - node.body = parseModuleBody(); - } + node.body = parseOptional(SyntaxKind.DotToken) + ? parseInternalModuleTail(getNodePos(), NodeFlags.Export) + : parseModuleBody(); return finishNode(node); } - function parseAmbientExternalModuleDeclaration(pos: number, flags: NodeFlags): ModuleDeclaration { - var node = createNode(SyntaxKind.ModuleDeclaration, pos); + function parseAmbientExternalModuleDeclaration(fullStart: number, flags: NodeFlags): ModuleDeclaration { + var node = createNode(SyntaxKind.ModuleDeclaration, fullStart); node.flags = flags; node.name = parseStringLiteral(); node.body = parseModuleBody(); return finishNode(node); } - function parseModuleDeclaration(pos: number, flags: NodeFlags): ModuleDeclaration { + function parseModuleDeclaration(fullStart: number, flags: NodeFlags): ModuleDeclaration { parseExpected(SyntaxKind.ModuleKeyword); - return token === SyntaxKind.StringLiteral ? parseAmbientExternalModuleDeclaration(pos, flags) : parseInternalModuleTail(pos, flags); + return token === SyntaxKind.StringLiteral + ? parseAmbientExternalModuleDeclaration(fullStart, flags) + : parseInternalModuleTail(fullStart, flags); } - function parseImportDeclaration(pos: number, flags: NodeFlags): ImportDeclaration { - var node = createNode(SyntaxKind.ImportDeclaration, pos); - node.flags = flags; + function parseImportDeclaration(fullStart: number, modifiers: ModifiersArray): ImportDeclaration { + var node = createNode(SyntaxKind.ImportDeclaration, fullStart); + setModifiers(node, modifiers); parseExpected(SyntaxKind.ImportKeyword); node.name = parseIdentifier(); parseExpected(SyntaxKind.EqualsToken); @@ -3267,10 +3233,9 @@ module ts { return finishNode(node); } - function parseExportAssignmentTail(pos: number, modifiers: ModifiersArray): ExportAssignment { - var node = createNode(SyntaxKind.ExportAssignment, pos); + function parseExportAssignmentTail(fullStart: number, modifiers: ModifiersArray): ExportAssignment { + var node = createNode(SyntaxKind.ExportAssignment, fullStart); setModifiers(node, modifiers); - node.exportName = parseIdentifier(); parseSemicolon(); return finishNode(node); @@ -3307,12 +3272,12 @@ module ts { } function parseDeclaration(): Statement { - var pos = getNodePos(); + var fullStart = getNodePos(); var modifiers = parseModifiers(); if (token === SyntaxKind.ExportKeyword) { nextToken(); if (parseOptional(SyntaxKind.EqualsToken)) { - return parseExportAssignmentTail(pos, modifiers); + return parseExportAssignmentTail(fullStart, modifiers); } } @@ -3321,37 +3286,37 @@ module ts { switch (token) { case SyntaxKind.VarKeyword: case SyntaxKind.LetKeyword: - result = parseVariableStatement(pos, flags); + result = parseVariableStatement(fullStart, modifiers); break; case SyntaxKind.ConstKeyword: var isConstEnum = lookAhead(() => nextToken() === SyntaxKind.EnumKeyword); if (isConstEnum) { - result = parseAndCheckEnumDeclaration(pos, flags | NodeFlags.Const); + result = parseAndCheckEnumDeclaration(fullStart, flags | NodeFlags.Const); } else { - result = parseVariableStatement(pos, flags); + result = parseVariableStatement(fullStart, modifiers); } break; case SyntaxKind.FunctionKeyword: - result = parseFunctionDeclaration(pos, flags); + result = parseFunctionDeclaration(fullStart, modifiers); break; case SyntaxKind.ClassKeyword: - result = parseClassDeclaration(pos, flags); + result = parseClassDeclaration(fullStart, modifiers); break; case SyntaxKind.InterfaceKeyword: - result = parseInterfaceDeclaration(pos, flags); + result = parseInterfaceDeclaration(fullStart, modifiers); break; case SyntaxKind.TypeKeyword: - result = parseTypeAliasDeclaration(pos, flags); + result = parseTypeAliasDeclaration(fullStart, modifiers); break; case SyntaxKind.EnumKeyword: - result = parseAndCheckEnumDeclaration(pos, flags); + result = parseAndCheckEnumDeclaration(fullStart, flags); break; case SyntaxKind.ModuleKeyword: - result = parseModuleDeclaration(pos, flags); + result = parseModuleDeclaration(fullStart, flags); break; case SyntaxKind.ImportKeyword: - result = parseImportDeclaration(pos, flags); + result = parseImportDeclaration(fullStart, modifiers); break; default: error(Diagnostics.Declaration_expected);