8000 return ambient external modules as a results of preprocessing · rvdn/TypeScript@544a793 · GitHub
[go: up one dir, main page]

Skip to content

Commit 544a793

Browse files
committed
return ambient external modules as a results of preprocessing
1 parent d7661ec commit 544a793

File tree

6 files changed

+55
-10
lines changed

6 files changed

+55
-10
lines changed

src/harness/harnessLanguageService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ module Harness.LanguageService {
417417
var convertResult: ts.PreProcessedFileInfo = {
418418
referencedFiles: [],
419419
importedFiles: [],
420+
ambientExternalModules: [],
420421
isLibFile: shimResult.isLibFile
421422
};
422423

src/services/services.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ namespace ts {
121121
export interface PreProcessedFileInfo {
122122
referencedFiles: FileReference[];
123123
importedFiles: FileReference[];
124+
ambientExternalModules: string[];
124125
isLibFile: boolean
125126
}
126127

@@ -2007,6 +2008,7 @@ namespace ts {
20072008
export function preProcessFile(sourceText: string, readImportFiles = true): PreProcessedFileInfo {
20082009
let referencedFiles: FileReference[] = [];
20092010
let importedFiles: FileReference[] = [];
2011+
let ambientExternalModules: string[];
20102012
let isNoDefaultLib = false;
20112013

20122014
function processTripleSlashDirectives(): void {
@@ -2023,6 +2025,13 @@ namespace ts {
20232025
}
20242026
});
20252027
}
2028+
2029+
function recordAmbientExternalModule(): void {
2030+
if (!ambientExternalModules) {
2031+
ambientExternalModules = [];
2032+
}
2033+
ambientExternalModules.push(scanner.getTokenValue());
2034+
}
20262035

20272036
function recordModuleName() {
20282037
let importPath = scanner.getTokenValue();
@@ -2033,7 +2042,7 @@ namespace ts {
20332042
end: pos + importPath.length
20342043
});
20352044
}
2036-
2045+
20372046
function processImport(): void {
20382047
scanner.setText(sourceText);
20392048
let token = scanner.scan();
@@ -2049,15 +2058,26 @@ namespace ts {
20492058
// export {a as b} from "mod"
20502059

20512060
while (token !== SyntaxKind.EndOfFileToken) {
2052-
if (token === SyntaxKind.ImportKeyword) {
2061+
if (token === SyntaxKind.DeclareKeyword) {
2062+
// declare module "mod"
2063+
token = scanner.scan();
2064+
if (token === SyntaxKind.ModuleKeyword) {
2065+
token = scanner.scan();
2066+
if (token === SyntaxKind.StringLiteral) {
2067+
recordAmbientExternalModule();
2068+
continue;
2069+
}
2070+
}
2071+
}
2072+
else if (token === SyntaxKind.ImportKeyword) {
20532073
token = scanner.scan();
20542074
if (token === SyntaxKind.StringLiteral) {
20552075
// import "mod";
20562076
recordModuleName();
20572077
continue;
20582078
}
20592079
else {
2060-
if (token === SyntaxKind.Identifier) {
2080+
if (token === SyntaxKind.Identifier || isKeyword(token)) {
20612081
token = scanner.scan();
20622082
if (token === SyntaxKind.FromKeyword) {
20632083
token = scanner.scan();
@@ -2114,7 +2134,7 @@ namespace ts {
21142134
token = scanner.scan();
21152135
if (token === SyntaxKind.AsKeyword) {
21162136
token = scanner.scan();
2117-
if (token === SyntaxKind.Identifier) {
2137+
if (token === SyntaxKind.Identifier || isKeyword(token)) {
21182138
token = scanner.scan();
21192139
if (token === SyntaxKind.FromKeyword) {
21202140
token = scanner.scan();
@@ -2170,7 +2190,7 @@ namespace ts {
21702190
processImport();
21712191
}
21722192
processTripleSlashDirectives();
2173-
return { referencedFiles, importedFiles, isLibFile: isNoDefaultLib };
2193+
return { referencedFiles, importedFiles, isLibFile: isNoDefaultLib, ambientExternalModules };
21742194
}
21752195

21762196
/// Helpers

src/services/shims.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ namespace ts {
903903
public resolveModuleName(fileName: string, moduleName: string, compilerOptionsJson: string): string {
904904
return this.forwardJSONCall(`resolveModuleName('${fileName}')`, () => {
905905
let compilerOptions = <CompilerOptions>JSON.parse(compilerOptionsJson);
906-
return resolveModuleName(fileName, moduleName, compilerOptions, this.host);
906+
return resolveModuleName(normalizeSlashes(fileName), moduleName, compilerOptions, this.host);
907907
});
908908
}
909909

@@ -915,6 +915,7 @@ namespace ts 10000 {
915915
var convertResult = {
916916
referencedFiles: <IFileReference[]>[],
917917
importedFiles: <IFileReference[]>[],
918+
ambientExternalModules: result.ambientExternalModules,
918919
isLibFile: result.isLibFile
919920
};
920921

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
error TS6053: File 'a.ts' not found.
2-
error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.tsx', '.ts', '.d.ts'.
2+
error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.ts', '.d.ts', '.tsx'.
33

44

55
!!! error TS6053: File 'a.ts' not found.
6-
!!! error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.tsx', '.ts', '.d.ts'.
6+
!!! error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.ts', '.d.ts', '.tsx'.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
error TS6053: File 'a.ts' not found.
2-
error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.tsx', '.ts', '.d.ts'.
2+
error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.ts', '.d.ts', '.tsx'.
33

44

55
!!! error TS6053: File 'a.ts' not found.
6-
!!! error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.tsx', '.ts', '.d.ts'.
6+
!!! error TS6054: File 'a.t' has unsupported extension. The only supported extensions are '.ts', '.d.ts', '.tsx'.

tests/cases/unittests/services/preProcessFile.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ describe('PreProcessFile:', function () {
5050
referencedFiles: [{ fileName: "refFile1.ts", pos: 0, end: 37 }, { fileName: "refFile2.ts", pos: 38, end: 73 },
5151
{ fileName: "refFile3.ts", pos: 74, end: 109 }, { fileName: "..\\refFile4d.ts", pos: 110, end: 150 }],
5252
importedFiles: <ts.FileReference[]>[],
53+
ambientExternalModules: undefined,
5354
isLibFile: false
5455
});
5556
}),
@@ -59,6 +60,7 @@ describe('PreProcessFile:', function () {
5960
{
6061
referencedFiles: <ts.FileReference[]>[],
6162
importedFiles: <ts.FileReference[]>[],
63+
ambientExternalModules: undefined,
6264
isLibFile: false
6365
});
6466
}),
@@ -69,6 +71,7 @@ describe('PreProcessFile:', function () {
6971
referencedFiles: <ts.FileReference[]>[],
7072
importedFiles: [{ fileName: "r1.ts", pos: 20, end: 25 }, { fileName: "r2.ts", pos: 49, end: 54 }, { fileName: "r3.ts", pos: 78, end: 83 },
7173
{ fileName: "r4.ts", pos: 106, end: 111 }, { fileName: "r5.ts", pos: 138, end: 143 }],
74+
ambientExternalModules: undefined,
7275
isLibFile: false
7376
});
7477
}),
@@ -78,6 +81,7 @@ describe('PreProcessFile:', function () {
7881
{
7982
referencedFiles: <ts.FileReference[]>[],
8083
importedFiles: <ts.FileReference[]>[],
84+
ambientExternalModules: undefined,
8185
isLibFile: false
8286
});
8387
}),
@@ -87,6 +91,7 @@ describe('PreProcessFile:', function () {
8791
{
8892
referencedFiles: <ts.FileReference[]>[],
8993
importedFiles: [{ fileName: "r3.ts", pos: 73, end: 78 }],
94+
ambientExternalModules: undefined,
9095
isLibFile: false
9196
});
9297
}),
@@ -96,6 +101,7 @@ describe('PreProcessFile:', function () {
96101
{
97102
referencedFiles: [{ fileName: "refFile1.ts", pos: 0, end: 35 }, { fileName: "refFile2.ts", pos: 36, end: 71 }],
98103
importedFiles: [{ fileName: "r1.ts", pos: 92, end: 97 }, { fileName: "r2.ts", pos: 121, end: 126 }],
104+
ambientExternalModules: undefined,
99105
isLibFile: false
100106
});
101107
}),
@@ -105,6 +111,7 @@ describe('PreProcessFile:', function () {
105111
{
106112
referencedFiles: [{ fileName: "refFile1.ts", pos: 0, end: 35 }],
107113
importedFiles: [{ fileName: "r1.ts", pos: 91, end: 96 }, { fileName: "r3.ts", pos: 148, end: 153 }],
114+
ambientExternalModules: undefined,
108115
isLibFile: false
109116
})
110117
});
@@ -129,6 +136,7 @@ describe('PreProcessFile:', function () {
129136
{ fileName: "m6", pos: 160, end: 162 },
130137
{ fileName: "m7", pos: 199, end: 201 }
131138
],
139+
ambientExternalModules: undefined,
132140
isLibFile: false
133141
})
134142
});
@@ -147,9 +155,24 @@ describe('PreProcessFile:', function () {
147155
{ fileName: "m3", pos: 63, end: 65 },
148156
{ fileName: "m4", pos: 101, end: 103 },
149157
],
158+
ambientExternalModules: undefined,
150159
isLibFile: false
151160
})
152161
});
162+
163+
it("Correctly return ambient external modules", () => {
164+
test(`
165+
declare module A {}
166+
declare module "B" {}
167+
function foo() {
168+
}
169+
`, false, {
170+
referencedFiles: [],
171+
importedFiles: [],
172+
ambientExternalModules: ["B"],
173+
isLibFile: false
174+
})
175+
});
153176
});
154177
});
155178

0 commit comments

Comments
 (0)
0