Skip to content

Commit 097e2a5

Browse files
committed
fix(47597): ignore commented imports following template expression
1 parent 3206df8 commit 097e2a5

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

src/services/preProcess.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,24 @@ namespace ts {
345345
break;
346346
}
347347

348+
if (scanner.getToken() === SyntaxKind.TemplateHead) {
349+
loop: while (true) {
350+
switch (scanner.getToken()) {
351+
case SyntaxKind.EndOfFileToken:
352+
break loop;
353+
case SyntaxKind.ImportKeyword:
354+
tryConsumeImport();
355+
break;
356+
case SyntaxKind.CloseBraceToken: {
357+
scanner.reScanTemplateToken(/*isTaggedTemplate*/ false);
358+
break loop;
359+
}
360+
}
361+
scanner.scan();
362+
}
363+
nextToken();
364+
}
365+
348366
// check if at least one of alternative have moved scanner forward
349367
if (tryConsumeDeclare() ||
350368
tryConsumeImport() ||

src/testRunner/unittests/services/preProcessFile.ts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,95 @@ describe("unittests:: services:: PreProcessFile:", () => {
176176
});
177177
});
178178

179+
it("Correctly ignore commented imports following template expression", () => {
180+
/* eslint-disable no-template-curly-in-string */
181+
test("/**" + "\n" +
182+
" * Before" + "\n" +
183+
" * ```" + "\n" +
184+
" * import * as a from \"a\";" + "\n" +
185+
" * ```" + "\n" +
186+
" */" + "\n" +
187+
"type Foo = `${string}`;" + "\n" +
188+
"/**" + "\n" +
189+
" * After" + "\n" +
190+
" * ```" + "\n" +
191+
" * import { B } from \"b\";" + "\n" +
192+
" * import * as c from \"c\";" + "\n" +
193+
" * ```" + "\n" +
194+
" */",
195+
/*readImportFile*/ true,
196+
/*detectJavaScriptImports*/ true,
197+
{
198+
referencedFiles: [],
199+
typeReferenceDirectives: [],
200+
libReferenceDirectives: [],
201+
importedFiles: [],
202+
ambientExternalModules: undefined,
203+
isLibFile: false
204+
});
205+
/* eslint-enable no-template-curly-in-string */
206+
});
207+
208+
it("Correctly returns imports after a template expression", () => {
209+
/* eslint-disable no-template-curly-in-string */
210+
test("`${foo}`; import \"./foo\";",
211+
/*readImportFile*/ true,
212+
/*detectJavaScriptImports*/ true,
213+
{
214+
referencedFiles: [],
215+
typeReferenceDirectives: [],
216+
libReferenceDirectives: [],
217+
importedFiles: [
218+
{ fileName: "./foo", pos: 17, end: 22 }
219+
],
220+
ambientExternalModules: undefined,
221+
isLibFile: false
222+
});
223+
/* eslint-enable no-template-curly-in-string */
224+
});
225+
226+
it("Correctly returns dynamic imports from template expression", () => {
227+
/* eslint-disable no-template-curly-in-string */
228+
test("`${(<div>Text `` ${} text {} " + "\n" +
229+
"${import(\"a\")} {import(\"b\")} " + "\n" +
230+
"${/* A comment */} ${/* import(\"ignored\") */} </div>)}`",
231+
/*readImportFile*/ true,
232+
/*detectJavaScriptImports*/ true,
233+
{
234+
referencedFiles: [],
235+
typeReferenceDirectives: [],
236+
libReferenceDirectives: [],
237+
importedFiles: [
238+
{ fileName: "a", pos: 39, end: 40 },
239+
{ fileName: "b", pos: 53, end: 54 }
240+
],
241+
ambientExternalModules: undefined,
242+
isLibFile: false
243+
});
244+
/* eslint-enable no-template-curly-in-string */
245+
});
246+
247+
it("Correctly returns dynamic imports from nested template expression", () => {
248+
/* eslint-disable no-template-curly-in-string */
249+
test("`${foo(`${bar(`${import(\"a\")} ${import(\"b\")}`, `${baz(`${import(\"c\") ${import(\"d\")}`)}`)}`)}`",
250+
/*readImportFile*/ true,
251+
/*detectJavaScriptImports*/ true,
252+
{
253+
referencedFiles: [],
254+
typeReferenceDirectives: [],
255+
libReferenceDirectives: [],
256+
importedFiles: [
257+
{ fileName: "a", pos: 24, end: 25 },
258+
{ fileName: "b", pos: 39, end: 40 },
259+
{ fileName: "c", pos: 64, end: 65 },
260+
{ fileName: "d", pos: 78, end: 79 },
261+
],
262+
ambientExternalModules: undefined,
263+
isLibFile: false
264+
});
265+
/* eslint-enable no-template-curly-in-string */
266+
});
267+
179268
it("Correctly return ES6 exports", () => {
180269
test("export * from \"m1\";" + "\n" +
181270
"export {a} from \"m2\";" + "\n" +

0 commit comments

Comments
 (0)