Better symbol information for lambda variable types at the call site

This commit is contained in:
Sheetal Nandi 2014-10-06 14:24:58 -07:00
parent be051f02b5
commit 643d169465
8 changed files with 82 additions and 87 deletions

View File

@ -2727,38 +2727,37 @@ module ts {
var allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures();
if (contains(allSignatures, signature.target || signature)) {
// Write it as method/function/constructor as: (constructor) a(....)
if (symbolKind === ScriptElementKind.memberVariableElement || symbolFlags & SymbolFlags.Variable || symbolFlags & SymbolFlags.Class) {
if (useConstructSignatures) {
symbolKind = ScriptElementKind.constructorImplementationElement;
}
else {
switch (symbolKind) {
case ScriptElementKind.memberVariableElement:
symbolKind = ScriptElementKind.memberFunctionElement;
break;
case ScriptElementKind.variableElement:
symbolKind = ScriptElementKind.functionElement;
break;
case ScriptElementKind.parameterElement:
case ScriptElementKind.localVariableElement:
symbolKind = ScriptElementKind.localFunctionElement;
break;
default:
Debug.fail("symbolKind: " + symbolKind);
}
}
}
// Constructor or call signatures use the type name
if (useConstructSignatures || (signature.declaration.kind === SyntaxKind.CallSignature &&
!(type.symbol.flags & SymbolFlags.TypeLiteral || type.symbol.flags & SymbolFlags.ObjectLiteral))) {
if (useConstructSignatures && (symbolFlags & SymbolFlags.Class)) {
// Constructor
symbolKind = ScriptElementKind.constructorImplementationElement;
addPrefixForAnyFunctionOrVar(type.symbol, symbolKind);
}
else {
addPrefixForAnyFunctionOrVar(symbol, symbolKind);
}
addSignatureDisplayParts(signature, allSignatures);
switch (symbolKind) {
case ScriptElementKind.memberVariableElement:
case ScriptElementKind.variableElement:
case ScriptElementKind.parameterElement:
case ScriptElementKind.localVariableElement:
// If it is call or construct signature of lambda's write type name
displayParts.push(punctuationPart(SyntaxKind.ColonToken));
displayParts.push(spacePart());
if (useConstructSignatures) {
displayParts.push(keywordPart(SyntaxKind.NewKeyword));
displayParts.push(spacePart());
}
if (!(type.flags & TypeFlags.Anonymous)) {
displayParts.push.apply(displayParts, symbolToDisplayParts(typeResolver, type.symbol, enclosingDeclaration, /*meaning*/ undefined, SymbolFormatFlags.WriteTypeParametersOrArguments));
}
addSignatureDisplayParts(signature, allSignatures, TypeFormatFlags.WriteArrowStyleSignature);
break;
default:
// Just signature
addSignatureDisplayParts(signature, allSignatures);
}
hasAddedSymbolInfo = true;
}
}
@ -2917,8 +2916,8 @@ module ts {
}
}
function addSignatureDisplayParts(signature: Signature, allSignatures: Signature[]) {
displayParts.push.apply(displayParts, signatureToDisplayParts(typeResolver, signature, enclosingDeclaration, TypeFormatFlags.NoTruncation | TypeFormatFlags.WriteTypeArgumentsOfSignature));
function addSignatureDisplayParts(signature: Signature, allSignatures: Signature[], flags?: TypeFormatFlags) {
displayParts.push.apply(displayParts, signatureToDisplayParts(typeResolver, signature, enclosingDeclaration, flags | TypeFormatFlags.NoTruncation | TypeFormatFlags.WriteTypeArgumentsOfSignature));
if (allSignatures.length > 1) {
displayParts.push(spacePart());
displayParts.push(punctuationPart(SyntaxKind.OpenParenToken));

View File

@ -126,6 +126,7 @@ verify.quickInfoIs('(local var) localVar: string', '');
goTo.marker('30');
verify.quickInfoIs('(parameter) b: string', '');
goTo.marker('31');
verify.quickInfoIs('(local function) lambdaVar(b: string): string', '');
debugger;
verify.quickInfoIs('(local var) lambdaVar: (b: string) => string', '');
goTo.marker('32');
verify.quickInfoIs('(parameter) a: number', '');

View File

@ -261,13 +261,13 @@ verify.quickInfoIs("(method) i1.f1(): void", "");
goTo.marker('5q');
verify.quickInfoIs("(method) i1.nc_f1(): void", "");
goTo.marker('l2q');
verify.quickInfoIs("(method) i1.i1_l1(): void", "");
verify.quickInfoIs("(property) i1.i1_l1: () => void", "");
goTo.marker('l3q');
verify.quickInfoIs("(method) i1.i1_nc_l1(): void", "");
verify.quickInfoIs("(property) i1.i1_nc_l1: () => void", "");
goTo.marker('l4q');
verify.quickInfoIs("(method) i1.l1(): void", "");
verify.quickInfoIs("(property) i1.l1: () => void", "");
goTo.marker('l5q');
verify.quickInfoIs("(method) i1.nc_l1(): void", "");
verify.quickInfoIs("(property) i1.nc_l1: () => void", "");
goTo.marker('6');
verify.memberListContains("i1_p1", "(property) c1.i1_p1: number", "");
@ -310,13 +310,13 @@ verify.quickInfoIs("(method) c1.f1(): void", "c1_f1");
goTo.marker('10q');
verify.quickInfoIs("(method) c1.nc_f1(): void", "c1_nc_f1");
goTo.marker('l7q');
verify.quickInfoIs("(method) c1.i1_l1(): void", "");
verify.quickInfoIs("(property) c1.i1_l1: () => void", "");
goTo.marker('l8q');
verify.quickInfoIs("(method) c1.i1_nc_l1(): void", "");
verify.quickInfoIs("(property) c1.i1_nc_l1: () => void", "");
goTo.marker('l9q');
verify.quickInfoIs("(method) c1.l1(): void", "");
verify.quickInfoIs("(property) c1.l1: () => void", "");
goTo.marker('l10q');
verify.quickInfoIs("(method) c1.nc_l1(): void", "");
verify.quickInfoIs("(property) c1.nc_l1: () => void", "");
goTo.marker('11');
verify.memberListContains("i1_p1", "(property) i1.i1_p1: number", "i1_p1");
@ -356,13 +356,13 @@ verify.quickInfoIs("(method) i1.f1(): void", "");
goTo.marker('15q');
verify.quickInfoIs("(method) i1.nc_f1(): void", "");
goTo.marker('l12q');
verify.quickInfoIs("(method) i1.i1_l1(): void", "");
verify.quickInfoIs("(property) i1.i1_l1: () => void", "");
goTo.marker('l13q');
verify.quickInfoIs("(method) i1.i1_nc_l1(): void", "");
verify.quickInfoIs("(property) i1.i1_nc_l1: () => void", "");
goTo.marker('l14q');
verify.quickInfoIs("(method) i1.l1(): void", "");
verify.quickInfoIs("(property) i1.l1: () => void", "");
goTo.marker('l15q');
verify.quickInfoIs("(method) i1.nc_l1(): void", "");
verify.quickInfoIs("(property) i1.nc_l1: () => void", "");
goTo.marker('16');
verify.completionListContains("i1", "interface i1", "i1 is interface with properties");
@ -545,13 +545,13 @@ verify.quickInfoIs("(method) i2.f1(): void", "i2 f1");
goTo.marker('40q');
verify.quickInfoIs("(method) i2.nc_f1(): void", "");
goTo.marker('l37q');
verify.quickInfoIs("(method) i2.i2_l1(): void", "");
verify.quickInfoIs("(property) i2.i2_l1: () => void", "");
goTo.marker('l38q');
verify.quickInfoIs("(method) i2.i2_nc_l1(): void", "");
verify.quickInfoIs("(property) i2.i2_nc_l1: () => void", "");
goTo.marker('l39q');
verify.quickInfoIs("(method) i2.l1(): void", "");
verify.quickInfoIs("(property) i2.l1: () => void", "");
goTo.marker('l40q');
verify.quickInfoIs("(method) i2.nc_l1(): void", "");
verify.quickInfoIs("(property) i2.nc_l1: () => void", "");
goTo.marker('41');
verify.memberListContains("i2_p1", "(property) i2.i2_p1: number", "i2_p1");
@ -592,13 +592,13 @@ verify.quickInfoIs("(method) i3.f1(): void", "i3 f1");
goTo.marker('45q');
verify.quickInfoIs("(method) i3.nc_f1(): void", "");
goTo.marker('l42q');
verify.quickInfoIs("(method) i2.i2_l1(): void", "");
verify.quickInfoIs("(property) i2.i2_l1: () => void", "");
goTo.marker('l43q');
verify.quickInfoIs("(method) i2.i2_nc_l1(): void", "");
verify.quickInfoIs("(property) i2.i2_nc_l1: () => void", "");
goTo.marker('l44q');
verify.quickInfoIs("(method) i3.l1(): void", "");
verify.quickInfoIs("(property) i3.l1: () => void", "");
goTo.marker('l45q');
verify.quickInfoIs("(method) i3.nc_l1(): void", "");
verify.quickInfoIs("(property) i3.nc_l1: () => void", "");
goTo.marker('46');
verify.memberListContains("i2_p1", "(property) i2.i2_p1: number", "i2_p1");
@ -639,13 +639,13 @@ verify.quickInfoIs("(method) i2.f1(): void", "i2 f1");
goTo.marker('50q');
verify.quickInfoIs("(method) i2.nc_f1(): void", "");
goTo.marker('l47q');
verify.quickInfoIs("(method) i2.i2_l1(): void", "");
verify.quickInfoIs("(property) i2.i2_l1: () => void", "");
goTo.marker('l48q');
verify.quickInfoIs("(method) i2.i2_nc_l1(): void", "");
verify.quickInfoIs("(property) i2.i2_nc_l1: () => void", "");
goTo.marker('l49q');
verify.quickInfoIs("(method) i2.l1(): void", "");
verify.quickInfoIs("(property) i2.l1: () => void", "");
goTo.marker('l50q');
verify.quickInfoIs("(method) i2.nc_l1(): void", "");
verify.quickInfoIs("(property) i2.nc_l1: () => void", "");
goTo.marker('51');
verify.completionListContains("i2", "interface i2", "");

View File

@ -111,7 +111,7 @@ goTo.marker('12');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("param help");
goTo.marker('12q');
verify.quickInfoIs("(method) i2.foo(b: number): string", "");
verify.quickInfoIs("(property) i2.foo: (b: number) => string", "");
goTo.marker('13');
verify.quickInfoIs("(var) i2_i_i2_si: number", "");
@ -130,7 +130,7 @@ goTo.marker('16');
verify.currentSignatureHelpDocCommentIs("new method");
verify.currentParameterHelpArgumentDocCommentIs("param");
goTo.marker('16q');
verify.quickInfoIs("(constructor) i2(i: i1): any", "new method");
verify.quickInfoIs("(var) i2_i: new i2(i: i1) => any", "new method");
goTo.marker('17');
verify.quickInfoIs("(var) i2_i_nc_x: number", "");
@ -151,7 +151,7 @@ goTo.marker('22');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('22q');
verify.quickInfoIs("(method) i2.nc_foo(b: number): string", "");
verify.quickInfoIs("(property) i2.nc_foo: (b: number) => string", "");
goTo.marker('23');
verify.quickInfoIs("(var) i2_i_r: number", "");
@ -160,7 +160,7 @@ goTo.marker('24');
verify.currentSignatureHelpDocCommentIs("this is call signature");
verify.currentParameterHelpArgumentDocCommentIs("paramhelp a");
goTo.marker('24q');
verify.quickInfoIs("(function) i2(a: number, b: number): number", "this is call signature");
verify.quickInfoIs("(var) i2_i: i2(a: number, b: number) => number", "this is call signature");
goTo.marker('25');
verify.currentSignatureHelpDocCommentIs("this is call signature");
@ -244,7 +244,7 @@ goTo.marker('43');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("comment i3 l b");
goTo.marker('43q');
verify.quickInfoIs("(method) i3.l(b: number): string", "");
verify.quickInfoIs("(property) i3.l: (b: number) => string", "");
goTo.marker('44');
verify.currentSignatureHelpDocCommentIs("");
@ -256,4 +256,4 @@ goTo.marker('45');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('45q');
verify.quickInfoIs("(method) i3.nc_l(b: number): string", "");
verify.quickInfoIs("(property) i3.nc_l: (b: number) => string", "");

View File

@ -308,7 +308,7 @@ verify.completionListContains('f4', '(function) f4(a: number): number (+ 1 overl
goTo.marker('18');
verify.completionListContains('i1', 'interface i1', '');
verify.completionListContains('i1_i', '(constructor) i1(b: number): any (+ 1 overload(s))', '');
verify.completionListContains('i1_i', '(var) i1_i: new i1(b: number) => any (+ 1 overload(s))', '');
verify.completionListContains('i2', 'interface i2', '');
verify.completionListContains('i2_i', '(var) i2_i: i2', '');
verify.completionListContains('i3', 'interface i3', '');
@ -320,25 +320,25 @@ goTo.marker('19');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('19q');
verify.quickInfoIs("(constructor) i1(b: number): any (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i1_i: new i1(b: number) => any (+ 1 overload(s))", "");
goTo.marker('20');
verify.currentSignatureHelpDocCommentIs("new 1");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('20q');
verify.quickInfoIs("(constructor) i1(a: string): any (+ 1 overload(s))", "new 1");
verify.quickInfoIs("(var) i1_i: new i1(a: string) => any (+ 1 overload(s))", "new 1");
goTo.marker('21');
verify.currentSignatureHelpDocCommentIs("this signature 1");
verify.currentParameterHelpArgumentDocCommentIs("param a");
goTo.marker('21q');
verify.quickInfoIs("(function) i1(a: number): number (+ 1 overload(s))", "this signature 1");
verify.quickInfoIs("(var) i1_i: i1(a: number) => number (+ 1 overload(s))", "this signature 1");
goTo.marker('22');
verify.currentSignatureHelpDocCommentIs("this is signature 2");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('22q');
verify.quickInfoIs("(function) i1(b: string): number (+ 1 overload(s))", "this is signature 2");
verify.quickInfoIs("(var) i1_i: i1(b: string) => number (+ 1 overload(s))", "this is signature 2");
goTo.marker('23');
verify.memberListContains('foo', '(method) i1.foo(a: number): number (+ 1 overload(s))', 'foo 1');
@ -398,73 +398,73 @@ goTo.marker('32');
verify.currentSignatureHelpDocCommentIs("new 2");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('32q');
verify.quickInfoIs("(constructor) i2(b: number): any (+ 1 overload(s))", "new 2");
verify.quickInfoIs("(var) i2_i: new i2(b: number) => any (+ 1 overload(s))", "new 2");
goTo.marker('33');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('33q');
verify.quickInfoIs("(constructor) i2(a: string): any (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i2_i: new i2(a: string) => any (+ 1 overload(s))", "");
goTo.marker('34');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('34q');
verify.quickInfoIs("(function) i2(a: number): number (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i2_i: i2(a: number) => number (+ 1 overload(s))", "");
goTo.marker('35');
verify.currentSignatureHelpDocCommentIs("this is signature 2");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('35q');
verify.quickInfoIs("(function) i2(b: string): number (+ 1 overload(s))", "this is signature 2");
verify.quickInfoIs("(var) i2_i: i2(b: string) => number (+ 1 overload(s))", "this is signature 2");
goTo.marker('36');
verify.currentSignatureHelpDocCommentIs("new 2");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('36q');
verify.quickInfoIs("(constructor) i3(b: number): any (+ 1 overload(s))", "new 2");
verify.quickInfoIs("(var) i3_i: new i3(b: number) => any (+ 1 overload(s))", "new 2");
goTo.marker('37');
verify.currentSignatureHelpDocCommentIs("new 1");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('37q');
verify.quickInfoIs("(constructor) i3(a: string): any (+ 1 overload(s))", "new 1");
verify.quickInfoIs("(var) i3_i: new i3(a: string) => any (+ 1 overload(s))", "new 1");
goTo.marker('38');
verify.currentSignatureHelpDocCommentIs("this is signature 1");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('38q');
verify.quickInfoIs("(function) i3(a: number): number (+ 1 overload(s))", "this is signature 1");
verify.quickInfoIs("(var) i3_i: i3(a: number) => number (+ 1 overload(s))", "this is signature 1");
goTo.marker('39');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('39q');
verify.quickInfoIs("(function) i3(b: string): number (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i3_i: i3(b: string) => number (+ 1 overload(s))", "");
goTo.marker('40');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('40q');
verify.quickInfoIs("(constructor) i4(b: number): any (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i4_i: new i4(b: number) => any (+ 1 overload(s))", "");
goTo.marker('41');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('41q');
verify.quickInfoIs("(constructor) i4(a: string): any (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i4_i: new i4(a: string) => any (+ 1 overload(s))", "");
goTo.marker('42');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('42q');
verify.quickInfoIs("(function) i4(a: number): number (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i4_i: i4(a: number) => number (+ 1 overload(s))", "");
goTo.marker('43');
verify.currentSignatureHelpDocCommentIs("");
verify.currentParameterHelpArgumentDocCommentIs("");
goTo.marker('43q');
verify.quickInfoIs("(function) i4(b: string): number (+ 1 overload(s))", "");
verify.quickInfoIs("(var) i4_i: i4(b: string) => number (+ 1 overload(s))", "");
goTo.marker('44');
verify.memberListContains('prop1', '(method) c.prop1(a: number): number (+ 1 overload(s))', '');

View File

@ -63,7 +63,7 @@ verify.quickInfoIs("(function) foo(): void", "foos comment");
goTo.marker('6');
verify.currentSignatureHelpDocCommentIs("");
goTo.marker('6q');
verify.quickInfoIs("(function) fooVar(): void", "");
verify.quickInfoIs("(var) fooVar: () => void", "");
goTo.marker('7');
verify.completionListContains("foo", "(function) foo(): void", "foos comment");
@ -77,7 +77,7 @@ verify.quickInfoIs("(function) foo(): void", "foos comment");
goTo.marker('9');
verify.currentSignatureHelpDocCommentIs("");
goTo.marker('9q');
verify.quickInfoIs("(function) fooVar(): void", "");
verify.quickInfoIs("(var) fooVar: () => void", "");
goTo.marker('9aq');
verify.quickInfoIs("(var) fooVar: () => void", "fooVar comment");

View File

@ -30,7 +30,7 @@ verify.quickInfoIs("(method) C.x1(a: number, callback: (x: 'hi') => number): any
goTo.marker('5');
verify.quickInfoIs('(parameter) callback: (x: string) => number');
goTo.marker('6');
verify.quickInfoIs('(local function) callback(x: string): number');
verify.quickInfoIs('(parameter) callback: (x: string) => number');
goTo.marker('7');
verify.quickInfoIs("(method) C.x1(a: number, callback: (x: 'hi') => number): any");
goTo.marker('8');

View File

@ -6,12 +6,7 @@
//// /*3*/f(3);
////}
// Declaration is shown as type information
goTo.marker("1");
verify.quickInfoIs("(var) f: (x: number) => number", "");
// But the call sites show the signatures selected
[2, 3].forEach((val) => {
[1, 2, 3].forEach((val) => {
goTo.marker("" + val);
verify.quickInfoIs("(function) f(x: number): number", "");
verify.quickInfoIs("(var) f: (x: number) => number", "");
} );