Skip to content

Commit b91dfc2

Browse files
Provide helpers for creating symbol display parts.
1 parent 236b70b commit b91dfc2

File tree

3 files changed

+79
-58
lines changed

3 files changed

+79
-58
lines changed

src/compiler/checker.ts

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -925,38 +925,17 @@ module ts {
925925
var displayPartWriters: DisplayPartsSymbolWriter[] = [];
926926
var stringWriters: StringSymbolWriter[] = [];
927927

928-
function displayPartKind(symbol: Symbol): SymbolDisplayPartKind {
929-
var flags = symbol.flags;
930-
931-
if (flags & SymbolFlags.Variable) {
932-
return symbol.declarations && symbol.declarations.length > 0 && symbol.declarations[0].kind === SyntaxKind.Parameter
933-
? SymbolDisplayPartKind.parameterName
934-
: SymbolDisplayPartKind.localName;
935-
}
936-
else if (flags & SymbolFlags.Property) { return SymbolDisplayPartKind.propertyName; }
937-
else if (flags & SymbolFlags.EnumMember) { return SymbolDisplayPartKind.enumMemberName; }
938-
else if (flags & SymbolFlags.Function) { return SymbolDisplayPartKind.functionName; }
939-
else if (flags & SymbolFlags.Class) { return SymbolDisplayPartKind.className; }
940-
else if (flags & SymbolFlags.Interface) { return SymbolDisplayPartKind.interfaceName; }
941-
else if (flags & SymbolFlags.Enum) { return SymbolDisplayPartKind.enumName; }
942-
else if (flags & SymbolFlags.Module) { return SymbolDisplayPartKind.moduleName; }
943-
else if (flags & SymbolFlags.Method) { return SymbolDisplayPartKind.methodName; }
944-
else if (flags & SymbolFlags.TypeParameter) { return SymbolDisplayPartKind.typeParameterName; }
945-
946-
return SymbolDisplayPartKind.text;
947-
}
948-
949928
function getDisplayPartWriter(): DisplayPartsSymbolWriter {
950929
if (displayPartWriters.length == 0) {
951930
var displayParts: SymbolDisplayPart[] = [];
952931
return {
953932
displayParts: () => displayParts,
954933
writeKind: (text, kind) => displayParts.push(new SymbolDisplayPart(text, kind, undefined)),
955-
writeSymbol: (text, symbol) => displayParts.push(new SymbolDisplayPart(text, displayPartKind(symbol), symbol)),
934+
writeSymbol: (text, symbol) => displayParts.push(symbolPart(text, symbol)),
956935

957936
// Completely ignore indentation for display part writers. And map newlines to
958937
// a single space.
959-
writeLine: () => displayParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)),
938+
writeLine: () => displayParts.push(spacePart()),
960939
increaseIndent: () => { },
961940
decreaseIndent: () => { },
962941
clear: () => displayParts = [],
@@ -7693,4 +7672,49 @@ module ts {
76937672

76947673
return checker;
76957674
}
7675+
7676+
export function spacePart() {
7677+
return new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined);
7678+
}
7679+
7680+
export function keywordPart(kind: SyntaxKind) {
7681+
return new SymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.keyword, undefined);
7682+
}
7683+
7684+
export function punctuationPart(kind: SyntaxKind) {
7685+
return new SymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.punctuation, undefined);
7686+
}
7687+
7688+
export function operatorPart(kind: SyntaxKind) {
7689+
return new SymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.operator, undefined);
7690+
}
7691+
7692+
export function textPart(text: string) {
7693+
return new SymbolDisplayPart(text, SymbolDisplayPartKind.text, undefined);
7694+
}
7695+
7696+
export function symbolPart(text: string, symbol: Symbol) {
7697+
return new SymbolDisplayPart(text, displayPartKind(symbol), symbol)
7698+
}
7699+
7700+
function displayPartKind(symbol: Symbol): SymbolDisplayPartKind {
7701+
var flags = symbol.flags;
7702+
7703+
if (flags & SymbolFlags.Variable) {
7704+
return symbol.declarations && symbol.declarations.length > 0 && symbol.declarations[0].kind === SyntaxKind.Parameter
7705+
? SymbolDisplayPartKind.parameterName
7706+
: SymbolDisplayPartKind.localName;
7707+
}
7708+
else if (flags & SymbolFlags.Property) { return SymbolDisplayPartKind.propertyName; }
7709+
else if (flags & SymbolFlags.EnumMember) { return SymbolDisplayPartKind.enumMemberName; }
7710+
else if (flags & SymbolFlags.Function) { return SymbolDisplayPartKind.functionName; }
7711+
else if (flags & SymbolFlags.Class) { return SymbolDisplayPartKind.className; }
7712+
else if (flags & SymbolFlags.Interface) { return SymbolDisplayPartKind.interfaceName; }
7713+
else if (flags & SymbolFlags.Enum) { return SymbolDisplayPartKind.enumName; }
7714+
else if (flags & SymbolFlags.Module) { return SymbolDisplayPartKind.moduleName; }
7715+
else if (flags & SymbolFlags.Method) { return SymbolDisplayPartKind.methodName; }
7716+
else if (flags & SymbolFlags.TypeParameter) { return SymbolDisplayPartKind.typeParameterName; }
7717+
7718+
return SymbolDisplayPartKind.text;
7719+
}
76967720
}

