From b91dfc2cfcc0f69811402d98531d0d951a535bf3 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Thu, 25 Sep 2014 14:57:29 -0700 Subject: [PATCH] Provide helpers for creating symbol display parts. --- src/compiler/checker.ts | 70 +++++++++++++++++++++++------------ src/services/services.ts | 38 +++++++++---------- src/services/signatureHelp.ts | 29 +++++++-------- 3 files changed, 79 insertions(+), 58 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1ec86615949..cf35c1c02f5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -925,38 +925,17 @@ module ts { var displayPartWriters: DisplayPartsSymbolWriter[] = []; var stringWriters: StringSymbolWriter[] = []; - function displayPartKind(symbol: Symbol): SymbolDisplayPartKind { - var flags = symbol.flags; - - if (flags & SymbolFlags.Variable) { - return symbol.declarations && symbol.declarations.length > 0 && symbol.declarations[0].kind === SyntaxKind.Parameter - ? SymbolDisplayPartKind.parameterName - : SymbolDisplayPartKind.localName; - } - else if (flags & SymbolFlags.Property) { return SymbolDisplayPartKind.propertyName; } - else if (flags & SymbolFlags.EnumMember) { return SymbolDisplayPartKind.enumMemberName; } - else if (flags & SymbolFlags.Function) { return SymbolDisplayPartKind.functionName; } - else if (flags & SymbolFlags.Class) { return SymbolDisplayPartKind.className; } - else if (flags & SymbolFlags.Interface) { return SymbolDisplayPartKind.interfaceName; } - else if (flags & SymbolFlags.Enum) { return SymbolDisplayPartKind.enumName; } - else if (flags & SymbolFlags.Module) { return SymbolDisplayPartKind.moduleName; } - else if (flags & SymbolFlags.Method) { return SymbolDisplayPartKind.methodName; } - else if (flags & SymbolFlags.TypeParameter) { return SymbolDisplayPartKind.typeParameterName; } - - return SymbolDisplayPartKind.text; - } - function getDisplayPartWriter(): DisplayPartsSymbolWriter { if (displayPartWriters.length == 0) { var displayParts: SymbolDisplayPart[] = []; return { displayParts: () => displayParts, writeKind: (text, kind) => displayParts.push(new SymbolDisplayPart(text, kind, undefined)), - writeSymbol: (text, symbol) => displayParts.push(new SymbolDisplayPart(text, displayPartKind(symbol), symbol)), + writeSymbol: (text, symbol) => displayParts.push(symbolPart(text, symbol)), // Completely ignore indentation for display part writers. And map newlines to // a single space. - writeLine: () => displayParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)), + writeLine: () => displayParts.push(spacePart()), increaseIndent: () => { }, decreaseIndent: () => { }, clear: () => displayParts = [], @@ -7693,4 +7672,49 @@ module ts { return checker; } + + export function spacePart() { + return new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined); + } + + export function keywordPart(kind: SyntaxKind) { + return new SymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.keyword, undefined); + } + + export function punctuationPart(kind: SyntaxKind) { + return new SymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.punctuation, undefined); + } + + export function operatorPart(kind: SyntaxKind) { + return new SymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.operator, undefined); + } + + export function textPart(text: string) { + return new SymbolDisplayPart(text, SymbolDisplayPartKind.text, undefined); + } + + export function symbolPart(text: string, symbol: Symbol) { + return new SymbolDisplayPart(text, displayPartKind(symbol), symbol) + } + + function displayPartKind(symbol: Symbol): SymbolDisplayPartKind { + var flags = symbol.flags; + + if (flags & SymbolFlags.Variable) { + return symbol.declarations && symbol.declarations.length > 0 && symbol.declarations[0].kind === SyntaxKind.Parameter + ? SymbolDisplayPartKind.parameterName + : SymbolDisplayPartKind.localName; + } + else if (flags & SymbolFlags.Property) { return SymbolDisplayPartKind.propertyName; } + else if (flags & SymbolFlags.EnumMember) { return SymbolDisplayPartKind.enumMemberName; } + else if (flags & SymbolFlags.Function) { return SymbolDisplayPartKind.functionName; } + else if (flags & SymbolFlags.Class) { return SymbolDisplayPartKind.className; } + else if (flags & SymbolFlags.Interface) { return SymbolDisplayPartKind.interfaceName; } + else if (flags & SymbolFlags.Enum) { return SymbolDisplayPartKind.enumName; } + else if (flags & SymbolFlags.Module) { return SymbolDisplayPartKind.moduleName; } + else if (flags & SymbolFlags.Method) { return SymbolDisplayPartKind.methodName; } + else if (flags & SymbolFlags.TypeParameter) { return SymbolDisplayPartKind.typeParameterName; } + + return SymbolDisplayPartKind.text; + } } diff --git a/src/services/services.ts b/src/services/services.ts index ee7e7f56e18..7d11d9ab32d 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2384,34 +2384,34 @@ module ts { var totalParts: SymbolDisplayPart[] = []; if (symbol.flags & SymbolFlags.Class) { - totalParts.push(new SymbolDisplayPart("class", SymbolDisplayPartKind.keyword, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(keywordPart(SyntaxKind.ClassKeyword)); + totalParts.push(spacePart()); totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile)); } else if (symbol.flags & SymbolFlags.Interface) { - totalParts.push(new SymbolDisplayPart("interface", SymbolDisplayPartKind.keyword, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(keywordPart(SyntaxKind.InterfaceKeyword)); + totalParts.push(spacePart()); totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile)); } else if (symbol.flags & SymbolFlags.Enum) { - totalParts.push(new SymbolDisplayPart("enum", SymbolDisplayPartKind.keyword, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(keywordPart(SyntaxKind.EnumKeyword)); + totalParts.push(spacePart()); totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile)); } else if (symbol.flags & SymbolFlags.Module) { - totalParts.push(new SymbolDisplayPart("module", SymbolDisplayPartKind.keyword, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(keywordPart(SyntaxKind.ModuleKeyword)); + totalParts.push(spacePart()); totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile)); } else if (symbol.flags & SymbolFlags.TypeParameter) { - totalParts.push(new SymbolDisplayPart("(", SymbolDisplayPartKind.punctuation, undefined)); + totalParts.push(punctuationPart(SyntaxKind.OpenParenToken)); totalParts.push(new SymbolDisplayPart("type parameter", SymbolDisplayPartKind.text, undefined)); - totalParts.push(new SymbolDisplayPart(")", SymbolDisplayPartKind.punctuation, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(punctuationPart(SyntaxKind.CloseParenToken)); + totalParts.push(spacePart()); totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol)); } else { - totalParts.push(new SymbolDisplayPart("(", SymbolDisplayPartKind.punctuation, undefined)); + totalParts.push(punctuationPart(SyntaxKind.OpenParenToken)); var text: string; if (symbol.flags & SymbolFlags.Property) { text = "property" } @@ -2425,8 +2425,8 @@ module ts { } totalParts.push(new SymbolDisplayPart(text, SymbolDisplayPartKind.text, undefined)); - totalParts.push(new SymbolDisplayPart(")", SymbolDisplayPartKind.punctuation, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(punctuationPart(SyntaxKind.CloseParenToken)); + totalParts.push(spacePart()); totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, getContainerNode(node))); @@ -2436,8 +2436,8 @@ module ts { symbol.flags & SymbolFlags.Variable) { if (type) { - totalParts.push(new SymbolDisplayPart(":", SymbolDisplayPartKind.punctuation, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(punctuationPart(SyntaxKind.ColonToken)); + totalParts.push(spacePart()); totalParts.push.apply(totalParts, typeInfoResolver.typeToDisplayParts(type, getContainerNode(node))); } } @@ -2452,9 +2452,9 @@ module ts { if (declaration.kind === SyntaxKind.EnumMember) { var constantValue = typeInfoResolver.getEnumMemberValue(declaration); if (constantValue !== undefined) { - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); - totalParts.push(new SymbolDisplayPart("=", SymbolDisplayPartKind.operator, undefined)); - totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + totalParts.push(spacePart()); + totalParts.push(operatorPart(SyntaxKind.EqualsToken)); + totalParts.push(spacePart()); totalParts.push(new SymbolDisplayPart(constantValue.toString(), SymbolDisplayPartKind.numericLiteral, undefined)); } } diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts index 75abca77243..4a02c99204d 100644 --- a/src/services/signatureHelp.ts +++ b/src/services/signatureHelp.ts @@ -255,18 +255,18 @@ module ts.SignatureHelp { var displayParts: SymbolDisplayPart[] = []; if (candidateSignature.hasRestParameter && parameters[parameters.length - 1] === p) { - displayParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.DotDotDotToken), SymbolDisplayPartKind.punctuation, undefined)); + displayParts.push(punctuationPart(SyntaxKind.DotDotDotToken)); } - displayParts.push(new SymbolDisplayPart(p.name, SymbolDisplayPartKind.parameterName, p)); + displayParts.push(symbolPart(p.name, p)); var isOptional = !!(p.valueDeclaration.flags & NodeFlags.QuestionMark); if (isOptional) { - displayParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.QuestionToken), SymbolDisplayPartKind.punctuation, undefined)); + displayParts.push(punctuationPart(SyntaxKind.QuestionToken)); } - displayParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.ColonToken), SymbolDisplayPartKind.punctuation, undefined)); - displayParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + displayParts.push(punctuationPart(SyntaxKind.ColonToken)); + displayParts.push(spacePart()); var typeParts = typeInfoResolver.typeToDisplayParts(typeInfoResolver.getTypeOfSymbol(p), argumentListOrTypeArgumentList); displayParts.push.apply(displayParts, typeParts); @@ -284,14 +284,11 @@ module ts.SignatureHelp { var prefixParts = callTargetSymbol ? typeInfoResolver.symbolToDisplayParts(callTargetSymbol, /*enclosingDeclaration*/ undefined, /*meaning*/ undefined) : []; - var separatorParts = [ - new SymbolDisplayPart(tokenToString(SyntaxKind.CommaToken), SymbolDisplayPartKind.punctuation, undefined), - new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined) - ]; + var separatorParts = [punctuationPart(SyntaxKind.CommaToken), spacePart()]; // TODO(jfreeman): Constraints? if (candidateSignature.typeParameters && candidateSignature.typeParameters.length) { - prefixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.LessThanToken), SymbolDisplayPartKind.punctuation, undefined)); + prefixParts.push(punctuationPart(SyntaxKind.LessThanToken)); for (var i = 0, n = candidateSignature.typeParameters.length; i < n; i++) { if (i) { @@ -299,17 +296,17 @@ module ts.SignatureHelp { } var tp = candidateSignature.typeParameters[i].symbol; - prefixParts.push(new SymbolDisplayPart(tp.name, SymbolDisplayPartKind.typeParameterName, tp)); + prefixParts.push(symbolPart(tp.name, tp)); } - prefixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.GreaterThanToken), SymbolDisplayPartKind.punctuation, undefined)); + prefixParts.push(punctuationPart(SyntaxKind.GreaterThanToken)); } - prefixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.OpenParenToken), SymbolDisplayPartKind.punctuation, undefined)); + prefixParts.push(punctuationPart(SyntaxKind.OpenParenToken)); - var suffixParts = [new SymbolDisplayPart(tokenToString(SyntaxKind.CloseParenToken), SymbolDisplayPartKind.punctuation, undefined)]; - suffixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.ColonToken), SymbolDisplayPartKind.punctuation, undefined)); - suffixParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)); + var suffixParts = [punctuationPart(SyntaxKind.CloseParenToken)]; + suffixParts.push(punctuationPart(SyntaxKind.ColonToken)); + suffixParts.push(spacePart()); var typeParts = typeInfoResolver.typeToDisplayParts(candidateSignature.getReturnType(), argumentListOrTypeArgumentList); suffixParts.push.apply(suffixParts, typeParts);