detect nested non-imports

This commit is contained in:
Joscha Feth 2018-04-15 11:27:51 +10:00
parent c64c1c9395
commit 4dc9db1e70
2 changed files with 26 additions and 8 deletions

View File

@ -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: <ts.FileReference[]>[],
importedFiles: <ts.FileReference[]>[],
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,

View File

@ -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() ||