diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplates1.ts b/tests/cases/fourslash/signatureHelpTaggedTemplates1.ts
new file mode 100644
index 00000000000..457551f160a
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplates1.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// 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*/`
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("templateStrings");
+ verify.currentParameterSpanIs("templateStrings: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplates2.ts b/tests/cases/fourslash/signatureHelpTaggedTemplates2.ts
new file mode 100644
index 00000000000..fa29c21ff21
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplates2.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// 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*/
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("templateStrings");
+ verify.currentParameterSpanIs("templateStrings: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplates3.ts b/tests/cases/fourslash/signatureHelpTaggedTemplates3.ts
new file mode 100644
index 00000000000..5670cadfd4e
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplates3.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` qwerty ${/*1*/ /*2*/123/*3*/ /*4*/} asdf ${ 41234 } zxcvb ${ g ` ` } `
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("x");
+ verify.currentParameterSpanIs("x: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplates4.ts b/tests/cases/fourslash/signatureHelpTaggedTemplates4.ts
new file mode 100644
index 00000000000..bbbd869de09
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplates4.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` qwerty ${ 123 } asdf ${/*1*/ /*2*/ /*3*/41/*4*/234/*5*/ /*6*/} zxcvb ${ g ` ` } `
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("y");
+ verify.currentParameterSpanIs("y: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplates5.ts b/tests/cases/fourslash/signatureHelpTaggedTemplates5.ts
new file mode 100644
index 00000000000..68a95121240
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplates5.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` qwerty ${ 123 } asdf ${ 41234 } zxcvb ${/*1*/ /*2*/g/*3*/ /*4*/` `/*5*/ /*6*/} `
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("z");
+ verify.currentParameterSpanIs("z: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplates6.ts b/tests/cases/fourslash/signatureHelpTaggedTemplates6.ts
new file mode 100644
index 00000000000..c1080b3f7e5
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplates6.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` qwerty ${ 123 } asdf ${ 41234 } zxcvb ${ g `/*1*/ /*2*/ /*3*/` } `
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('g(templateStrings: any, x: any, y: any, z: any): string');
+ verify.currentParameterHelpArgumentNameIs("templateStrings");
+ verify.currentParameterSpanIs("templateStrings: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplates7.ts b/tests/cases/fourslash/signatureHelpTaggedTemplates7.ts
new file mode 100644
index 00000000000..eb25ac6f647
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplates7.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f `/*1*/ /*2*/
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("templateStrings");
+ verify.currentParameterSpanIs("templateStrings: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete1.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete1.ts
new file mode 100644
index 00000000000..65a250fce31
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete1.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f `/*1*/ /*2*/${
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("templateStrings");
+ verify.currentParameterSpanIs("templateStrings: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete2.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete2.ts
new file mode 100644
index 00000000000..c2baa7b187d
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete2.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` ${/*1*/ /*2*/
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("x");
+ verify.currentParameterSpanIs("x: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete3.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete3.ts
new file mode 100644
index 00000000000..ccaebc1f1b6
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete3.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` ${ }/*1*/ /*2*/
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("templateStrings");
+ verify.currentParameterSpanIs("templateStrings: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete4.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete4.ts
new file mode 100644
index 00000000000..e220ec60679
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete4.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` ${ } ${/*1*/ /*2*/
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("y");
+ verify.currentParameterSpanIs("y: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete5.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete5.ts
new file mode 100644
index 00000000000..1655841575d
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete5.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` ${ } ${ }/*1*/ /*2*/
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("templateStrings");
+ verify.currentParameterSpanIs("templateStrings: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete6.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete6.ts
new file mode 100644
index 00000000000..67d81d6558e
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesIncomplete6.ts
@@ -0,0 +1,15 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f ` ${ 123 } ${/*1*/ } `
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+ verify.currentParameterHelpArgumentNameIs("y");
+ verify.currentParameterSpanIs("y: any");
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesNegatives1.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesNegatives1.ts
new file mode 100644
index 00000000000..c61f1a871e4
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesNegatives1.ts
@@ -0,0 +1,11 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// /*1*/f/*2*/ /*3*/` qwerty ${ 123 } asdf ${ 41234 } zxcvb ${ g ` ` } `/*4*/
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.not.signatureHelpPresent();
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesNested1.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesNested1.ts
new file mode 100644
index 00000000000..934bea21ed5
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesNested1.ts
@@ -0,0 +1,13 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f `a ${ g `/*1*/alpha/*2*/ ${/*3*/ 12/*4*/3 /*5*/} beta /*6*/${ /*7*/456 /*8*/} gamma/*9*/` } b ${ g `/*10*/txt/*11*/` } c ${ g `/*12*/aleph /*13*/$/*14*/{ 12/*15*/3 } beit/*16*/` } d`;
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('g(templateStrings: any, x: any, y: any, z: any): string');
+});
\ No newline at end of file
diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesNested2.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesNested2.ts
new file mode 100644
index 00000000000..9ff5103f30a
--- /dev/null
+++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesNested2.ts
@@ -0,0 +1,14 @@
+///
+
+//// function f(templateStrings, x, y, z) { return 10; }
+//// function g(templateStrings, x, y, z) { return ""; }
+////
+//// f `/*1*/a $/*2*/{ /*3*/g /*4*/`alpha ${ 123 } beta ${ 456 } gamma`/*5*/ }/*6*/ b $/*7*/{ /*8*/g /*9*/`txt`/*10*/ } /*11*/c ${ /*12*/g /*13*/`aleph ${ 123 } beit`/*14*/ } d/*15*/`;
+debugger;
+
+test.markers().forEach(m => {
+ goTo.position(m.position);
+ verify.signatureHelpCountIs(1);
+ verify.currentSignatureParamterCountIs(4);
+ verify.currentSignatureHelpIs('f(templateStrings: any, x: any, y: any, z: any): number');
+});
\ No newline at end of file