src/services/services.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2384,34 +2384,34 @@ module ts {
23842384
var totalParts: SymbolDisplayPart[] = [];
23852385

23862386
if (symbol.flags & SymbolFlags.Class) {
2387-
totalParts.push(new SymbolDisplayPart("class", SymbolDisplayPartKind.keyword, undefined));
2388-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2387+
totalParts.push(keywordPart(SyntaxKind.ClassKeyword));
2388+
totalParts.push(spacePart());
23892389
totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile));
23902390
}
23912391
else if (symbol.flags & SymbolFlags.Interface) {
2392-
totalParts.push(new SymbolDisplayPart("interface", SymbolDisplayPartKind.keyword, undefined));
2393-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2392+
totalParts.push(keywordPart(SyntaxKind.InterfaceKeyword));
2393+
totalParts.push(spacePart());
23942394
totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile));
23952395
}
23962396
else if (symbol.flags & SymbolFlags.Enum) {
2397-
totalParts.push(new SymbolDisplayPart("enum", SymbolDisplayPartKind.keyword, undefined));
2398-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2397+
totalParts.push(keywordPart(SyntaxKind.EnumKeyword));
2398+
totalParts.push(spacePart());
23992399
totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile));
24002400
}
24012401
else if (symbol.flags & SymbolFlags.Module) {
2402-
totalParts.push(new SymbolDisplayPart("module", SymbolDisplayPartKind.keyword, undefined));
2403-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2402+
totalParts.push(keywordPart(SyntaxKind.ModuleKeyword));
2403+
totalParts.push(spacePart());
24042404
totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, sourceFile));
24052405
}
24062406
else if (symbol.flags & SymbolFlags.TypeParameter) {
2407-
totalParts.push(new SymbolDisplayPart("(", SymbolDisplayPartKind.punctuation, undefined));
2407+
totalParts.push(punctuationPart(SyntaxKind.OpenParenToken));
24082408
totalParts.push(new SymbolDisplayPart("type parameter", SymbolDisplayPartKind.text, undefined));
2409-
totalParts.push(new SymbolDisplayPart(")", SymbolDisplayPartKind.punctuation, undefined));
2410-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2409+
totalParts.push(punctuationPart(SyntaxKind.CloseParenToken));
2410+
totalParts.push(spacePart());
24112411
totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol));
24122412
}
24132413
else {
2414-
totalParts.push(new SymbolDisplayPart("(", SymbolDisplayPartKind.punctuation, undefined));
2414+
totalParts.push(punctuationPart(SyntaxKind.OpenParenToken));
24152415
var text: string;
24162416

24172417
if (symbol.flags & SymbolFlags.Property) { text = "property" }
@@ -2425,8 +2425,8 @@ module ts {
24252425
}
24262426

24272427
totalParts.push(new SymbolDisplayPart(text, SymbolDisplayPartKind.text, undefined));
2428-
totalParts.push(new SymbolDisplayPart(")", SymbolDisplayPartKind.punctuation, undefined));
2429-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2428+
totalParts.push(punctuationPart(SyntaxKind.CloseParenToken));
2429+
totalParts.push(spacePart());
24302430

24312431
totalParts.push.apply(totalParts, typeInfoResolver.symbolToDisplayParts(symbol, getContainerNode(node)));
24322432

@@ -2436,8 +2436,8 @@ module ts {
24362436
symbol.flags & SymbolFlags.Variable) {
24372437

24382438
if (type) {
2439-
totalParts.push(new SymbolDisplayPart(":", SymbolDisplayPartKind.punctuation, undefined));
2440-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2439+
totalParts.push(punctuationPart(SyntaxKind.ColonToken));
2440+
totalParts.push(spacePart());
24412441
totalParts.push.apply(totalParts, typeInfoResolver.typeToDisplayParts(type, getContainerNode(node)));
24422442
}
24432443
}
@@ -2452,9 +2452,9 @@ module ts {
24522452
if (declaration.kind === SyntaxKind.EnumMember) {
24532453
var constantValue = typeInfoResolver.getEnumMemberValue(<EnumMember>declaration);
24542454
if (constantValue !== undefined) {
2455-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2456-
totalParts.push(new SymbolDisplayPart("=", SymbolDisplayPartKind.operator, undefined));
2457-
totalParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
2455+
totalParts.push(spacePart());
2456+
totalParts.push(operatorPart(SyntaxKind.EqualsToken));
2457+
totalParts.push(spacePart());
24582458
totalParts.push(new SymbolDisplayPart(constantValue.toString(), SymbolDisplayPartKind.numericLiteral, undefined));
24592459
}
24602460
}

src/services/signatureHelp.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -255,18 +255,18 @@ module ts.SignatureHelp {
255255
var displayParts: SymbolDisplayPart[] = [];
256256

257257
if (candidateSignature.hasRestParameter && parameters[parameters.length - 1] === p) {
258-
displayParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.DotDotDotToken), SymbolDisplayPartKind.punctuation, undefined));
258+
displayParts.push(punctuationPart(SyntaxKind.DotDotDotToken));
259259
}
260260

