Skip to content

Commit f8a4fb0

Browse files
Put semantically relevant tokens in the tree.
1 parent af324d1 commit f8a4fb0

5 files changed

Lines changed: 20 additions & 19 deletions

File tree

src/compiler/checker.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,7 +1437,7 @@ module ts {
14371437
}
14381438

14391439
function buildParameterDisplay(p: Symbol, writer: SymbolWriter, enclosingDeclaration?: Node, flags?: TypeFormatFlags, typeStack?: Type[]) {
1440-
if (getDeclarationFlagsFromSymbol(p) & NodeFlags.Rest) {
1440+
if (hasDotDotDotToken(p.valueDeclaration)) {
14411441
writePunctuation(writer, SyntaxKind.DotDotDotToken);
14421442
}
14431443
appendSymbolNameOnly(p, writer);
@@ -1711,7 +1711,7 @@ module ts {
17111711
}
17121712

17131713
// Rest parameters default to type any[], other parameters default to type any
1714-
var type = declaration.flags & NodeFlags.Rest ? createArrayType(anyType) : anyType;
1714+
var type = hasDotDotDotToken(declaration) ? createArrayType(anyType) : anyType;
17151715
checkImplicitAny(type);
17161716
return type;
17171717

@@ -1733,9 +1733,9 @@ module ts {
17331733
var diagnostic = Diagnostics.Member_0_implicitly_has_an_1_type;
17341734
break;
17351735
case SyntaxKind.Parameter:
1736-
var diagnostic = declaration.flags & NodeFlags.Rest ?
1737-
Diagnostics.Rest_parameter_0_implicitly_has_an_any_type :
1738-
Diagnostics.Parameter_0_implicitly_has_an_1_type;
1736+
var diagnostic = hasDotDotDotToken(declaration)
1737+
? Diagnostics.Rest_parameter_0_implicitly_has_an_any_type
1738+
: Diagnostics.Parameter_0_implicitly_has_an_1_type;
17391739
break;
17401740
default:
17411741
var diagnostic = Diagnostics.Variable_0_implicitly_has_an_1_type;
@@ -2527,7 +2527,7 @@ module ts {
25272527
hasStringLiterals = true;
25282528
}
25292529
if (minArgumentCount < 0) {
2530-
if (param.initializer || param.flags & (NodeFlags.QuestionMark | NodeFlags.Rest)) {
2530+
if (param.initializer || param.flags & NodeFlags.QuestionMark || param.dotDotDotToken) {
25312531
minArgumentCount = i;
25322532
}
25332533
}
@@ -6673,7 +6673,7 @@ module ts {
66736673
!(parameterDeclaration.parent.kind === SyntaxKind.Constructor && (<ConstructorDeclaration>parameterDeclaration.parent).body)) {
66746674
error(parameterDeclaration, Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
66756675
}
6676-
if (parameterDeclaration.flags & NodeFlags.Rest) {
6676+
if (parameterDeclaration.dotDotDotToken) {
66776677
if (!isArrayType(getTypeOfSymbol(parameterDeclaration.symbol))) {
66786678
error(parameterDeclaration, Diagnostics.A_rest_parameter_must_be_of_an_array_type);
66796679
}

src/compiler/emitter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,7 @@ module ts {
12521252
function emitParameterDeclaration(node: ParameterDeclaration) {
12531253
increaseIndent();
12541254
emitJsDocComments(node);
1255-
if (node.flags & NodeFlags.Rest) {
1255+
if (node.dotDotDotToken) {
12561256
write("...");
12571257
}
12581258
writeTextOfNode(currentSourceFile, node.name);

src/compiler/parser.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,12 @@ module ts {
608608
return node.kind === SyntaxKind.ImportDeclaration && (<ImportDeclaration>node).moduleReference.kind !== SyntaxKind.ExternalModuleReference;
609609
}
610610

611+
export function hasDotDotDotToken(node: Node) {
612+
return node && node.kind === SyntaxKind.Parameter && (<ParameterDeclaration>node).dotDotDotToken !== undefined;
613+
}
614+
611615
export function hasRestParameters(s: SignatureDeclaration): boolean {
612-
return s.parameters.length > 0 && (s.parameters[s.parameters.length - 1].flags & NodeFlags.Rest) !== 0;
616+
return s.parameters.length > 0 && s.parameters[s.parameters.length - 1].dotDotDotToken !== undefined;
613617
}
614618

615619
export function isLiteralKind(kind: SyntaxKind): boolean {
@@ -1812,11 +1816,8 @@ module ts {
18121816

18131817
function parseParameter(): ParameterDeclaration {
18141818
var node = <ParameterDeclaration>createNode(SyntaxKind.Parameter);
1815-
var modifiers = parseModifiers();
1816-
setModifiers(node, modifiers);
1817-
if (parseOptional(SyntaxKind.DotDotDotToken)) {
1818-
node.flags |= NodeFlags.Rest;
1819-
}
1819+
setModifiers(node, parseModifiers());
1820+
node.dotDotDotToken = token === SyntaxKind.DotDotDotToken ? parseTokenNode() : undefined;
18201821

18211822
// SingleNameBinding[Yield,GeneratorParameter] : See 13.2.3
18221823
// [+GeneratorParameter]BindingIdentifier[Yield]Initializer[In]opt
@@ -4803,7 +4804,7 @@ module ts {
48034804
return grammarErrorOnNode(node, Diagnostics.An_index_signature_must_have_exactly_one_parameter);
48044805
}
48054806
}
4806-
else if (parameter.flags & NodeFlags.Rest) {
4807+
else if (parameter.dotDotDotToken) {
48074808
return grammarErrorOnNode(parameter.name, Diagnostics.An_index_signature_cannot_have_a_rest_parameter);
48084809
}
48094810
else if (parameter.flags & NodeFlags.Modifier) {
@@ -5160,7 +5161,7 @@ module ts {
51605161

51615162
for (var i = 0; i < parameterCount; i++) {
51625163
var parameter = parameters[i];
5163-
if (parameter.flags & NodeFlags.Rest) {
5164+
if (parameter.dotDotDotToken) {
51645165
if (i !== (parameterCount - 1)) {
51655166
return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
51665167
}
@@ -5298,7 +5299,7 @@ module ts {
52985299
}
52995300
else {
53005301
var parameter = accessor.parameters[0];
5301-
if (parameter.flags & NodeFlags.Rest) {
5302+
if (parameter.dotDotDotToken) {
53025303
return grammarErrorOnNode(accessor.name, Diagnostics.A_set_accessor_cannot_have_rest_parameter);
53035304
}
53045305
else if (parameter.flags & NodeFlags.Modifier) {

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,6 @@ module ts {
273273
Export = 0x00000001, // Declarations
274274
Ambient = 0x00000002, // Declarations
275275
QuestionMark = 0x00000004, // Parameter/Property/Method
276-
Rest = 0x00000008, // Parameter
277276
Public = 0x00000010, // Property/Method
278277
Private = 0x00000020, // Property/Method
279278
Protected = 0x00000040, // Property/Method
@@ -369,6 +368,7 @@ module ts {
369368
}
370369

371370
export interface ParameterDeclaration extends Declaration {
371+
dotDotDotToken?: Node;
372372
name: Identifier;
373373
type?: TypeNode | StringLiteralExpression;
374374
initializer?: Expression;

src/services/breakpoints.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ module ts.BreakpointResolver {
297297

298298
function canHaveSpanInParameterDeclaration(parameter: ParameterDeclaration): boolean {
299299
// Breakpoint is possible on parameter only if it has initializer, is a rest parameter, or has public or private modifier
300-
return !!parameter.initializer || !!(parameter.flags & NodeFlags.Rest) ||
300+
return !!parameter.initializer || parameter.dotDotDotToken !== undefined ||
301301
!!(parameter.flags & NodeFlags.Public) || !!(parameter.flags & NodeFlags.Private);
302302
}
303303

0 commit comments

Comments
 (0)