mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-09 20:51:43 -06:00
Put semantically relevant tokens in the tree.
This commit is contained in:
parent
af324d1226
commit
f8a4fb0a15
@ -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 && (<ConstructorDeclaration>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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -608,8 +608,12 @@ module ts {
|
||||
return node.kind === SyntaxKind.ImportDeclaration && (<ImportDeclaration>node).moduleReference.kind !== SyntaxKind.ExternalModuleReference;
|
||||
}
|
||||
|
||||
export function hasDotDotDotToken(node: Node) {
|
||||
return node && node.kind === SyntaxKind.Parameter && (<ParameterDeclaration>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 = <ParameterDeclaration>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) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user