Skip to content

Commit 2264322

Browse files
committed
Enable project runner to compile generated .d.ts files
Uncovered bug in quoted .d.ts compilation
1 parent 5657c28 commit 2264322

File tree

541 files changed

+1220
-1169
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

541 files changed

+1220
-1169
lines changed

src/harness/projectsRunner.ts

Lines changed: 128 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ interface BatchCompileProjectTestCaseEmittedFile {
3131
fileName: string;
3232
}
3333

34-
interface BatchCompileProjectTestCaseResult {
34+
interface CompileProjectFilesResult {
3535
moduleKind: ts.ModuleKind;
3636
program: ts.Program;
37-
readInputFiles: ts.SourceFile[];
37+
errors: ts.Diagnostic[];
3838
sourceMapData: ts.SourceMapData[];
39+
}
40+
41+
interface BatchCompileProjectTestCaseResult extends CompileProjectFilesResult {
3942
outputFiles: BatchCompileProjectTestCaseEmittedFile[];
40-
errors: ts.Diagnostic[];
4143
nonSubfolderDiskFiles: number;
4244
}
4345

@@ -116,13 +118,43 @@ class ProjectRunner extends RunnerBase {
116118

117119
return url;
118120
}
119-
120-
function batchCompilerProjectTestCase(moduleKind: ts.ModuleKind): BatchCompileProjectTestCaseResult{
121-
var nonSubfolderDiskFiles = 0;
122121

123-
var readInputFiles: ts.SourceFile[] = [];
122+
function getCurrentDirectory() {
123+
return sys.resolvePath(testCase.projectRoot);
124+
}
125+
126+
function compileProjectFiles(moduleKind: ts.ModuleKind, getInputFiles: ()=> string[],
127+
getSourceFileText: (filename: string) => string,
128+
writeFile: (filename: string, data: string) => void): CompileProjectFilesResult {
129+
130+
var program = ts.createProgram(getInputFiles(), createCompilerOptions(), createCompilerHost());
131+
var errors = program.getDiagnostics();
124132
var sourceMapData: ts.SourceMapData[] = null;
125-
var outputFiles: BatchCompileProjectTestCaseEmittedFile[] = [];
133+
if (!errors.length) {
134+
var checker = program.getTypeChecker();
135+
errors = checker.getDiagnostics();
136+
var emitResult = checker.emitFiles();
137+
errors = ts.concatenate(errors, emitResult.errors);
138+
sourceMapData = emitResult.sourceMaps;
139+
140+
// Clean up source map data that will be used in baselining
141+
if (sourceMapData) {
142+
for (var i = 0; i < sourceMapData.length; i++) {
143+
for (var j = 0; j < sourceMapData[i].sourceMapSources.length; j++) {
144+
sourceMapData[i].sourceMapSources[j] = cleanProjectUrl(sourceMapData[i].sourceMapSources[j]);
145+
}
146+
sourceMapData[i].jsSourceMappingURL = cleanProjectUrl(sourceMapData[i].jsSourceMappingURL);
147+
sourceMapData[i].sourceMapSourceRoot = cleanProjectUrl(sourceMapData[i].sourceMapSourceRoot);
148+
}
149+
}
150+
}
151+
152+
return {
153+
moduleKind: moduleKind,
154+
program: program,
155+
errors: errors,
156+
sourceMapData: sourceMapData
157+
};
126158

127159
function createCompilerOptions(): ts.CompilerOptions {
128160
return {
@@ -142,28 +174,55 @@ class ProjectRunner extends RunnerBase {
142174
sourceFile = ts.createSourceFile('lib.d.ts', Harness.Compiler.libTextMinimal, languageVersion, ts.ByteOrderMark.None);
143175
}
144176
else {
145-
assert.isTrue(!ts.filter(readInputFiles, sourceFile => sourceFile.filename == filename).length, "Compiler trying to read same file again: " + filename);
146-
147-
try {
148-
var text = sys.readFile(ts.isRootedDiskPath(filename)
149-
? filename
150-
: ts.normalizeSlashes(testCase.projectRoot) + "/" + ts.normalizeSlashes(filename));
151-
}
152-
catch (e) {
153-
// text doesn't get defined.
154-
}
155-
177+
var text = getSourceFileText(filename);
156178
if (text !== undefined) {
157179
sourceFile = ts.createSourceFile(filename, text, languageVersion, ts.ByteOrderMark.None);
158180
}
159181
}
160182

161-
if (sourceFile) {
162-
readInputFiles.push(sourceFile);
163-
}
164183
return sourceFile;
165184
}
166185

186+
function createCompilerHost(): ts.CompilerHost {
187+
return {
188+
getSourceFile: getSourceFile,
189+
getDefaultLibFilename: () => "lib.d.ts",
190+
writeFile: writeFile,
191+
getCurrentDirectory: getCurrentDirectory,
192+
getCanonicalFileName: ts.getCanonicalFileName,
193+
useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames,
194+
getNewLine: () => sys.newLine
195+
};
196+
}
197+
}
198+
199+
function batchCompilerProjectTestCase(moduleKind: ts.ModuleKind): BatchCompileProjectTestCaseResult{
200+
var nonSubfolderDiskFiles = 0;
201+
202+
var outputFiles: BatchCompileProjectTestCaseEmittedFile[] = [];
203+
204+
var projectCompilerResult = compileProjectFiles(moduleKind, () => testCase.inputFiles, getSourceFileText, writeFile);
205+
return {
206+
moduleKind: moduleKind,
207+
program: projectCompilerResult.program,
208+
sourceMapData: projectCompilerResult.sourceMapData,
209+
outputFiles: outputFiles,
210+
errors: projectCompilerResult.errors,
211+
nonSubfolderDiskFiles: nonSubfolderDiskFiles,
212+
};
213+
214+
function getSourceFileText(filename: string): string {
215+
try {
216+
var text = sys.readFile(ts.isRootedDiskPath(filename)
217+
? filename
218+
: ts.normalizeSlashes(testCase.projectRoot) + "/" + ts.normalizeSlashes(filename));
219+
}
220+
catch (e) {
221+
// text doesn't get defined.
222+
}
223+
return text;
224+
}
225+
167226
function writeFile(filename: string, data: string) {
168227
var diskFileName = ts.isRootedDiskPath(filename)
169228
? filename
@@ -211,53 +270,47 @@ class ProjectRunner extends RunnerBase {
211270

212271
outputFiles.push({ emittedFileName: filename, code: data, fileName: diskRelativeName });
213272
}
273+
}
214274

215-
function getCurrentDirectory() {
216-
return sys.resolvePath(testCase.projectRoot);
217-
}
275+
function compileCompileDTsFiles(compilerResult: BatchCompileProjectTestCaseResult) {
276+
var inputDtsSourceFiles = ts.map(ts.filter(compilerResult.program.getSourceFiles(),
277+
sourceFile => Harness.Compiler.isDTS(sourceFile.filename)),
278+
sourceFile => {
279+
return { emittedFileName: sourceFile.filename, code: sourceFile.text };
280+
});
218281

219-
function createCompilerHost(): ts.CompilerHost {
220-
return {
221-
getSourceFile: getSourceFile,
222-
getDefaultLibFilename: () => "lib.d.ts",
223-
writeFile: writeFile,
224-
getCurrentDirectory: getCurrentDirectory,
225-
getCanonicalFileName: ts.getCanonicalFileName,
226-
useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames,
227-
getNewLine:()=> sys.newLine
228-
};
282+
var ouputDtsFiles = ts.filter(compilerResult.outputFiles, ouputFile => Harness.Compiler.isDTS(ouputFile.emittedFileName));
283+
var allInputFiles = inputDtsSourceFiles.concat(ouputDtsFiles);
284+
return compileProjectFiles(compilerResult.moduleKind,getInputFiles, getSourceFileText, writeFile);
285+
286+
function getInputFiles() {
287+
return ts.map(allInputFiles, outputFile => outputFile.emittedFileName);
288+
}
289+
function getSourceFileText(filename: string): string {
290+
return ts.forEach(allInputFiles, inputFile => inputFile.emittedFileName === filename ? inputFile.code : undefined);
229291
}
230292

231-
var program = ts.createProgram(testCase.inputFiles, createCompilerOptions(), createCompilerHost());
232-
var errors = program.getDiagnostics();
233-
if (!errors.length) {
234-
var checker = program.getTypeChecker();
235-
errors = checker.getDiagnostics();
236-
var emitResult = checker.emitFiles();
237-
errors = ts.concatenate(errors, emitResult.errors);
238-
sourceMapData = emitResult.sourceMaps;
293+
function writeFile(filename: string, data: string) {
294+
}
295+
}
239296

240-
// Clean up source map data that will be used in baselining
241-
if (sourceMapData) {
242-
for (var i = 0; i < sourceMapData.length; i++) {
243-
for (var j = 0; j < sourceMapData[i].sourceMapSources.length; j++) {
244-
sourceMapData[i].sourceMapSources[j] = cleanProjectUrl(sourceMapData[i].sourceMapSources[j]);
245-
}
246-
sourceMapData[i].jsSourceMappingURL = cleanProjectUrl(sourceMapData[i].jsSourceMappingURL);
247-
sourceMapData[i].sourceMapSourceRoot = cleanProjectUrl(sourceMapData[i].sourceMapSourceRoot);
248-
}
297+
function getErrorsBaseline(compilerResult: CompileProjectFilesResult) {
298+
// This is copied from tc.ts's reportError to replicate what tc does
299+
var errors = "";
300+
for (var i = 0; i < compilerResult.errors.length; i++) {
301+
var error = compilerResult.errors[i];
302+
// TODO(jfreeman): Remove assert
303+
ts.Debug.assert(error.messageText.indexOf("{NL}") < 0);
304+
if (error.file) {
305+
var loc = error.file.getLineAndCharacterFromPosition(error.start);
306+
errors += error.file.filename + "(" + loc.line + "," + loc.character + "): " + error.messageText + sys.newLine;
307+
}
308+
else {
309+
errors += error.messageText + sys.newLine;
249310
}
250311
}
251312

252-
return {
253-
moduleKind: moduleKind,
254-
program: program,
255-
readInputFiles: readInputFiles,
256-
sourceMapData: sourceMapData,
257-
outputFiles: outputFiles,
258-
errors: errors,
259-
nonSubfolderDiskFiles: nonSubfolderDiskFiles,
260-
};
313+
return errors;
261314
}
262315

263316
describe('Compiling project for ' + testCase.scenario +': testcase ' + testCaseFileName, () => {
@@ -278,15 +331,14 @@ class ProjectRunner extends RunnerBase {
278331
baselineCheck: testCase.baselineCheck,
279332
runTest: testCase.runTest,
280333
bug: testCase.bug,
281-
resolvedInputFiles: ts.map(compilerResult.readInputFiles, inputFile => inputFile.filename),
334+
resolvedInputFiles: ts.map(compilerResult.program.getSourceFiles(), inputFile => inputFile.filename),
282335
emittedFiles: ts.map(compilerResult.outputFiles, outputFile => outputFile.emittedFileName)
283336
};
284337

285338
return resolutionInfo;
286339
}
287340

288341
it('Resolution information of (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, () => {
289-
assert.equal(compilerResult.program.getSourceFiles().length, compilerResult.readInputFiles.length, "Compiler missing/has extra source files that were read during compilation");
290342
Harness.Baseline.runBaseline('Resolution information of (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + testCaseJustName + '.json', () => {
291343
return JSON.stringify(getCompilerResolutionInfo(), undefined, " ");
292344
});
@@ -295,22 +347,7 @@ class ProjectRunner extends RunnerBase {
295347
if (compilerResult.errors.length) {
296348
it('Errors for (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, () => {
297349
Harness.Baseline.runBaseline('Errors for (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + testCaseJustName + '.errors.txt', () => {
298-
// This is copied from tc.ts's reportError to replicate what tc does
299-
var errors = "";
300-
for (var i = 0; i < compilerResult.errors.length; i++) {
301-
var error = compilerResult.errors[i];
302-
// TODO(jfreeman): Remove assert
303-
ts.Debug.assert(error.messageText.indexOf("{NL}") < 0);
304-
if (error.file) {
305-
var loc = error.file.getLineAndCharacterFromPosition(error.start);
306-
errors += error.file.filename + "(" + loc.line + "," + loc.character + "): " + error.messageText + sys.newLine;
307-
}
308-
else {
309-
errors += error.messageText + sys.newLine;
310-
}
311-
}
312-
313-
return errors;
350+
return getErrorsBaseline(compilerResult);
314351
});
315352
});
316353
}
@@ -337,6 +374,18 @@ class ProjectRunner extends RunnerBase {
337374
});
338375
});
339376
}
377+
378+
// Verify that all the generated .d.ts files compile
379+
if (!compilerResult.errors.length && testCase.declaration) {
380+
var dTsCompileResult = compileCompileDTsFiles(compilerResult);
381+
if (dTsCompileResult.errors.length) {
382+
it('Errors in generated Dts files for (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, () => {
383+
Harness.Baseline.runBaseline('Errors in generated Dts files for (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + testCaseJustName + '.dts.errors.txt', () => {
384+
return getErrorsBaseline(dTsCompileResult);
385+
});
386+
});
387+
}
388+
}
340389
}
341390
}
342391

