From 094e110cb1f2c1e7810609209f042eb1160abcc7 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 26 Oct 2016 16:18:50 -0700 Subject: [PATCH 1/2] only emit /// types reference for a symbol in d.ts file if all declarations of a symbol come from type reference directives --- src/compiler/checker.ts | 4 ++ .../declarationFilesWithTypeReferences1.js | 40 ++++++++++++++++++ ...eclarationFilesWithTypeReferences1.symbols | 18 ++++++++ .../declarationFilesWithTypeReferences1.types | 18 ++++++++ .../declarationFilesWithTypeReferences2.js | 42 +++++++++++++++++++ ...eclarationFilesWithTypeReferences2.symbols | 18 ++++++++ .../declarationFilesWithTypeReferences2.types | 18 ++++++++ .../declarationFilesWithTypeReferences3.js | 24 +++++++++++ ...eclarationFilesWithTypeReferences3.symbols | 18 ++++++++ .../declarationFilesWithTypeReferences3.types | 18 ++++++++ .../declarationFilesWithTypeReferences4.js | 23 ++++++++++ ...eclarationFilesWithTypeReferences4.symbols | 18 ++++++++ .../declarationFilesWithTypeReferences4.types | 18 ++++++++ .../declarationFilesWithTypeReferences1.ts | 14 +++++++ .../declarationFilesWithTypeReferences2.ts | 14 +++++++ .../declarationFilesWithTypeReferences3.ts | 12 ++++++ .../declarationFilesWithTypeReferences4.ts | 12 ++++++ 17 files changed, 329 insertions(+) create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences1.js create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences1.symbols create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences1.types create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences2.js create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences2.symbols create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences2.types create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences3.js create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences3.symbols create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences3.types create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences4.js create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences4.symbols create mode 100644 tests/baselines/reference/declarationFilesWithTypeReferences4.types create mode 100644 tests/cases/compiler/declarationFilesWithTypeReferences1.ts create mode 100644 tests/cases/compiler/declarationFilesWithTypeReferences2.ts create mode 100644 tests/cases/compiler/declarationFilesWithTypeReferences3.ts create mode 100644 tests/cases/compiler/declarationFilesWithTypeReferences4.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3c98513423af2..4fa146584943b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19505,6 +19505,10 @@ namespace ts { if (typeReferenceDirective) { (typeReferenceDirectives || (typeReferenceDirectives = [])).push(typeReferenceDirective); } + else { + // found at least one entry that does not originate from type reference directive + return undefined; + } } } return typeReferenceDirectives; diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences1.js b/tests/baselines/reference/declarationFilesWithTypeReferences1.js new file mode 100644 index 0000000000000..4c5a635ba11b6 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences1.js @@ -0,0 +1,40 @@ +//// [tests/cases/compiler/declarationFilesWithTypeReferences1.ts] //// + +//// [index.d.ts] + +interface Error { + stack2: string; +} + +//// [app.ts] + +function foo(): Error { + return undefined; +} + +//// [app.js] +function foo() { + return undefined; +} + + +//// [app.d.ts] +declare function foo(): Error; + + +//// [DtsFileErrors] + + +error TS2688: Cannot find type definition file for 'node'. + + +!!! error TS2688: Cannot find type definition file for 'node'. +==== /node_modules/@types/node/index.d.ts (0 errors) ==== + + interface Error { + stack2: string; + } + +==== /app.d.ts (0 errors) ==== + declare function foo(): Error; + \ No newline at end of file diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences1.symbols b/tests/baselines/reference/declarationFilesWithTypeReferences1.symbols new file mode 100644 index 0000000000000..3d3df3c162280 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences1.symbols @@ -0,0 +1,18 @@ +=== /node_modules/@types/node/index.d.ts === + +interface Error { +>Error : Symbol(Error, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(index.d.ts, 0, 0)) + + stack2: string; +>stack2 : Symbol(Error.stack2, Decl(index.d.ts, 1, 17)) +} + +=== /app.ts === + +function foo(): Error { +>foo : Symbol(foo, Decl(app.ts, 0, 0)) +>Error : Symbol(Error, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(index.d.ts, 0, 0)) + + return undefined; +>undefined : Symbol(undefined) +} diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences1.types b/tests/baselines/reference/declarationFilesWithTypeReferences1.types new file mode 100644 index 0000000000000..7837b7b3a6c0e --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences1.types @@ -0,0 +1,18 @@ +=== /node_modules/@types/node/index.d.ts === + +interface Error { +>Error : Error + + stack2: string; +>stack2 : string +} + +=== /app.ts === + +function foo(): Error { +>foo : () => Error +>Error : Error + + return undefined; +>undefined : undefined +} diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences2.js b/tests/baselines/reference/declarationFilesWithTypeReferences2.js new file mode 100644 index 0000000000000..5f52189a033b8 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences2.js @@ -0,0 +1,42 @@ +//// [tests/cases/compiler/declarationFilesWithTypeReferences2.ts] //// + +//// [index.d.ts] + +interface Error2 { + stack2: string; +} + +//// [app.ts] + +function foo(): Error2 { + return undefined; +} + +//// [app.js] +function foo() { + return undefined; +} + + +//// [app.d.ts] +/// +declare function foo(): Error2; + + +//// [DtsFileErrors] + + +error TS2688: Cannot find type definition file for 'node'. + + +!!! error TS2688: Cannot find type definition file for 'node'. +==== /node_modules/@types/node/index.d.ts (0 errors) ==== + + interface Error2 { + stack2: string; + } + +==== /app.d.ts (0 errors) ==== + /// + declare function foo(): Error2; + \ No newline at end of file diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences2.symbols b/tests/baselines/reference/declarationFilesWithTypeReferences2.symbols new file mode 100644 index 0000000000000..dc6d8a3a6de2b --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences2.symbols @@ -0,0 +1,18 @@ +=== /node_modules/@types/node/index.d.ts === + +interface Error2 { +>Error2 : Symbol(Error2, Decl(index.d.ts, 0, 0)) + + stack2: string; +>stack2 : Symbol(Error2.stack2, Decl(index.d.ts, 1, 18)) +} + +=== /app.ts === + +function foo(): Error2 { +>foo : Symbol(foo, Decl(app.ts, 0, 0)) +>Error2 : Symbol(Error2, Decl(index.d.ts, 0, 0)) + + return undefined; +>undefined : Symbol(undefined) +} diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences2.types b/tests/baselines/reference/declarationFilesWithTypeReferences2.types new file mode 100644 index 0000000000000..c56f4ba6a67d2 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences2.types @@ -0,0 +1,18 @@ +=== /node_modules/@types/node/index.d.ts === + +interface Error2 { +>Error2 : Error2 + + stack2: string; +>stack2 : string +} + +=== /app.ts === + +function foo(): Error2 { +>foo : () => Error2 +>Error2 : Error2 + + return undefined; +>undefined : undefined +} diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences3.js b/tests/baselines/reference/declarationFilesWithTypeReferences3.js new file mode 100644 index 0000000000000..3a18859c61090 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences3.js @@ -0,0 +1,24 @@ +//// [tests/cases/compiler/declarationFilesWithTypeReferences3.ts] //// + +//// [index.d.ts] + +interface Error2 { + stack2: string; +} + +//// [app.ts] +/// +function foo(): Error2 { + return undefined; +} + +//// [app.js] +/// +function foo() { + return undefined; +} + + +//// [app.d.ts] +/// +declare function foo(): Error2; diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences3.symbols b/tests/baselines/reference/declarationFilesWithTypeReferences3.symbols new file mode 100644 index 0000000000000..78335f988e9b7 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences3.symbols @@ -0,0 +1,18 @@ +=== /a/node_modules/@types/node/index.d.ts === + +interface Error2 { +>Error2 : Symbol(Error2, Decl(index.d.ts, 0, 0)) + + stack2: string; +>stack2 : Symbol(Error2.stack2, Decl(index.d.ts, 1, 18)) +} + +=== /a/app.ts === +/// +function foo(): Error2 { +>foo : Symbol(foo, Decl(app.ts, 0, 0)) +>Error2 : Symbol(Error2, Decl(index.d.ts, 0, 0)) + + return undefined; +>undefined : Symbol(undefined) +} diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences3.types b/tests/baselines/reference/declarationFilesWithTypeReferences3.types new file mode 100644 index 0000000000000..9ac0105890abc --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences3.types @@ -0,0 +1,18 @@ +=== /a/node_modules/@types/node/index.d.ts === + +interface Error2 { +>Error2 : Error2 + + stack2: string; +>stack2 : string +} + +=== /a/app.ts === +/// +function foo(): Error2 { +>foo : () => Error2 +>Error2 : Error2 + + return undefined; +>undefined : undefined +} diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences4.js b/tests/baselines/reference/declarationFilesWithTypeReferences4.js new file mode 100644 index 0000000000000..b45860be9bb82 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences4.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/declarationFilesWithTypeReferences4.ts] //// + +//// [index.d.ts] + +interface Error { + stack2: string; +} + +//// [app.ts] +/// +function foo(): Error { + return undefined; +} + +//// [app.js] +/// +function foo() { + return undefined; +} + + +//// [app.d.ts] +declare function foo(): Error; diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences4.symbols b/tests/baselines/reference/declarationFilesWithTypeReferences4.symbols new file mode 100644 index 0000000000000..216bd2a6a1c7d --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences4.symbols @@ -0,0 +1,18 @@ +=== /a/node_modules/@types/node/index.d.ts === + +interface Error { +>Error : Symbol(Error, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(index.d.ts, 0, 0)) + + stack2: string; +>stack2 : Symbol(Error.stack2, Decl(index.d.ts, 1, 17)) +} + +=== /a/app.ts === +/// +function foo(): Error { +>foo : Symbol(foo, Decl(app.ts, 0, 0)) +>Error : Symbol(Error, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --), Decl(index.d.ts, 0, 0)) + + return undefined; +>undefined : Symbol(undefined) +} diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences4.types b/tests/baselines/reference/declarationFilesWithTypeReferences4.types new file mode 100644 index 0000000000000..0ae603716b100 --- /dev/null +++ b/tests/baselines/reference/declarationFilesWithTypeReferences4.types @@ -0,0 +1,18 @@ +=== /a/node_modules/@types/node/index.d.ts === + +interface Error { +>Error : Error + + stack2: string; +>stack2 : string +} + +=== /a/app.ts === +/// +function foo(): Error { +>foo : () => Error +>Error : Error + + return undefined; +>undefined : undefined +} diff --git a/tests/cases/compiler/declarationFilesWithTypeReferences1.ts b/tests/cases/compiler/declarationFilesWithTypeReferences1.ts new file mode 100644 index 0000000000000..e499543057e97 --- /dev/null +++ b/tests/cases/compiler/declarationFilesWithTypeReferences1.ts @@ -0,0 +1,14 @@ +// @types: node +// @declaration: true +// @currentDirectory: / + +// @filename: /node_modules/@types/node/index.d.ts +interface Error { + stack2: string; +} + +// @filename: /app.ts + +function foo(): Error { + return undefined; +} \ No newline at end of file diff --git a/tests/cases/compiler/declarationFilesWithTypeReferences2.ts b/tests/cases/compiler/declarationFilesWithTypeReferences2.ts new file mode 100644 index 0000000000000..0514895563774 --- /dev/null +++ b/tests/cases/compiler/declarationFilesWithTypeReferences2.ts @@ -0,0 +1,14 @@ +// @types: node +// @declaration: true +// @currentDirectory: / + +// @filename: /node_modules/@types/node/index.d.ts +interface Error2 { + stack2: string; +} + +// @filename: /app.ts + +function foo(): Error2 { + return undefined; +} \ No newline at end of file diff --git a/tests/cases/compiler/declarationFilesWithTypeReferences3.ts b/tests/cases/compiler/declarationFilesWithTypeReferences3.ts new file mode 100644 index 0000000000000..6653fb11f8b44 --- /dev/null +++ b/tests/cases/compiler/declarationFilesWithTypeReferences3.ts @@ -0,0 +1,12 @@ +// @declaration: true + +// @filename: /a/node_modules/@types/node/index.d.ts +interface Error2 { + stack2: string; +} + +// @filename: /a/app.ts +/// +function foo(): Error2 { + return undefined; +} \ No newline at end of file diff --git a/tests/cases/compiler/declarationFilesWithTypeReferences4.ts b/tests/cases/compiler/declarationFilesWithTypeReferences4.ts new file mode 100644 index 0000000000000..4719feb56642e --- /dev/null +++ b/tests/cases/compiler/declarationFilesWithTypeReferences4.ts @@ -0,0 +1,12 @@ +// @declaration: true + +// @filename: /a/node_modules/@types/node/index.d.ts +interface Error { + stack2: string; +} + +// @filename: /a/app.ts +/// +function foo(): Error { + return undefined; +} \ No newline at end of file From 1b57cba3e24f6dff3905de4c593affa42321fd97 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 26 Oct 2016 17:03:28 -0700 Subject: [PATCH 2/2] pass proper value for current directory when compiling .d.ts files --- src/harness/harness.ts | 2 +- .../declarationFilesWithTypeReferences1.js | 18 ------------------ .../declarationFilesWithTypeReferences2.js | 19 ------------------- 3 files changed, 1 insertion(+), 38 deletions(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 409ab9e2fcc9a..47b76793af6af 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1238,7 +1238,7 @@ namespace Harness { if (options.declaration && result.errors.length === 0 && result.declFilesCode.length > 0) { ts.forEach(inputFiles, file => addDtsFile(file, declInputFiles)); ts.forEach(otherFiles, file => addDtsFile(file, declOtherFiles)); - const output = compileFiles(declInputFiles, declOtherFiles, harnessSettings, options, currentDirectory); + const output = compileFiles(declInputFiles, declOtherFiles, harnessSettings, options, currentDirectory || harnessSettings["currentDirectory"]); return { declInputFiles, declOtherFiles, declResult: output.result }; } diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences1.js b/tests/baselines/reference/declarationFilesWithTypeReferences1.js index 4c5a635ba11b6..b4695f28f134f 100644 --- a/tests/baselines/reference/declarationFilesWithTypeReferences1.js +++ b/tests/baselines/reference/declarationFilesWithTypeReferences1.js @@ -20,21 +20,3 @@ function foo() { //// [app.d.ts] declare function foo(): Error; - - -//// [DtsFileErrors] - - -error TS2688: Cannot find type definition file for 'node'. - - -!!! error TS2688: Cannot find type definition file for 'node'. -==== /node_modules/@types/node/index.d.ts (0 errors) ==== - - interface Error { - stack2: string; - } - -==== /app.d.ts (0 errors) ==== - declare function foo(): Error; - \ No newline at end of file diff --git a/tests/baselines/reference/declarationFilesWithTypeReferences2.js b/tests/baselines/reference/declarationFilesWithTypeReferences2.js index 5f52189a033b8..b85dcc4510757 100644 --- a/tests/baselines/reference/declarationFilesWithTypeReferences2.js +++ b/tests/baselines/reference/declarationFilesWithTypeReferences2.js @@ -21,22 +21,3 @@ function foo() { //// [app.d.ts] /// declare function foo(): Error2; - - -//// [DtsFileErrors] - - -error TS2688: Cannot find type definition file for 'node'. - - -!!! error TS2688: Cannot find type definition file for 'node'. -==== /node_modules/@types/node/index.d.ts (0 errors) ==== - - interface Error2 { - stack2: string; - } - -==== /app.d.ts (0 errors) ==== - /// - declare function foo(): Error2; - \ No newline at end of file