diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts
index 3a628bb62c1..ef118e30fb5 100644
--- a/src/harness/fourslash.ts
+++ b/src/harness/fourslash.ts
@@ -535,6 +535,16 @@ namespace FourSlash {
}
}
+ public verifyGetEmitOutputContentsForCurrentFile(expected: { fileName: string; content: string; }[]): void {
+ let emit = this.languageService.getEmitOutput(this.activeFile.fileName);
+ this.taoInvalidReason = "verifyGetEmitOutputContentsForCurrentFile impossible";
+ assert.equal(emit.outputFiles.length, expected.length, "Number of emit output files");
+ for (let i = 0; i < emit.outputFiles.length; i++) {
+ assert.equal(emit.outputFiles[i].name, expected[i].fileName, "FileName");
+ assert.equal(emit.outputFiles[i].text, expected[i].content, "Content");
+ }
+ }
+
public verifyMemberListContains(symbol: string, text?: string, documentation?: string, kind?: string) {
this.scenarioActions.push("");
this.scenarioActions.push(``);
diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts
index 54e86786d14..98bdccc9ab7 100644
--- a/tests/cases/fourslash/fourslash.ts
+++ b/tests/cases/fourslash/fourslash.ts
@@ -314,6 +314,10 @@ module FourSlashInterface {
FourSlash.currentTestState.verifyGetEmitOutputForCurrentFile(expected);
}
+ public verifyGetEmitOutputContentsForCurrentFile(expected: { fileName: string; content: string; }[]): void {
+ FourSlash.currentTestState.verifyGetEmitOutputContentsForCurrentFile(expected);
+ }
+
public currentParameterHelpArgumentNameIs(name: string) {
FourSlash.currentTestState.verifyCurrentParameterHelpName(name);
}
diff --git a/tests/cases/fourslash/jsFileCompilationDuplicateFunctionImplementation.ts b/tests/cases/fourslash/jsFileCompilationDuplicateFunctionImplementation.ts
new file mode 100644
index 00000000000..f9cc1f9b635
--- /dev/null
+++ b/tests/cases/fourslash/jsFileCompilationDuplicateFunctionImplementation.ts
@@ -0,0 +1,20 @@
+///
+
+// @declaration: true
+// @out: out.js
+// @jsExtensions: js
+// @Filename: b.js
+// @emitThisFile: true
+////function foo() { return 10; }/*1*/
+
+// @Filename: a.ts
+// @emitThisFile: true
+////function foo() { return 30; }/*2*/
+
+goTo.marker("2");
+verify.getSemanticDiagnostics("[]");
+verify.verifyGetEmitOutputContentsForCurrentFile([
+ { fileName: "out.js", content: "function foo() { return 10; }\r\nfunction foo() { return 30; }\r\n" },
+ { fileName: "out.d.ts", content: "" }]);
+goTo.marker("2");
+verify.getSemanticDiagnostics('[\n {\n "message": "Duplicate function implementation.",\n "start": 9,\n "length": 3,\n "category": "error",\n "code": 2393\n }\n]');
\ No newline at end of file