tests/baselines/reference/project/baseline/amd/baseline.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
"baselineCheck": true,
88
"runTest": true,
99
"resolvedInputFiles": [
10-
"emit.ts",
10+
"lib.d.ts",
1111
"decl.ts",
12-
"lib.d.ts"
12+
"emit.ts"
1313
],
1414
"emittedFiles": [
1515
"decl.js",

tests/baselines/reference/project/baseline/node/baseline.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
"baselineCheck": true,
88
"runTest": true,
99
"resolvedInputFiles": [
10-
"emit.ts",
10+
"lib.d.ts",
1111
"decl.ts",
12-
"lib.d.ts"
12+
"emit.ts"
1313
],
1414
"emittedFiles": [
1515
"decl.js",

tests/baselines/reference/project/baseline2/amd/baseline2.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
"baselineCheck": true,
88
"runTest": true,
99
"resolvedInputFiles": [
10-
"dont_emit.ts",
10+
"lib.d.ts",
1111
"decl.ts",
12-
"lib.d.ts"
12+
"dont_emit.ts"
1313
],
1414
"emittedFiles": [
1515
"decl.js",

tests/baselines/reference/project/baseline2/node/baseline2.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
"baselineCheck": true,
88
"runTest": true,
99
"resolvedInputFiles": [
10-
"dont_emit.ts",
10+
"lib.d.ts",
1111
"decl.ts",
12-
"lib.d.ts"
12+
"dont_emit.ts"
1313
],
1414
"emittedFiles": [
1515
"decl.js",

tests/baselines/reference/project/baseline3/amd/baseline3.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"baselineCheck": true,
88
"runTest": true,
99
"resolvedInputFiles": [
10-
"nestedModule.ts",
11-
"lib.d.ts"
10+
"lib.d.ts",
11+
"nestedModule.ts"
1212
],
1313
"emittedFiles": [
1414
"nestedModule.js"

tests/baselines/reference/project/baseline3/node/baseline3.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"baselineCheck": true,
88
"runTest": true,
99
"resolvedInputFiles": [
10-
"nestedModule.ts",
11-
"lib.d.ts"
10+
"lib.d.ts",
11+
"nestedModule.ts"
1212
],
1313
"emittedFiles": [
1414
"nestedModule.js"

tests/baselines/reference/project/cantFindTheModule/amd/cantFindTheModule.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"decl.ts"
66
],
77
"resolvedInputFiles": [
8-
"decl.ts",
9-
"lib.d.ts"
8+
"lib.d.ts",
9+
"decl.ts"
1010
],
1111
"emittedFiles": [
1212
"decl.js"

tests/baselines/reference/project/cantFindTheModule/node/cantFindTheModule.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"decl.ts"
66
],
77
"resolvedInputFiles": [
8-
"decl.ts",
9-
"lib.d.ts"
8+
"lib.d.ts",
9+
"decl.ts"
1010
],
1111
"emittedFiles": [
1212
"decl.js"

tests/baselines/reference/project/circularReferencing/amd/circularReferencing.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
"consume.ts"
66
],
77
"resolvedInputFiles": [
8-
"consume.ts",
8+
"lib.d.ts",
99
"decl.ts",
10-
"lib.d.ts"
10+
"consume.ts"
1111
],
1212
"emittedFiles": [
1313
"decl.js",

0 commit comments

Comments
 (0)