Skip to content

Commit 229eb2a

Browse files
Merge pull request #1204 from Microsoft/taggedSigHelp
Tagged Template Signature Help Support in Language Service
2 parents 99eb271 + ad39bdf commit 229eb2a

File tree

46 files changed

+724
-115
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+724
-115
lines changed

src/compiler/parser.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,15 @@ module ts {
487487
}
488488
}
489489

490+
export function getInvokedExpression(node: CallLikeExpression): Expression {
491+
if (node.kind === SyntaxKind.TaggedTemplateExpression) {
492+
return (<TaggedTemplateExpression>node).tag;
493+
}
494+
495+
// Will either be a CallExpression or NewExpression.
496+
return (<CallExpression>node).func;
497+
}
498+
490499
export function isExpression(node: Node): boolean {
491500
switch (node.kind) {
492501
case SyntaxKind.ThisKeyword:
@@ -801,14 +810,19 @@ module ts {
801810
}
802811

803812
export function isUnterminatedTemplateEnd(node: LiteralExpression) {
804-
Debug.assert(node.kind === SyntaxKind.NoSubstitutionTemplateLiteral || node.kind === SyntaxKind.TemplateTail);
813+
Debug.assert(isTemplateLiteralKind(node.kind));
805814
var sourceText = getSourceFileOfNode(node).text;
806815

807816
// If we're not at the EOF, we know we must be terminated.
808817
if (node.end !== sourceText.length) {
809818
return false;
810819
}
811820

821+
// The literal can only be unterminated if it is a template tail or a no-sub template.
822+
if (node.kind !== SyntaxKind.TemplateTail && node.kind !== SyntaxKind.NoSubstitutionTemplateLiteral) {
823+
return false;
824+
}
825+
812826
// If we didn't end in a backtick, we must still be in the middle of a template.
813827
// If we did, make sure that it's not the *initial* backtick.
814828
return sourceText.charCodeAt(node.end - 1) !== CharacterCodes.backtick || node.text.length === 0;

src/compiler/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ module ts {
760760
getAugmentedPropertiesOfType(type: Type): Symbol[];
761761
getRootSymbols(symbol: Symbol): Symbol[];
762762
getContextualType(node: Node): Type;
763-
getResolvedSignature(node: CallExpression, candidatesOutArray?: Signature[]): Signature;
763+
getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[]): Signature;
764764
getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature;
765765
isImplementationOfOverload(node: FunctionLikeDeclaration): boolean;
766766
isUndefinedSymbol(symbol: Symbol): boolean;

src/services/signatureHelp.ts

+212-77
Large diffs are not rendered by default.

src/services/utilities.ts

+5
Original file line numberDiff line numberDiff line change
@@ -320,4 +320,9 @@ module ts {
320320
export function isPunctuation(kind: SyntaxKind): boolean {
321321
return SyntaxKind.FirstPunctuation <= kind && kind <= SyntaxKind.LastPunctuation;
322322
}
323+
324+
export function isInsideTemplateLiteral(node: LiteralExpression, position: number) {
325+
return (node.getStart() < position && position < node.getEnd())
326+
|| (isUnterminatedTemplateEnd(node) && position === node.getEnd());
327+
}
323328
}

tests/cases/fourslash/fourslash.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,11 @@ module FourSlashInterface {
301301
FourSlash.currentTestState.verifySignatureHelpArgumentCount(expected);
302302
}
303303

304-
public currentSignatureParamterCountIs(expected: number) {
304+
public currentSignatureParameterCountIs(expected: number) {
305305
FourSlash.currentTestState.verifyCurrentSignatureHelpParameterCount(expected);
306306
}
307307

308-
public currentSignatureTypeParamterCountIs(expected: number) {
308+
public currentSignatureTypeParameterCountIs(expected: number) {
309309
FourSlash.currentTestState.verifyCurrentSignatureHelpTypeParameterCount(expected);
310310
}
311311

tests/cases/fourslash/genericParameterHelp.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
////testFunction<, ,/*5*/>(null, null, null);
1515

1616
// goTo.marker("1");
17-
// verify.currentSignatureParamterCountIs(3);
17+
// verify.currentSignatureParameterCountIs(3);
1818
// verify.currentSignatureHelpIs("testFunction<T extends IFoo, U, M extends IFoo>(a: T, b: U, c: M): M");
1919

2020
// verify.currentParameterHelpArgumentNameIs("T");

tests/cases/fourslash/signatureHelpAnonymousFunction.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
goTo.marker('anonymousFunction1');
99
verify.signatureHelpCountIs(1);
10-
verify.currentSignatureParamterCountIs(2);
10+
verify.currentSignatureParameterCountIs(2);
1111
verify.currentSignatureHelpIs('(a: number, b: string): string');
1212
verify.currentParameterHelpArgumentNameIs("a");
1313
verify.currentParameterSpanIs("a: number");

tests/cases/fourslash/signatureHelpAtEOF.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ verify.signatureHelpPresent();
1010
verify.signatureHelpCountIs(1);
1111

1212
verify.currentSignatureHelpIs("Foo(arg1: string, arg2: string): void");
13-
verify.currentSignatureParamterCountIs(2);
13+
verify.currentSignatureParameterCountIs(2);
1414
verify.currentParameterHelpArgumentNameIs("arg1");
1515
verify.currentParameterSpanIs("arg1: string");

tests/cases/fourslash/signatureHelpBeforeSemicolon1.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ verify.signatureHelpPresent();
1010
verify.signatureHelpCountIs(1);
1111

1212
verify.currentSignatureHelpIs("Foo(arg1: string, arg2: string): void");
13-
verify.currentSignatureParamterCountIs(2);
13+
verify.currentSignatureParameterCountIs(2);
1414
verify.currentParameterHelpArgumentNameIs("arg1");
1515
verify.currentParameterSpanIs("arg1: string");

tests/cases/fourslash/signatureHelpCallExpression.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
goTo.marker('1');
77
verify.signatureHelpCountIs(1);
8-
verify.currentSignatureParamterCountIs(2);
8+
verify.currentSignatureParameterCountIs(2);
99
verify.currentSignatureHelpIs('fnTest(str: string, num: number): void');
1010

1111
verify.currentParameterHelpArgumentNameIs('str');

tests/cases/fourslash/signatureHelpConstructExpression.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
goTo.marker('1');
77
verify.signatureHelpCountIs(1);
88

9-
verify.currentSignatureParamterCountIs(2);
9+
verify.currentSignatureParameterCountIs(2);
1010
verify.currentSignatureHelpIs('sampleCls(str: string, num: number): sampleCls');
1111

1212
verify.currentParameterHelpArgumentNameIs('str');

tests/cases/fourslash/signatureHelpConstructorInheritance.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
goTo.marker('indirectSuperCall');
1818
verify.signatureHelpCountIs(2);
19-
verify.currentSignatureParamterCountIs(1);
19+
verify.currentSignatureParameterCountIs(1);
2020
verify.currentSignatureHelpIs('B2(n: number): B2');
2121
verify.currentParameterHelpArgumentNameIs("n");
2222
verify.currentParameterSpanIs("n: number");

tests/cases/fourslash/signatureHelpConstructorOverload.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77
goTo.marker('1');
88
verify.signatureHelpCountIs(2);
9-
verify.currentSignatureParamterCountIs(0);
9+
verify.currentSignatureParameterCountIs(0);
1010
verify.currentSignatureHelpIs('clsOverload(): clsOverload');
1111

1212
goTo.marker('2');
13-
verify.currentSignatureParamterCountIs(1);
13+
verify.currentSignatureParameterCountIs(1);
1414
verify.currentSignatureHelpIs('clsOverload(test: string): clsOverload');
1515
verify.currentParameterHelpArgumentNameIs('test');
1616
verify.currentParameterSpanIs("test: string");

tests/cases/fourslash/signatureHelpEmptyList.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ verify.signatureHelpPresent();
1212
verify.signatureHelpCountIs(1);
1313

1414
verify.currentSignatureHelpIs("Foo(arg1: string, arg2: string): void");
15-
verify.currentSignatureParamterCountIs(2);
15+
verify.currentSignatureParameterCountIs(2);
1616
verify.currentParameterHelpArgumentNameIs("arg1");
1717
verify.currentParameterSpanIs("arg1: string");
1818

tests/cases/fourslash/signatureHelpFunctionOverload.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
goTo.marker('functionOverload1');
1010
verify.signatureHelpCountIs(2);
11-
verify.currentSignatureParamterCountIs(0);
11+
verify.currentSignatureParameterCountIs(0);
1212
verify.currentSignatureHelpIs('functionOverload(): any');
1313

1414
goTo.marker('functionOverload2');
15-
verify.currentSignatureParamterCountIs(1);
15+
verify.currentSignatureParameterCountIs(1);
1616
verify.currentSignatureHelpIs('functionOverload(test: string): any');
1717
verify.currentParameterHelpArgumentNameIs("test");
1818
verify.currentParameterSpanIs("test: string");

tests/cases/fourslash/signatureHelpFunctionParameter.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
goTo.marker('parameterFunction1');
88
verify.signatureHelpCountIs(1);
9-
verify.currentSignatureParamterCountIs(2);
9+
verify.currentSignatureParameterCountIs(2);
1010
verify.currentSignatureHelpIs('callback(a: number, b: string): void');
1111
verify.currentParameterHelpArgumentNameIs("a");
1212
verify.currentParameterSpanIs("a: number");

tests/cases/fourslash/signatureHelpImplicitConstructor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
goTo.marker();
88
verify.signatureHelpCountIs(1);
99
verify.currentSignatureHelpIs("ImplicitConstructor(): ImplicitConstructor");
10-
verify.currentSignatureParamterCountIs(0);
10+
verify.currentSignatureParameterCountIs(0);

tests/cases/fourslash/signatureHelpIncompleteCalls.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717

1818
goTo.marker('incompleteCalls1');
1919
verify.currentSignatureHelpIs("f1(): void");
20-
verify.currentSignatureParamterCountIs(0);
20+
verify.currentSignatureParameterCountIs(0);
2121

2222
goTo.marker('incompleteCalls2');
23-
verify.currentSignatureParamterCountIs(1);
23+
verify.currentSignatureParameterCountIs(1);
2424
verify.currentSignatureHelpIs("f2(n: number): number");
2525
goTo.marker('incompleteCalls3');
26-
verify.currentSignatureParamterCountIs(2);
26+
verify.currentSignatureParameterCountIs(2);
2727
verify.currentSignatureHelpIs("f3(n: number, s: string): string");
2828

2929
verify.currentParameterHelpArgumentNameIs("s");
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
/// <reference path='fourslash.ts' />
22

33
////var objectLiteral = { n: 5, s: "", f: (a: number, b: string) => "" };
4-
////objectLiteral.f(/*objectLiteral1*/4, /*objectLiteral2*/"");
5-
6-
goTo.marker('objectLiteral1');
7-
verify.signatureHelpCountIs(1);
8-
verify.currentSignatureParamterCountIs(2);
9-
verify.currentSignatureHelpIs('f(a: number, b: string): string');
10-
11-
verify.currentParameterHelpArgumentNameIs("a");
12-
verify.currentParameterSpanIs("a: number");
13-
14-
goTo.marker('objectLiteral2');
15-
verify.currentSignatureHelpIs('f(a: number, b: string): string');
4+
////objectLiteral.f(/*objectLiteral1*/4, /*objectLiteral2*/"");
5+
6+
goTo.marker('objectLiteral1');
7+
verify.signatureHelpCountIs(1);
8+
verify.currentSignatureParameterCountIs(2);
9+
verify.currentSignatureHelpIs('f(a: number, b: string): string');
10+
11+
verify.currentParameterHelpArgumentNameIs("a");
12+
verify.currentParameterSpanIs("a: number");
13+
14+
goTo.marker('objectLiteral2');
15+
verify.currentSignatureHelpIs('f(a: number, b: string): string');
1616
verify.currentParameterHelpArgumentNameIs("b");
1717
verify.currentParameterSpanIs("b: string");

tests/cases/fourslash/signatureHelpOnOverloadsDifferentArity3.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@
1010
goTo.marker();
1111
verify.signatureHelpCountIs(4);
1212
verify.currentSignatureHelpIs("f(): any");
13-
verify.currentSignatureParamterCountIs(0);
13+
verify.currentSignatureParameterCountIs(0);
1414
verify.signatureHelpArgumentCountIs(0);
1515

1616
edit.insert(", ");
1717
verify.signatureHelpCountIs(4);
1818
verify.currentSignatureHelpIs("f(s: string, b: boolean): any");
19-
verify.currentSignatureParamterCountIs(2);
19+
verify.currentSignatureParameterCountIs(2);
2020
verify.currentParameterHelpArgumentNameIs("b");
2121
verify.currentParameterSpanIs("b: boolean");
2222

2323
edit.insert(", ");
2424
verify.signatureHelpCountIs(4);
2525
verify.currentSignatureHelpIs("f(s: string, b: boolean): any");
26-
verify.currentSignatureParamterCountIs(2);
26+
verify.currentSignatureParameterCountIs(2);

tests/cases/fourslash/signatureHelpSuperConstructorOverload.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
goTo.marker('superOverload1');
2121
verify.signatureHelpCountIs(2);
2222
verify.currentSignatureHelpIs("SuperOverloadlBase(): SuperOverloadlBase");
23-
verify.currentSignatureParamterCountIs(0);
23+
verify.currentSignatureParameterCountIs(0);
2424
goTo.marker('superOverload2');
25-
verify.currentSignatureParamterCountIs(1);
25+
verify.currentSignatureParameterCountIs(1);
2626
verify.currentSignatureHelpIs("SuperOverloadlBase(test: string): SuperOverloadlBase");
2727
verify.currentParameterHelpArgumentNameIs("test");
2828
verify.currentParameterSpanIs("test: string");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// function f(templateStrings, x, y, z) { return 10; }
4+
//// function g(templateStrings, x, y, z) { return ""; }
5+
////
6+
//// f `/*1*/ qwe/*2*/rty /*3*/$/*4*/{ 123 }/*5*/ as/*6*/df /*7*/$/*8*/{ 41234 }/*9*/ zxc/*10*/vb /*11*/$/*12*/{ g ` ` }/*13*/ /*14*/ /*15*/`
7+
8+
test.markers().forEach(m => {
9+
goTo.position(m.position);
10+
11+
verify.signatureHelpCountIs(1);
12+
verify.signatureHelpArgumentCountIs(4);
13+
14+
verify.currentSignatureParameterCountIs(4);
15+
verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
16+
verify.currentParameterHelpArgumentNameIs("templateStrings");
17+
verify.currentParameterSpanIs("templateStrings: any");
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// function f(templateStrings, x, y, z) { return 10; }
4+
//// function g(templateStrings, x, y, z) { return ""; }
5+
////
6+
//// f `/*1*/ qwe/*2*/rty /*3*/$/*4*/{ 123 }/*5*/ as/*6*/df /*7*/$/*8*/{ 41234 }/*9*/ zxc/*10*/vb /*11*/$/*12*/{ g ` ` }/*13*/ /*14*/ /*15*/
7+
8+
test.markers().forEach(m => {
9+
goTo.position(m.position);
10+
11+
verify.signatureHelpCountIs(1);
12+
verify.signatureHelpArgumentCountIs(4);
13+
14+
verify.currentSignatureParameterCountIs(4);
15+
verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
16+
verify.currentParameterHelpArgumentNameIs("templateStrings");
17+
verify.currentParameterSpanIs("templateStrings: any");
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// function f(templateStrings, x, y, z) { return 10; }
4+
//// function g(templateStrings, x, y, z) { return ""; }
5+
////
6+
//// f ` qwerty ${/*1*/ /*2*/123/*3*/ /*4*/} asdf ${ 41234 } zxcvb ${ g ` ` } `
7+
8+
test.markers().forEach(m => {
9+
goTo.position(m.position);
10+
11+
verify.signatureHelpCountIs(1);
12+
verify.signatureHelpArgumentCountIs(4);
13+
14+
verify.currentSignatureParameterCountIs(4);
15+
verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
16+
verify.currentParameterHelpArgumentNameIs("x");
17+
verify.currentParameterSpanIs("x: any");
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// function f(templateStrings, x, y, z) { return 10; }
4+
//// function g(templateStrings, x, y, z) { return ""; }
5+
////
6+
//// f ` qwerty ${ 123 } asdf ${/*1*/ /*2*/ /*3*/41/*4*/234/*5*/ /*6*/} zxcvb ${ g ` ` } `
7+
8+
test.markers().forEach(m => {
9+
goTo.position(m.position);
10+
11+
verify.signatureHelpCountIs(1);
12+
verify.signatureHelpArgumentCountIs(4);
13+
14+
verify.currentSignatureParameterCountIs(4);
15+
verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
16+
verify.currentParameterHelpArgumentNameIs("y");
17+
verify.currentParameterSpanIs("y: any");
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// function f(templateStrings, x, y, z) { return 10; }
4+
//// function g(templateStrings, x, y, z) { return ""; }
5+
////
6+
//// f ` qwerty ${ 123 } asdf ${ 41234 } zxcvb ${/*1*/ /*2*/g/*3*/ /*4*/` `/*5*/ /*6*/} `
7+
8+
test.markers().forEach(m => {
9+
goTo.position(m.position);
10+
11+
verify.signatureHelpCountIs(1);
12+
verify.signatureHelpArgumentCountIs(4);
13+
14+
verify.currentSignatureParameterCountIs(4);
15+
verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
16+
verify.currentParameterHelpArgumentNameIs("z");
17+
verify.currentParameterSpanIs("z: any");
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
//// function f(templateStrings, x, y, z) { return 10; }
4+
//// function g(templateStrings, x, y, z) { return ""; }
5+
////
6+
//// f ` qwerty ${ 123 } asdf ${ 41234 } zxcvb ${ g `/*1*/ /*2*/ /*3*/` } `
7+
8+
test.markers().forEach(m => {
9+
goTo.position(m.position);
10+
11+
verify.signatureHelpCountIs(1);
12+
verify.signatureHelpArgumentCountIs(1);
13+
14+
verify.currentSignatureParameterCountIs(4);
15+
verify.currentSignatureHelpIs('g(templateStrings: any, x: any, y: any, z: any): string');
16+
verify.currentParameterHelpArgumentNameIs("templateStrings");
17+
verify.currentParameterSpanIs("templateStrings: any");
18+
});

0 commit comments

Comments
 (0)