261-
displayParts.push(new SymbolDisplayPart(p.name, SymbolDisplayPartKind.parameterName, p));
261+
displayParts.push(symbolPart(p.name, p));
262262

263263
var isOptional = !!(p.valueDeclaration.flags & NodeFlags.QuestionMark);
264264
if (isOptional) {
265-
displayParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.QuestionToken), SymbolDisplayPartKind.punctuation, undefined));
265+
displayParts.push(punctuationPart(SyntaxKind.QuestionToken));
266266
}
267267

268-
displayParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.ColonToken), SymbolDisplayPartKind.punctuation, undefined));
269-
displayParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
268+
displayParts.push(punctuationPart(SyntaxKind.ColonToken));
269+
displayParts.push(spacePart());
270270

271271
var typeParts = typeInfoResolver.typeToDisplayParts(typeInfoResolver.getTypeOfSymbol(p), argumentListOrTypeArgumentList);
272272
displayParts.push.apply(displayParts, typeParts);
@@ -284,32 +284,29 @@ module ts.SignatureHelp {
284284

285285
var prefixParts = callTargetSymbol ? typeInfoResolver.symbolToDisplayParts(callTargetSymbol, /*enclosingDeclaration*/ undefined, /*meaning*/ undefined) : [];
286286

287-
var separatorParts = [
288-
new SymbolDisplayPart(tokenToString(SyntaxKind.CommaToken), SymbolDisplayPartKind.punctuation, undefined),
289-
new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined)
290-
];
287+
var separatorParts = [punctuationPart(SyntaxKind.CommaToken), spacePart()];
291288

292289
// TODO(jfreeman): Constraints?
293290
if (candidateSignature.typeParameters && candidateSignature.typeParameters.length) {
294-
prefixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.LessThanToken), SymbolDisplayPartKind.punctuation, undefined));
291+
prefixParts.push(punctuationPart(SyntaxKind.LessThanToken));
295292

296293
for (var i = 0, n = candidateSignature.typeParameters.length; i < n; i++) {
297294
if (i) {
298295
prefixParts.push.apply(prefixParts, separatorParts);
299296
}
300297

301298
var tp = candidateSignature.typeParameters[i].symbol;
302-
prefixParts.push(new SymbolDisplayPart(tp.name, SymbolDisplayPartKind.typeParameterName, tp));
299+
prefixParts.push(symbolPart(tp.name, tp));
303300
}
304301

305-
prefixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.GreaterThanToken), SymbolDisplayPartKind.punctuation, undefined));
302+
prefixParts.push(punctuationPart(SyntaxKind.GreaterThanToken));
306303
}
307304

308-
prefixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.OpenParenToken), SymbolDisplayPartKind.punctuation, undefined));
305+
prefixParts.push(punctuationPart(SyntaxKind.OpenParenToken));
309306

310-
var suffixParts = [new SymbolDisplayPart(tokenToString(SyntaxKind.CloseParenToken), SymbolDisplayPartKind.punctuation, undefined)];
311-
suffixParts.push(new SymbolDisplayPart(tokenToString(SyntaxKind.ColonToken), SymbolDisplayPartKind.punctuation, undefined));
312-
suffixParts.push(new SymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined));
307+
var suffixParts = [punctuationPart(SyntaxKind.CloseParenToken)];
308+
suffixParts.push(punctuationPart(SyntaxKind.ColonToken));
309+
suffixParts.push(spacePart());
313310

314311
var typeParts = typeInfoResolver.typeToDisplayParts(candidateSignature.getReturnType(), argumentListOrTypeArgumentList);
315312
suffixParts.push.apply(suffixParts, typeParts);

0 commit comments

Comments
 (0)