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