From 4dc9db1e70852277fe58da22b1797cbdd8fe50c6 Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Sun, 15 Apr 2018 11:27:51 +1000 Subject: [PATCH] detect nested non-imports --- .../unittests/services/preProcessFile.ts | 13 ++++++++++++ src/services/preProcess.ts | 21 ++++++++++++------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/harness/unittests/services/preProcessFile.ts b/src/harness/unittests/services/preProcessFile.ts index f68af84f759..76b1e4f05a6 100644 --- a/src/harness/unittests/services/preProcessFile.ts +++ b/src/harness/unittests/services/preProcessFile.ts @@ -72,6 +72,19 @@ describe("PreProcessFile:", () => { }); }), + it("Do not return reference path of nested non-imports", () => { + test("a.b.import('c');", + /*readImportFile*/ true, + /*detectJavaScriptImports*/ false, + { + referencedFiles: [], + importedFiles: [], + typeReferenceDirectives: [], + ambientExternalModules: undefined, + isLibFile: false + }); + }), + it("Correctly return imported files", () => { test("import i1 = require(\"r1.ts\"); import i2 =require(\"r2.ts\"); import i3= require(\"r3.ts\"); import i4=require(\"r4.ts\"); import i5 = require (\"r5.ts\");", /*readImportFile*/ true, diff --git a/src/services/preProcess.ts b/src/services/preProcess.ts index f63f84b52ba..a1cb4676038 100644 --- a/src/services/preProcess.ts +++ b/src/services/preProcess.ts @@ -12,20 +12,25 @@ namespace ts { }; const importedFiles: FileReference[] = []; let ambientExternalModules: { ref: FileReference, depth: number }[]; + let lastToken: SyntaxKind; + let currentToken: SyntaxKind; let braceNesting = 0; // assume that text represent an external module if it contains at least one top level import/export // ambient modules that are found inside external modules are interpreted as module augmentations let externalModule = false; function nextToken() { - const token = scanner.scan(); - if (token === SyntaxKind.OpenBraceToken) { + if (currentToken) { + lastToken = currentToken; + } + currentToken = scanner.scan(); + if (currentToken === SyntaxKind.OpenBraceToken) { braceNesting++; } - else if (token === SyntaxKind.CloseBraceToken) { + else if (currentToken === SyntaxKind.CloseBraceToken) { braceNesting--; } - return token; + return currentToken; } function getFileReference() { @@ -77,6 +82,9 @@ namespace ts { * Returns true if at least one token was consumed from the stream */ function tryConsumeImport(): boolean { + if (lastToken === SyntaxKind.DotToken) { + return false; + } let token = scanner.getToken(); if (token === SyntaxKind.ImportKeyword) { token = nextToken(); @@ -295,16 +303,13 @@ namespace ts { // Do not look for: // AnySymbol.import("mod") + // AnySymbol.nested.import("mod") while (true) { const token = scanner.getToken(); if (token === SyntaxKind.EndOfFileToken) { break; } - if (token === SyntaxKind.DotToken) { - nextToken(); // jump over anything directly following the dot - nextToken(); - } // check if at least one of alternative have moved scanner forward if (tryConsumeDeclare() ||