Skip to content

Commit 1abedc3

Browse files
committed
Merge pull request microsoft#142 from Microsoft/declFileErrorReporting
Compile the generated decl files and report those errors in the baseline so we can verify the result of dts file for correctness
2 parents 91b8a45 + e0ce0e9 commit 1abedc3

File tree

37 files changed

+829
-135
lines changed

37 files changed

+829
-135
lines changed

src/harness/compilerRunner.ts

Lines changed: 126 additions & 118 deletions
Large diffs are not rendered by default.

src/harness/harness.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -806,10 +806,22 @@ module Harness {
806806
code: string;
807807
}
808808

809-
export function stringEndsWith(str: string, end: string) {
809+
function stringEndsWith(str: string, end: string) {
810810
return str.substr(str.length - end.length) === end;
811811
}
812812

813+
export function isDTS(fileName: string) {
814+
return stringEndsWith(fileName, '.d.ts');
815+
}
816+
817+
export function isJS(fileName: string) {
818+
return stringEndsWith(fileName, '.js');
819+
}
820+
821+
export function isJSMap(fileName: string) {
822+
return stringEndsWith(fileName, '.js.map');
823+
}
824+
813825
/** Contains the code and errors of a compilation and some helper methods to check its status. */
814826
export class CompilerResult {
815827
public files: GeneratedFile[] = [];
@@ -824,13 +836,13 @@ module Harness {
824836

825837
fileResults.forEach(emittedFile => {
826838
var fileObj = { fileName: emittedFile.fileName, code: emittedFile.file };
827-
if (stringEndsWith(emittedFile.fileName, '.d.ts')) {
839+
if (isDTS(emittedFile.fileName)) {
828840
// .d.ts file, add to declFiles emit
829841
this.declFilesCode.push(fileObj);
830-
} else if (stringEndsWith(emittedFile.fileName, '.js')) {
842+
} else if (isJS(emittedFile.fileName)) {
831843
// .js file, add to files
832844
this.files.push(fileObj);
833-
} else if (stringEndsWith(emittedFile.fileName, '.js.map')) {
845+
} else if (isJSMap(emittedFile.fileName)) {
834846
this.sourceMaps.push(fileObj);
835847
} else {
836848
throw new Error('Unrecognized file extension for file ' + emittedFile.fileName);

src/harness/projectsRunner.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,18 @@ class ProjectRunner extends RunnerBase {
175175
// we need to instead create files that can live in the project reference folder
176176
// but make sure extension of these files matches with the filename the compiler asked to write
177177
diskRelativeName = "diskFile" + nonSubfolderDiskFiles++ +
178-
(Harness.Compiler.stringEndsWith(filename, ".d.ts") ? ".d.ts" :
179-
Harness.Compiler.stringEndsWith(filename, ".js") ? ".js" : ".js.map");
178+
(Harness.Compiler.isDTS(filename) ? ".d.ts" :
179+
Harness.Compiler.isJS(filename) ? ".js" : ".js.map");
180180
}
181181

182-
if (Harness.Compiler.stringEndsWith(filename, ".js")) {
182+
if (Harness.Compiler.isJS(filename)) {
183183
// Make sure if there is URl we have it cleaned up
184184
var indexOfSourceMapUrl = data.lastIndexOf("//# sourceMappingURL=");
185185
if (indexOfSourceMapUrl != -1) {
186186
data = data.substring(0, indexOfSourceMapUrl + 21) + cleanProjectUrl(data.substring(indexOfSourceMapUrl + 21));
187187
}
188188
}
189-
else if (Harness.Compiler.stringEndsWith(filename, ".js.map")) {
189+
else if (Harness.Compiler.isJSMap(filename)) {
190190
// Make sure sources list is cleaned
191191
var sourceMapData = JSON.parse(data);
192192
for (var i = 0; i < sourceMapData.sources.length; i++) {
@@ -332,7 +332,7 @@ class ProjectRunner extends RunnerBase {
332332
it('SourceMapRecord for (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, () => {
333333
Harness.Baseline.runBaseline('SourceMapRecord for (' + moduleNameToString(compilerResult.moduleKind) + '): ' + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + testCaseJustName + '.sourcemap.txt', () => {
334334
return Harness.SourceMapRecoder.getSourceMapRecord(compilerResult.sourceMapData, compilerResult.program,
335-
ts.filter(compilerResult.outputFiles, outputFile => Harness.Compiler.stringEndsWith(outputFile.emittedFileName, ".js")));
335+
ts.filter(compilerResult.outputFiles, outputFile => Harness.Compiler.isJS(outputFile.emittedFileName)));
336336
});
337337
});
338338
}

tests/baselines/reference/declFileAmbientExternalModuleWithSingleExportedModule.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,22 @@ declare module "SubModule" {
3333
//// [declFileAmbientExternalModuleWithSingleExportedModule_1.d.ts]
3434
/// <reference path='declFileAmbientExternalModuleWithSingleExportedModule_0.d.ts' />
3535
export declare var x: SubModule.m.m3.c;
36+
37+
38+
//// [DtsFileErrors]
39+
40+
41+
==== tests/cases/compiler/declFileAmbientExternalModuleWithSingleExportedModule_1.d.ts (1 errors) ====
42+
/// <reference path='declFileAmbientExternalModuleWithSingleExportedModule_0.d.ts' />
43+
export declare var x: SubModule.m.m3.c;
44+
~~~~~~~~~~~~~~~~
45+
!!! Cannot find name 'SubModule'.
46+
47+
==== tests/cases/compiler/declFileAmbientExternalModuleWithSingleExportedModule_0.d.ts (0 errors) ====
48+
declare module "SubModule" {
49+
module m {
50+
module m3 {
51+
}
52+
}
53+
}
54+

tests/baselines/reference/declFileExportAssignmentOfGenericInterface.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,19 @@ interface Foo<T> {
2929
export = Foo;
3030
//// [declFileExportAssignmentOfGenericInterface_1.d.ts]
3131
export declare var x: a<a<string>>;
32+
33+
34+
//// [DtsFileErrors]
35+
36+
37+
==== tests/cases/compiler/declFileExportAssignmentOfGenericInterface_1.d.ts (1 errors) ====
38+
export declare var x: a<a<string>>;
39+
~~~~~~~~~~~~
40+
!!! Cannot find name 'a'.
41+
42+
==== tests/cases/compiler/declFileExportAssignmentOfGenericInterface_0.d.ts (0 errors) ====
43+
interface Foo<T> {
44+
a: string;
45+
}
46+
export = Foo;
47+

tests/baselines/reference/declFileExportImportChain.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,32 @@ export = b;
7575
export import b1 = require("declFileExportImportChain_b1");
7676
//// [declFileExportImportChain_d.d.ts]
7777
export declare var x: m1.m2.c1;
78+
79+
80+
//// [DtsFileErrors]
81+
82+
83+
==== tests/cases/compiler/declFileExportImportChain_d.d.ts (1 errors) ====
84+
export declare var x: m1.m2.c1;
85+
~~~~~~~~
86+
!!! Cannot find name 'm1'.
87+
88+
==== tests/cases/compiler/declFileExportImportChain_a.d.ts (0 errors) ====
89+
declare module m1 {
90+
module m2 {
91+
class c1 {
92+
}
93+
}
94+
}
95+
export = m1;
96+
97+
==== tests/cases/compiler/declFileExportImportChain_b.d.ts (0 errors) ====
98+
export import a = require("declFileExportImportChain_a");
99+
100+
==== tests/cases/compiler/declFileExportImportChain_b1.d.ts (0 errors) ====
101+
import b = require("declFileExportImportChain_b");
102+
export = b;
103+
104+
==== tests/cases/compiler/declFileExportImportChain_c.d.ts (0 errors) ====
105+
export import b1 = require("declFileExportImportChain_b1");
106+

tests/baselines/reference/declFileExportImportChain2.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,29 @@ export = a;
6666
export import b = require("declFileExportImportChain2_b");
6767
//// [declFileExportImportChain2_d.d.ts]
6868
export declare var x: m1.m2.c1;
69+
70+
71+
//// [DtsFileErrors]
72+
73+
74+
==== tests/cases/compiler/declFileExportImportChain2_d.d.ts (1 errors) ====
75+
export declare var x: m1.m2.c1;
76+
~~~~~~~~
77+
!!! Cannot find name 'm1'.
78+
79+
==== tests/cases/compiler/declFileExportImportChain2_a.d.ts (0 errors) ====
80+
declare module m1 {
81+
module m2 {
82+
class c1 {
83+
}
84+
}
85+
}
86+
export = m1;
87+
88+
==== tests/cases/compiler/declFileExportImportChain2_b.d.ts (0 errors) ====
89+
import a = require("declFileExportImportChain2_a");
90+
export = a;
91+
92+
==== tests/cases/compiler/declFileExportImportChain2_c.d.ts (0 errors) ====
93+
export import b = require("declFileExportImportChain2_b");
94+

tests/baselines/reference/declFileGenericType2.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,45 @@ declare module templa.dom.mvc.composite {
113113
constructor();
114114
}
115115
}
116+
117+
118+
//// [DtsFileErrors]
119+
120+
121+
==== tests/cases/compiler/declFileGenericType2.d.ts (6 errors) ====
122+
declare module templa.mvc {
123+
}
124+
declare module templa.mvc {
125+
}
126+
declare module templa.mvc {
127+
}
128+
declare module templa.mvc.composite {
129+
}
130+
declare module templa.dom.mvc {
131+
interface IElementController<ModelType extends templa.mvc.IModel> extends templa.mvc.IController<ModelType> {
132+
~~~~~~~~~~~~~~~~~
133+
!!! Module 'templa.mvc' has no exported member 'IModel'.
134+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
135+
!!! Module 'templa.mvc' has no exported member 'IController'.
136+
}
137+
}
138+
declare module templa.dom.mvc {
139+
class AbstractElementController<ModelType extends templa.mvc.IModel> extends templa.mvc.AbstractController<ModelType> implements IElementController<ModelType> {
140+
~~~~~~~~~~~~~~~~~
141+
!!! Module 'templa.mvc' has no exported member 'IModel'.
142+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
143+
!!! Module 'templa.mvc' has no exported member 'AbstractController'.
144+
constructor();
145+
}
146+
}
147+
declare module templa.dom.mvc.composite {
148+
class AbstractCompositeElementController<ModelType extends templa.mvc.composite.ICompositeControllerModel> extends AbstractElementController<ModelType> {
149+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
150+
!!! Module 'templa.mvc.composite' has no exported member 'ICompositeControllerModel'.
151+
_controllers: templa.mvc.IController<templa.mvc.IModel>[];
152+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
153+
!!! Module 'templa.mvc' has no exported member 'IController'.
154+
constructor();
155+
}
156+
}
157+

tests/baselines/reference/declFileImportModuleWithExportAssignment.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,38 @@ export declare var a: {
5757
test1: a1.connectModule;
5858
test2(): a1.connectModule;
5959
};
60+
61+
62+
//// [DtsFileErrors]
63+
64+
65+
==== tests/cases/compiler/declFileImportModuleWithExportAssignment_1.d.ts (3 errors) ====
66+
export declare var a: {
67+
(): a1.connectExport;
68+
~~~~~~~~~~~~~~~~
69+
!!! Cannot find name 'a1'.
70+
test1: a1.connectModule;
71+
~~~~~~~~~~~~~~~~
72+
!!! Cannot find name 'a1'.
73+
test2(): a1.connectModule;
74+
~~~~~~~~~~~~~~~~
75+
!!! Cannot find name 'a1'.
76+
};
77+
78+
==== tests/cases/compiler/declFileImportModuleWithExportAssignment_0.d.ts (0 errors) ====
79+
declare module m2 {
80+
interface connectModule {
81+
(res: any, req: any, next: any): void;
82+
}
83+
interface connectExport {
84+
use: (mod: connectModule) => connectExport;
85+
listen: (port: number) => void;
86+
}
87+
}
88+
declare var m2: {
89+
(): m2.connectExport;
90+
test1: m2.connectModule;
91+
test2(): m2.connectModule;
92+
};
93+
export = m2;
94+

tests/baselines/reference/declFileImportedTypeUseInTypeArgPosition.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,19 @@ declare module 'mod1' {
2929
declare module 'moo' {
3030
var p: List<x.Foo>;
3131
}
32+
33+
34+
//// [DtsFileErrors]
35+
36+
37+
==== tests/cases/compiler/declFileImportedTypeUseInTypeArgPosition.d.ts (1 errors) ====
38+
declare class List<T> {
39+
}
40+
declare module 'mod1' {
41+
}
42+
declare module 'moo' {
43+
var p: List<x.Foo>;
44+
~~~~~
45+
!!! Cannot find name 'x'.
46+
}
47+

0 commit comments

Comments
 (0)