diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index eb329c67b0b..89ab4027ed8 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -33,7 +33,9 @@ namespace ts { export function getDeclarationDiagnostics(host: EmitHost, resolver: EmitResolver, targetSourceFile: SourceFile): Diagnostic[] { let diagnostics: Diagnostic[] = []; let { declarationFilePath } = getEmitFileNames(targetSourceFile, host); - emitDeclarations(host, resolver, diagnostics, declarationFilePath, targetSourceFile); + if (declarationFilePath) { + emitDeclarations(host, resolver, diagnostics, declarationFilePath, targetSourceFile); + } return diagnostics; } @@ -105,7 +107,7 @@ namespace ts { // Emit references corresponding to this file let emittedReferencedFiles: SourceFile[] = []; forEach(host.getSourceFiles(), sourceFile => { - if (!isExternalModuleOrDeclarationFile(sourceFile)) { + if (!isExternalModuleOrDeclarationFile(sourceFile) && !isJavaScript(sourceFile.fileName)) { // Check what references need to be added if (!compilerOptions.noResolve) { forEach(sourceFile.referencedFiles, fileReference => { @@ -1590,9 +1592,17 @@ namespace ts { } function writeReferencePath(referencedFile: SourceFile) { - let declFileName = referencedFile.flags & NodeFlags.DeclarationFile - ? referencedFile.fileName // Declaration file, use declaration file name - : getEmitFileNames(referencedFile, host).declarationFilePath; // declaration file name + let declFileName: string; + if (referencedFile.flags & NodeFlags.DeclarationFile) { + // Declaration file, use declaration file name + declFileName = referencedFile.fileName; + } + else { + // declaration file name + let { declarationFilePath, jsFilePath } = getEmitFileNames(referencedFile, host); + Debug.assert(!!declarationFilePath || isJavaScript(referencedFile.fileName), "Declaration file is not present only for javascript files"); + declFileName = declarationFilePath || jsFilePath; + } declFileName = getRelativePathToDirectoryOrUrl( getDirectoryPath(normalizeSlashes(declarationFilePath)), diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 872c9c74bec..cd6525a6bc3 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -8158,7 +8158,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi emitJavaScript(jsFilePath, sourceMapFilePath, sourceFile); } - if (compilerOptions.declaration) { + if (declarationFilePath) { emitSkipped = writeDeclarationFile(declarationFilePath, sourceFile, host, resolver, diagnostics) || emitSkipped; } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index e569c69cccf..a191c9f3e1c 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1272,7 +1272,7 @@ namespace ts { if (sourceMapFilePath) { emitFilesSeen[sourceMapFilePath] = [file]; } - if (options.declaration) { + if (declarationFilePath) { emitFilesSeen[declarationFilePath] = [file]; } } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 5fe6c8d38a6..d5c60805d70 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1797,7 +1797,7 @@ namespace ts { return { jsFilePath, sourceMapFilePath: getSourceMapFilePath(jsFilePath, options), - declarationFilePath: getDeclarationEmitFilePath(jsFilePath, options) + declarationFilePath: !isJavaScript(sourceFile.fileName) ? getDeclarationEmitFilePath(jsFilePath, options) : undefined }; } else if (options.outFile || options.out) { diff --git a/tests/baselines/reference/jsFileCompilationDuplicateVariable.js b/tests/baselines/reference/jsFileCompilationDuplicateVariable.js index 3e3d0b9802a..a70637bc7c0 100644 --- a/tests/baselines/reference/jsFileCompilationDuplicateVariable.js +++ b/tests/baselines/reference/jsFileCompilationDuplicateVariable.js @@ -13,4 +13,3 @@ var x = "hello"; // No error is recorded here and declaration file will show thi //// [out.d.ts] declare var x: number; -declare var x: number; diff --git a/tests/baselines/reference/jsFileCompilationDuplicateVariableErrorReported.js b/tests/baselines/reference/jsFileCompilationDuplicateVariableErrorReported.js index 7b2643c13d3..fd9da7c7106 100644 --- a/tests/baselines/reference/jsFileCompilationDuplicateVariableErrorReported.js +++ b/tests/baselines/reference/jsFileCompilationDuplicateVariableErrorReported.js @@ -13,4 +13,3 @@ var x = 10; // Error reported so no declaration file generated? //// [out.d.ts] declare var x: string; -declare var x: string; diff --git a/tests/baselines/reference/jsFileCompilationEmitDeclarations.js b/tests/baselines/reference/jsFileCompilationEmitDeclarations.js index c6711e4e85f..d45ae325b0a 100644 --- a/tests/baselines/reference/jsFileCompilationEmitDeclarations.js +++ b/tests/baselines/reference/jsFileCompilationEmitDeclarations.js @@ -22,4 +22,3 @@ function foo() { //// [out.d.ts] declare class c { } -declare function foo(): void; diff --git a/tests/baselines/reference/jsFileCompilationEmitTrippleSlashReference.js b/tests/baselines/reference/jsFileCompilationEmitTrippleSlashReference.js index 04f36213b1b..2d7d2743805 100644 --- a/tests/baselines/reference/jsFileCompilationEmitTrippleSlashReference.js +++ b/tests/baselines/reference/jsFileCompilationEmitTrippleSlashReference.js @@ -29,5 +29,3 @@ function foo() { //// [out.d.ts] declare class c { } -declare function bar(): void; -declare function foo(): void; diff --git a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.errors.txt b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.errors.txt index 9be6b3f1ccd..273717d151c 100644 --- a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.errors.txt +++ b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.errors.txt @@ -8,7 +8,7 @@ error TS5055: Cannot write file 'tests/cases/compiler/c.js' which is one of the ==== tests/cases/compiler/b.ts (0 errors) ==== /// - // error on above reference path when emitting declarations + // b.d.ts should have c.js as the reference path since we dont emit declarations for js files function foo() { } diff --git a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.js b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.js index 07d6fb812c0..cf2caab3600 100644 --- a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.js +++ b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.js @@ -6,7 +6,7 @@ class c { //// [b.ts] /// -// error on above reference path when emitting declarations +// b.d.ts should have c.js as the reference path since we dont emit declarations for js files function foo() { } @@ -22,7 +22,7 @@ var c = (function () { })(); //// [b.js] /// -// error on above reference path when emitting declarations +// b.d.ts should have c.js as the reference path since we dont emit declarations for js files function foo() { } @@ -30,8 +30,6 @@ function foo() { //// [a.d.ts] declare class c { } -//// [c.d.ts] -declare function bar(): void; //// [b.d.ts] -/// +/// declare function foo(): void; diff --git a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOut.js b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOut.js index 0d1939d7208..67989f3e3e7 100644 --- a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOut.js +++ b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOut.js @@ -31,5 +31,4 @@ function foo() { //// [out.d.ts] declare class c { } -declare function bar(): void; declare function foo(): void; diff --git a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.symbols b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.symbols new file mode 100644 index 00000000000..424fd85c165 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.symbols @@ -0,0 +1,16 @@ +=== tests/cases/compiler/a.ts === +class c { +>c : Symbol(c, Decl(a.ts, 0, 0)) +} + +=== tests/cases/compiler/b.ts === +/// +// b.d.ts should have c.js as the reference path since we dont emit declarations for js files +function foo() { +>foo : Symbol(foo, Decl(b.ts, 0, 0)) +} + +=== tests/cases/compiler/c.js === +function bar() { +>bar : Symbol(bar, Decl(c.js, 0, 0)) +} diff --git a/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.types b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.types new file mode 100644 index 00000000000..f8b82383ac4 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.types @@ -0,0 +1,16 @@ +=== tests/cases/compiler/a.ts === +class c { +>c : c +} + +=== tests/cases/compiler/b.ts === +/// +// b.d.ts should have c.js as the reference path since we dont emit declarations for js files +function foo() { +>foo : () => void +} + +=== tests/cases/compiler/c.js === +function bar() { +>bar : () => void +} diff --git a/tests/baselines/reference/jsFileCompilationLetDeclarationOrder.js b/tests/baselines/reference/jsFileCompilationLetDeclarationOrder.js index 15a1e8d7533..16e4b7a3011 100644 --- a/tests/baselines/reference/jsFileCompilationLetDeclarationOrder.js +++ b/tests/baselines/reference/jsFileCompilationLetDeclarationOrder.js @@ -17,5 +17,4 @@ a = 10; //// [out.d.ts] -declare let a: number; declare let b: number; diff --git a/tests/baselines/reference/jsFileCompilationLetDeclarationOrder2.js b/tests/baselines/reference/jsFileCompilationLetDeclarationOrder2.js index 641a89c1c50..890b1c22f71 100644 --- a/tests/baselines/reference/jsFileCompilationLetDeclarationOrder2.js +++ b/tests/baselines/reference/jsFileCompilationLetDeclarationOrder2.js @@ -17,4 +17,3 @@ b = 30; //// [out.d.ts] declare let b: number; -declare let a: number; diff --git a/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/amd/test.d.ts b/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/amd/test.d.ts index bbae04a30bf..4c0b8989316 100644 --- a/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/amd/test.d.ts +++ b/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/amd/test.d.ts @@ -1,2 +1 @@ declare var test: number; -declare var test2: number; diff --git a/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/node/test.d.ts b/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/node/test.d.ts index bbae04a30bf..4c0b8989316 100644 --- a/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/node/test.d.ts +++ b/tests/baselines/reference/project/jsFileCompilationDifferentNamesNotSpecifiedWithAllowJs/node/test.d.ts @@ -1,2 +1 @@ declare var test: number; -declare var test2: number; diff --git a/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/amd/test.d.ts b/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/amd/test.d.ts index bbae04a30bf..4c0b8989316 100644 --- a/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/amd/test.d.ts +++ b/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/amd/test.d.ts @@ -1,2 +1 @@ declare var test: number; -declare var test2: number; diff --git a/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/node/test.d.ts b/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/node/test.d.ts index bbae04a30bf..4c0b8989316 100644 --- a/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/node/test.d.ts +++ b/tests/baselines/reference/project/jsFileCompilationDifferentNamesSpecifiedWithAllowJs/node/test.d.ts @@ -1,2 +1 @@ declare var test: number; -declare var test2: number; diff --git a/tests/cases/compiler/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.ts b/tests/cases/compiler/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.ts index 41d87d5f39b..1741e3c2802 100644 --- a/tests/cases/compiler/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.ts +++ b/tests/cases/compiler/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithNoOut.ts @@ -6,7 +6,7 @@ class c { // @filename: b.ts /// -// error on above reference path when emitting declarations +// b.d.ts should have c.js as the reference path since we dont emit declarations for js files function foo() { } diff --git a/tests/cases/compiler/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.ts b/tests/cases/compiler/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.ts new file mode 100644 index 00000000000..64e009c2515 --- /dev/null +++ b/tests/cases/compiler/jsFileCompilationErrorOnDeclarationsWithJsFileReferenceWithOutDir.ts @@ -0,0 +1,16 @@ +// @allowJs: true +// @declaration: true +// @outDir: outDir +// @filename: a.ts +class c { +} + +// @filename: b.ts +/// +// b.d.ts should have c.js as the reference path since we dont emit declarations for js files +function foo() { +} + +// @filename: c.js +function bar() { +} \ No newline at end of file