diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a663b038844..2f765e556cb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1437,7 +1437,7 @@ module ts { } function buildParameterDisplay(p: Symbol, writer: SymbolWriter, enclosingDeclaration?: Node, flags?: TypeFormatFlags, typeStack?: Type[]) { - if (getDeclarationFlagsFromSymbol(p) & NodeFlags.Rest) { + if (hasDotDotDotToken(p.valueDeclaration)) { writePunctuation(writer, SyntaxKind.DotDotDotToken); } appendSymbolNameOnly(p, writer); @@ -1711,7 +1711,7 @@ module ts { } // Rest parameters default to type any[], other parameters default to type any - var type = declaration.flags & NodeFlags.Rest ? createArrayType(anyType) : anyType; + var type = hasDotDotDotToken(declaration) ? createArrayType(anyType) : anyType; checkImplicitAny(type); return type; @@ -1733,9 +1733,9 @@ module ts { var diagnostic = Diagnostics.Member_0_implicitly_has_an_1_type; break; case SyntaxKind.Parameter: - var diagnostic = declaration.flags & NodeFlags.Rest ? - Diagnostics.Rest_parameter_0_implicitly_has_an_any_type : - Diagnostics.Parameter_0_implicitly_has_an_1_type; + var diagnostic = hasDotDotDotToken(declaration) + ? Diagnostics.Rest_parameter_0_implicitly_has_an_any_type + : Diagnostics.Parameter_0_implicitly_has_an_1_type; break; default: var diagnostic = Diagnostics.Variable_0_implicitly_has_an_1_type; @@ -2527,7 +2527,7 @@ module ts { hasStringLiterals = true; } if (minArgumentCount < 0) { - if (param.initializer || param.flags & (NodeFlags.QuestionMark | NodeFlags.Rest)) { + if (param.initializer || param.flags & NodeFlags.QuestionMark || param.dotDotDotToken) { minArgumentCount = i; } } @@ -6673,7 +6673,7 @@ module ts { !(parameterDeclaration.parent.kind === SyntaxKind.Constructor && (parameterDeclaration.parent).body)) { error(parameterDeclaration, Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation); } - if (parameterDeclaration.flags & NodeFlags.Rest) { + if (parameterDeclaration.dotDotDotToken) { if (!isArrayType(getTypeOfSymbol(parameterDeclaration.symbol))) { error(parameterDeclaration, Diagnostics.A_rest_parameter_must_be_of_an_array_type); } diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index fab0433890a..75454aa9807 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1252,7 +1252,7 @@ module ts { function emitParameterDeclaration(node: ParameterDeclaration) { increaseIndent(); emitJsDocComments(node); - if (node.flags & NodeFlags.Rest) { + if (node.dotDotDotToken) { write("..."); } writeTextOfNode(currentSourceFile, node.name); diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 687eab878f3..733c28d267e 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -608,8 +608,12 @@ module ts { return node.kind === SyntaxKind.ImportDeclaration && (node).moduleReference.kind !== SyntaxKind.ExternalModuleReference; } + export function hasDotDotDotToken(node: Node) { + return node && node.kind === SyntaxKind.Parameter && (node).dotDotDotToken !== undefined; + } + export function hasRestParameters(s: SignatureDeclaration): boolean { - return s.parameters.length > 0 && (s.parameters[s.parameters.length - 1].flags & NodeFlags.Rest) !== 0; + return s.parameters.length > 0 && s.parameters[s.parameters.length - 1].dotDotDotToken !== undefined; } export function isLiteralKind(kind: SyntaxKind): boolean { @@ -1812,11 +1816,8 @@ module ts { function parseParameter(): ParameterDeclaration { var node = createNode(SyntaxKind.Parameter); - var modifiers = parseModifiers(); - setModifiers(node, modifiers); - if (parseOptional(SyntaxKind.DotDotDotToken)) { - node.flags |= NodeFlags.Rest; - } + setModifiers(node, parseModifiers()); + node.dotDotDotToken = token === SyntaxKind.DotDotDotToken ? parseTokenNode() : undefined; // SingleNameBinding[Yield,GeneratorParameter] : See 13.2.3 // [+GeneratorParameter]BindingIdentifier[Yield]Initializer[In]opt @@ -4803,7 +4804,7 @@ module ts { return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_exactly_one_parameter); } } - else if (parameter.flags & NodeFlags.Rest) { + else if (parameter.dotDotDotToken) { return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_cannot_have_a_rest_parameter); } else if (parameter.flags & NodeFlags.Modifier) { @@ -5160,7 +5161,7 @@ module ts { for (var i = 0; i < parameterCount; i++) { var parameter = parameters[i]; - if (parameter.flags & NodeFlags.Rest) { + if (parameter.dotDotDotToken) { if (i !== (parameterCount - 1)) { return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list); } @@ -5298,7 +5299,7 @@ module ts { } else { var parameter = accessor.parameters[0]; - if (parameter.flags & NodeFlags.Rest) { + if (parameter.dotDotDotToken) { return grammarErrorOnNode(accessor.name, Diagnostics.A_set_accessor_cannot_have_rest_parameter); } else if (parameter.flags & NodeFlags.Modifier) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 277e2cce5ff..fba331fdd3c 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -273,7 +273,6 @@ module ts { Export = 0x00000001, // Declarations Ambient = 0x00000002, // Declarations QuestionMark = 0x00000004, // Parameter/Property/Method - Rest = 0x00000008, // Parameter Public = 0x00000010, // Property/Method Private = 0x00000020, // Property/Method Protected = 0x00000040, // Property/Method @@ -369,6 +368,7 @@ module ts { } export interface ParameterDeclaration extends Declaration { + dotDotDotToken?: Node; name: Identifier; type?: TypeNode | StringLiteralExpression; initializer?: Expression; diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index 6cf775487fa..eb9c88088aa 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -297,7 +297,7 @@ module ts.BreakpointResolver { function canHaveSpanInParameterDeclaration(parameter: ParameterDeclaration): boolean { // Breakpoint is possible on parameter only if it has initializer, is a rest parameter, or has public or private modifier - return !!parameter.initializer || !!(parameter.flags & NodeFlags.Rest) || + return !!parameter.initializer || parameter.dotDotDotToken !== undefined || !!(parameter.flags & NodeFlags.Public) || !!(parameter.flags & NodeFlags.Private); }