diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 95103c1518e56..db6f608af8b10 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -423,6 +423,7 @@ namespace ts { const jsObjectLiteralIndexInfo = createIndexInfo(anyType, /*isReadonly*/ false); const globals = createSymbolTable(); + let amalgamatedDuplicates: Map<{ firstFile: SourceFile, secondFile: SourceFile, firstFileInstances: Map<{ instances: Node[], blockScoped: boolean }>, secondFileInstances: Map<{ instances: Node[], blockScoped: boolean }> }> | undefined; const reverseMappedCache = createMap(); let ambientModulesCache: Symbol[] | undefined; /** @@ -833,6 +834,28 @@ namespace ts { return emitResolver; } + function lookupOrIssueError(location: Node | undefined, message: DiagnosticMessage, arg0?: string | number, arg1?: string | number, arg2?: string | number, arg3?: string | number): Diagnostic { + const diagnostic = location + ? createDiagnosticForNode(location, message, arg0, arg1, arg2, arg3) + : createCompilerDiagnostic(message, arg0, arg1, arg2, arg3); + const existing = diagnostics.lookup(diagnostic); + if (existing) { + return existing; + } + else { + diagnostics.add(diagnostic); + return diagnostic; + } + } + + function addRelatedInfo(diagnostic: Diagnostic, ...relatedInformation: DiagnosticRelatedInformation[]) { + if (!diagnostic.relatedInformation) { + diagnostic.relatedInformation = []; + } + diagnostic.relatedInformation.push(...relatedInformation); + return diagnostic; + } + function error(location: Node | undefined, message: DiagnosticMessage, arg0?: string | number, arg1?: string | number, arg2?: string | number, arg3?: string | number): Diagnostic { const diagnostic = location ? createDiagnosticForNode(location, message, arg0, arg1, arg2, arg3) @@ -943,23 +966,63 @@ namespace ts { error(getNameOfDeclaration(source.declarations[0]), Diagnostics.Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity, symbolToString(target)); } else { - const message = target.flags & SymbolFlags.Enum || source.flags & SymbolFlags.Enum + const isEitherEnum = !!(target.flags & SymbolFlags.Enum || source.flags & SymbolFlags.Enum); + const isEitherBlockScoped = !!(target.flags & SymbolFlags.BlockScopedVariable || source.flags & SymbolFlags.BlockScopedVariable); + const message = isEitherEnum ? Diagnostics.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations - : target.flags & SymbolFlags.BlockScopedVariable || source.flags & SymbolFlags.BlockScopedVariable + : isEitherBlockScoped ? Diagnostics.Cannot_redeclare_block_scoped_variable_0 : Diagnostics.Duplicate_identifier_0; - forEach(source.declarations, node => { - const errorNode = (getJavascriptInitializer(node, /*isPrototypeAssignment*/ false) ? getOuterNameOfJsInitializer(node) : getNameOfDeclaration(node)) || node; - error(errorNode, message, symbolToString(source)); - }); - forEach(target.declarations, node => { - const errorNode = (getJavascriptInitializer(node, /*isPrototypeAssignment*/ false) ? getOuterNameOfJsInitializer(node) : getNameOfDeclaration(node)) || node; - error(errorNode, message, symbolToString(source)); - }); + const sourceSymbolFile = source.declarations && getSourceFileOfNode(source.declarations[0]); + const targetSymbolFile = target.declarations && getSourceFileOfNode(target.declarations[0]); + + // Collect top-level duplicate identifier errors into one mapping, so we can then merge their diagnostics if there are a bunch + if (sourceSymbolFile && targetSymbolFile && amalgamatedDuplicates && !isEitherEnum && sourceSymbolFile !== targetSymbolFile) { + const firstFile = comparePaths(sourceSymbolFile.path, targetSymbolFile.path) === Comparison.LessThan ? sourceSymbolFile : targetSymbolFile; + const secondFile = firstFile === sourceSymbolFile ? targetSymbolFile : sourceSymbolFile; + const cacheKey = `${firstFile.path}|${secondFile.path}`; + const existing = amalgamatedDuplicates.get(cacheKey) || { firstFile, secondFile, firstFileInstances: createMap(), secondFileInstances: createMap() }; + const symbolName = symbolToString(source); + const firstInstanceList = existing.firstFileInstances.get(symbolName) || { instances: [], blockScoped: isEitherBlockScoped }; + const secondInstanceList = existing.secondFileInstances.get(symbolName) || { instances: [], blockScoped: isEitherBlockScoped }; + + forEach(source.declarations, node => { + const errorNode = (getJavascriptInitializer(node, /*isPrototypeAssignment*/ false) ? getOuterNameOfJsInitializer(node) : getNameOfDeclaration(node)) || node; + const targetList = sourceSymbolFile === firstFile ? firstInstanceList : secondInstanceList; + targetList.instances.push(errorNode); + }); + forEach(target.declarations, node => { + const errorNode = (getJavascriptInitializer(node, /*isPrototypeAssignment*/ false) ? getOuterNameOfJsInitializer(node) : getNameOfDeclaration(node)) || node; + const targetList = targetSymbolFile === firstFile ? firstInstanceList : secondInstanceList; + targetList.instances.push(errorNode); + }); + + existing.firstFileInstances.set(symbolName, firstInstanceList); + existing.secondFileInstances.set(symbolName, secondInstanceList); + amalgamatedDuplicates.set(cacheKey, existing); + return target; + } + const symbolName = symbolToString(source); + addDuplicateDeclarationErrorsForSymbols(source, message, symbolName, target); + addDuplicateDeclarationErrorsForSymbols(target, message, symbolName, source); } return target; } + function addDuplicateDeclarationErrorsForSymbols(target: Symbol, message: DiagnosticMessage, symbolName: string, source: Symbol) { + forEach(target.declarations, node => { + const errorNode = (getJavascriptInitializer(node, /*isPrototypeAssignment*/ false) ? getOuterNameOfJsInitializer(node) : getNameOfDeclaration(node)) || node; + addDuplicateDeclarationError(errorNode, message, symbolName, source.declarations && source.declarations[0]); + }); + } + + function addDuplicateDeclarationError(errorNode: Node, message: DiagnosticMessage, symbolName: string, relatedNode: Node | undefined) { + const err = lookupOrIssueError(errorNode, message, symbolName); + if (relatedNode && length(err.relatedInformation) < 5) { + addRelatedInfo(err, !length(err.relatedInformation) ? createDiagnosticForNode(relatedNode, Diagnostics._0_was_also_declared_here, symbolName) : createDiagnosticForNode(relatedNode, Diagnostics.and_here)); + } + } + function combineSymbolTables(first: SymbolTable | undefined, second: SymbolTable | undefined): SymbolTable | undefined { if (!hasEntries(first)) return second; if (!hasEntries(second)) return first; @@ -27571,6 +27634,8 @@ namespace ts { bindSourceFile(file, compilerOptions); } + amalgamatedDuplicates = createMap(); + // Initialize global symbol table let augmentations: ReadonlyArray[] | undefined; for (const file of host.getSourceFiles()) { @@ -27648,6 +27713,39 @@ namespace ts { } } } + + amalgamatedDuplicates.forEach(({ firstFile, secondFile, firstFileInstances, secondFileInstances }) => { + const conflictingKeys = arrayFrom(firstFileInstances.keys()); + // If not many things conflict, issue individual errors + if (conflictingKeys.length < 8) { + addErrorsForDuplicates(firstFileInstances, secondFileInstances); + addErrorsForDuplicates(secondFileInstances, firstFileInstances); + return; + } + // Otheriwse issue top-level error since the files appear very identical in terms of what they appear + const list = conflictingKeys.join(", "); + diagnostics.add(addRelatedInfo( + createDiagnosticForNode(firstFile, Diagnostics.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, list), + createDiagnosticForNode(secondFile, Diagnostics.Conflicts_are_in_this_file) + )); + diagnostics.add(addRelatedInfo( + createDiagnosticForNode(secondFile, Diagnostics.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, list), + createDiagnosticForNode(firstFile, Diagnostics.Conflicts_are_in_this_file) + )); + }); + amalgamatedDuplicates = undefined; + + function addErrorsForDuplicates(secondFileInstances: Map<{ instances: Node[]; blockScoped: boolean; }>, firstFileInstances: Map<{ instances: Node[]; blockScoped: boolean; }>) { + secondFileInstances.forEach((locations, symbolName) => { + const firstFileEquivalent = firstFileInstances.get(symbolName)!; + const message = locations.blockScoped + ? Diagnostics.Cannot_redeclare_block_scoped_variable_0 + : Diagnostics.Duplicate_identifier_0; + locations.instances.forEach(node => { + addDuplicateDeclarationError(node, message, symbolName, firstFileEquivalent.instances[0]); + }); + }); + } } function checkExternalEmitHelpers(location: Node, helpers: ExternalEmitHelpers) { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index a9ba19d91d408..e70339ae1271f 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3603,6 +3603,22 @@ "code": 6199, "reportsUnnecessary": true }, + "Definitions of the following identifiers conflict with those in another file: {0}": { + "category": "Error", + "code": 6200 + }, + "Conflicts are in this file.": { + "category": "Message", + "code": 6201 + }, + "'{0}' was also declared here.": { + "category": "Message", + "code": 6203 + }, + "and here.": { + "category": "Message", + "code": 6204 + }, "Projects to reference": { "category": "Message", diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c0758a8a7867f..741514d2ef264 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -329,16 +329,17 @@ namespace ts { return context; } - function formatLocation(file: SourceFile, start: number, host: FormatDiagnosticsHost) { + /* @internal */ + export function formatLocation(file: SourceFile, start: number, host: FormatDiagnosticsHost, color = formatColorAndReset) { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); // TODO: GH#18217 const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName; let output = ""; - output += formatColorAndReset(relativeFileName, ForegroundColorEscapeSequences.Cyan); + output += color(relativeFileName, ForegroundColorEscapeSequences.Cyan); output += ":"; - output += formatColorAndReset(`${firstLine + 1}`, ForegroundColorEscapeSequences.Yellow); + output += color(`${firstLine + 1}`, ForegroundColorEscapeSequences.Yellow); output += ":"; - output += formatColorAndReset(`${firstLineChar + 1}`, ForegroundColorEscapeSequences.Yellow); + output += color(`${firstLineChar + 1}`, ForegroundColorEscapeSequences.Yellow); return output; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index d12761b4821e1..6fb048cb8cd6a 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -5351,6 +5351,9 @@ namespace ts { // Adds a diagnostic to this diagnostic collection. add(diagnostic: Diagnostic): void; + // Returns the first existing diagnostic that is equivalent to the given one (sans related information) + lookup(diagnostic: Diagnostic): Diagnostic | undefined; + // Gets all the diagnostics that aren't associated with a file. getGlobalDiagnostics(): Diagnostic[]; diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 40cb2cc96e895..14a014111dfd1 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2887,6 +2887,7 @@ namespace ts { return { add, + lookup, getGlobalDiagnostics, getDiagnostics, reattachFileDiagnostics @@ -2896,6 +2897,24 @@ namespace ts { forEach(fileDiagnostics.get(newFile.fileName), diagnostic => diagnostic.file = newFile); } + function lookup(diagnostic: Diagnostic): Diagnostic | undefined { + let diagnostics: SortedArray | undefined; + if (diagnostic.file) { + diagnostics = fileDiagnostics.get(diagnostic.file.fileName); + } + else { + diagnostics = nonFileDiagnostics; + } + if (!diagnostics) { + return undefined; + } + const result = binarySearch(diagnostics, diagnostic, identity, compareDiagnosticsSkipRelatedInformation); + if (result >= 0) { + return diagnostics[result]; + } + return undefined; + } + function add(diagnostic: Diagnostic): void { let diagnostics: SortedArray | undefined; if (diagnostic.file) { @@ -6852,6 +6871,13 @@ namespace ts { /* @internal */ export function compareDiagnostics(d1: Diagnostic, d2: Diagnostic): Comparison { + return compareDiagnosticsSkipRelatedInformation(d1, d2) || + compareRelatedInformation(d1, d2) || + Comparison.EqualTo; + } + + /* @internal */ + export function compareDiagnosticsSkipRelatedInformation(d1: Diagnostic, d2: Diagnostic): Comparison { return compareStringsCaseSensitive(getDiagnosticFilePath(d1), getDiagnosticFilePath(d2)) || compareValues(d1.start, d2.start) || compareValues(d1.length, d2.length) || @@ -6860,6 +6886,19 @@ namespace ts { Comparison.EqualTo; } + function compareRelatedInformation(d1: Diagnostic, d2: Diagnostic): Comparison { + if (!d1.relatedInformation && !d2.relatedInformation) { + return Comparison.EqualTo; + } + if (d1.relatedInformation && d2.relatedInformation) { + return compareValues(d1.relatedInformation.length, d2.relatedInformation.length) || forEach(d1.relatedInformation, (d1i, index) => { + const d2i = d2.relatedInformation![index]; + return compareDiagnostics(d1i, d2i); // EqualTo is 0, so falsy, and will cause the next item to be compared + }) || Comparison.EqualTo; + } + return d1.relatedInformation ? Comparison.LessThan : Comparison.GreaterThan; + } + function compareMessageText(t1: string | DiagnosticMessageChain, t2: string | DiagnosticMessageChain): Comparison { let text1: string | DiagnosticMessageChain | undefined = t1; let text2: string | DiagnosticMessageChain | undefined = t2; diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 0b72834e1c2b6..4afe48999d1b0 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1348,6 +1348,12 @@ namespace Harness { return "\r\n"; } + const formatDiagnsoticHost = { + getCurrentDirectory: () => options && options.currentDirectory ? options.currentDirectory : "", + getNewLine: () => IO.newLine(), + getCanonicalFileName: ts.createGetCanonicalFileName(options && options.caseSensitive !== undefined ? options.caseSensitive : true), + }; + function outputErrorText(error: ts.Diagnostic) { const message = ts.flattenDiagnosticMessageText(error.messageText, IO.newLine()); @@ -1356,6 +1362,11 @@ namespace Harness { .map(s => s.length > 0 && s.charAt(s.length - 1) === "\r" ? s.substr(0, s.length - 1) : s) .filter(s => s.length > 0) .map(s => "!!! " + ts.diagnosticCategoryName(error) + " TS" + error.code + ": " + s); + if (error.relatedInformation) { + for (const info of error.relatedInformation) { + errLines.push(`!!! related TS${info.code}${info.file ? " " + ts.formatLocation(info.file, info.start!, formatDiagnsoticHost, ts.identity) : ""}: ${ts.flattenDiagnosticMessageText(info.messageText, IO.newLine())}`); + } + } errLines.forEach(e => outputLines += (newLine() + e)); errorsReported++; diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 1783064f309b3..c621499d52ea4 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4527,6 +4527,7 @@ declare namespace ts { } interface DiagnosticCollection { add(diagnostic: Diagnostic): void; + lookup(diagnostic: Diagnostic): Diagnostic | undefined; getGlobalDiagnostics(): Diagnostic[]; getDiagnostics(fileName: string): DiagnosticWithLocation[]; getDiagnostics(): Diagnostic[]; @@ -5738,6 +5739,10 @@ declare namespace ts { Include_modules_imported_with_json_extension: DiagnosticMessage; All_destructured_elements_are_unused: DiagnosticMessage; All_variables_are_unused: DiagnosticMessage; + Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0: DiagnosticMessage; + Conflicts_are_in_this_file: DiagnosticMessage; + _0_was_also_declared_here: DiagnosticMessage; + and_here: DiagnosticMessage; Projects_to_reference: DiagnosticMessage; Enable_project_compilation: DiagnosticMessage; Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0: DiagnosticMessage; @@ -7116,6 +7121,7 @@ declare namespace ts { function chainDiagnosticMessages(details: DiagnosticMessageChain | undefined, message: DiagnosticMessage, ...args: (string | undefined)[]): DiagnosticMessageChain; function concatenateDiagnosticMessageChains(headChain: DiagnosticMessageChain, tailChain: DiagnosticMessageChain): DiagnosticMessageChain; function compareDiagnostics(d1: Diagnostic, d2: Diagnostic): Comparison; + function compareDiagnosticsSkipRelatedInformation(d1: Diagnostic, d2: Diagnostic): Comparison; function getEmitScriptTarget(compilerOptions: CompilerOptions): ScriptTarget; function getEmitModuleKind(compilerOptions: { module?: CompilerOptions["module"]; @@ -8946,6 +8952,7 @@ declare namespace ts { } /** @internal */ function formatColorAndReset(text: string, formatStyle: string): string; + function formatLocation(file: SourceFile, start: number, host: FormatDiagnosticsHost, color?: typeof formatColorAndReset): string; function formatDiagnosticsWithColorAndContext(diagnostics: ReadonlyArray, host: FormatDiagnosticsHost): string; function flattenDiagnosticMessageText(messageText: string | DiagnosticMessageChain | undefined, newLine: string): string; /** diff --git a/tests/baselines/reference/declaredClassMergedwithSelf.errors.txt b/tests/baselines/reference/declaredClassMergedwithSelf.errors.txt index b02b93e17b082..9902b1223a0a3 100644 --- a/tests/baselines/reference/declaredClassMergedwithSelf.errors.txt +++ b/tests/baselines/reference/declaredClassMergedwithSelf.errors.txt @@ -32,8 +32,10 @@ tests/cases/conformance/classes/classDeclarations/file3.ts(1,15): error TS2300: declare class C3 { } ~~ !!! error TS2300: Duplicate identifier 'C3'. +!!! related TS6203 tests/cases/conformance/classes/classDeclarations/file3.ts:1:15: 'C3' was also declared here. ==== tests/cases/conformance/classes/classDeclarations/file3.ts (1 errors) ==== declare class C3 { } ~~ -!!! error TS2300: Duplicate identifier 'C3'. \ No newline at end of file +!!! error TS2300: Duplicate identifier 'C3'. +!!! related TS6203 tests/cases/conformance/classes/classDeclarations/file2.ts:1:15: 'C3' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierEnum.errors.txt b/tests/baselines/reference/duplicateIdentifierEnum.errors.txt index 69266cc5ba457..d5102255bb4f7 100644 --- a/tests/baselines/reference/duplicateIdentifierEnum.errors.txt +++ b/tests/baselines/reference/duplicateIdentifierEnum.errors.txt @@ -48,11 +48,13 @@ tests/cases/compiler/duplicateIdentifierEnum_B.ts(4,6): error TS2567: Enum decla enum D { ~ !!! error TS2567: Enum declarations can only merge with namespace or other enum declarations. +!!! related TS6203 tests/cases/compiler/duplicateIdentifierEnum_B.ts:1:10: 'D' was also declared here. bar } class E { ~ !!! error TS2567: Enum declarations can only merge with namespace or other enum declarations. +!!! related TS6203 tests/cases/compiler/duplicateIdentifierEnum_B.ts:4:6: 'E' was also declared here. foo: number; } // also make sure the error appears when trying to merge an enum in a separate file. @@ -60,10 +62,12 @@ tests/cases/compiler/duplicateIdentifierEnum_B.ts(4,6): error TS2567: Enum decla function D() { ~ !!! error TS2567: Enum declarations can only merge with namespace or other enum declarations. +!!! related TS6203 tests/cases/compiler/duplicateIdentifierEnum_A.ts:23:6: 'D' was also declared here. return 0; } enum E { ~ !!! error TS2567: Enum declarations can only merge with namespace or other enum declarations. +!!! related TS6203 tests/cases/compiler/duplicateIdentifierEnum_A.ts:26:7: 'E' was also declared here. bar } \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans1.errors.txt b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.errors.txt new file mode 100644 index 0000000000000..62b4774f4f72b --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.errors.txt @@ -0,0 +1,94 @@ +tests/cases/compiler/file1.ts:1:7 - error TS2300: Duplicate identifier 'Foo'. + +1 class Foo { } +   ~~~ + + tests/cases/compiler/file2.ts:1:6 + 1 type Foo = number; +    ~~~ + 'Foo' was also declared here. + tests/cases/compiler/file3.ts:1:6 + 1 type Foo = 54; +    ~~~ + and here. +tests/cases/compiler/file1.ts:2:7 - error TS2451: Cannot redeclare block-scoped variable 'Bar'. + +2 const Bar = 3; +   ~~~ + + tests/cases/compiler/file2.ts:2:7 + 2 class Bar {} +    ~~~ + 'Bar' was also declared here. + tests/cases/compiler/file3.ts:2:5 + 2 let Bar = 42 +    ~~~ + and here. +tests/cases/compiler/file2.ts:1:6 - error TS2300: Duplicate identifier 'Foo'. + +1 type Foo = number; +   ~~~ + + tests/cases/compiler/file1.ts:1:7 + 1 class Foo { } +    ~~~ + 'Foo' was also declared here. +tests/cases/compiler/file2.ts:2:7 - error TS2451: Cannot redeclare block-scoped variable 'Bar'. + +2 class Bar {} +   ~~~ + + tests/cases/compiler/file1.ts:2:7 + 2 const Bar = 3; +    ~~~ + 'Bar' was also declared here. +tests/cases/compiler/file3.ts:1:6 - error TS2300: Duplicate identifier 'Foo'. + +1 type Foo = 54; +   ~~~ + + tests/cases/compiler/file1.ts:1:7 + 1 class Foo { } +    ~~~ + 'Foo' was also declared here. +tests/cases/compiler/file3.ts:2:5 - error TS2451: Cannot redeclare block-scoped variable 'Bar'. + +2 let Bar = 42 +   ~~~ + + tests/cases/compiler/file1.ts:2:7 + 2 const Bar = 3; +    ~~~ + 'Bar' was also declared here. + + +==== tests/cases/compiler/file1.ts (2 errors) ==== + class Foo { } + ~~~ +!!! error TS2300: Duplicate identifier 'Foo'. +!!! related TS6203 tests/cases/compiler/file2.ts:1:6: 'Foo' was also declared here. +!!! related TS6204 tests/cases/compiler/file3.ts:1:6: and here. + const Bar = 3; + ~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'Bar'. +!!! related TS6203 tests/cases/compiler/file2.ts:2:7: 'Bar' was also declared here. +!!! related TS6204 tests/cases/compiler/file3.ts:2:5: and here. +==== tests/cases/compiler/file2.ts (2 errors) ==== + type Foo = number; + ~~~ +!!! error TS2300: Duplicate identifier 'Foo'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:7: 'Foo' was also declared here. + class Bar {} + ~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'Bar'. +!!! related TS6203 tests/cases/compiler/file1.ts:2:7: 'Bar' was also declared here. +==== tests/cases/compiler/file3.ts (2 errors) ==== + type Foo = 54; + ~~~ +!!! error TS2300: Duplicate identifier 'Foo'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:7: 'Foo' was also declared here. + let Bar = 42 + ~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'Bar'. +!!! related TS6203 tests/cases/compiler/file1.ts:2:7: 'Bar' was also declared here. + \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans1.js b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.js new file mode 100644 index 0000000000000..899c87fffd5bb --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.js @@ -0,0 +1,28 @@ +//// [tests/cases/compiler/duplicateIdentifierRelatedSpans1.ts] //// + +//// [file1.ts] +class Foo { } +const Bar = 3; +//// [file2.ts] +type Foo = number; +class Bar {} +//// [file3.ts] +type Foo = 54; +let Bar = 42 + + +//// [file1.js] +var Foo = /** @class */ (function () { + function Foo() { + } + return Foo; +}()); +var Bar = 3; +//// [file2.js] +var Bar = /** @class */ (function () { + function Bar() { + } + return Bar; +}()); +//// [file3.js] +var Bar = 42; diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans1.symbols b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.symbols new file mode 100644 index 0000000000000..8131264ca21b7 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.symbols @@ -0,0 +1,21 @@ +=== tests/cases/compiler/file1.ts === +class Foo { } +>Foo : Symbol(Foo, Decl(file1.ts, 0, 0)) + +const Bar = 3; +>Bar : Symbol(Bar, Decl(file1.ts, 1, 5)) + +=== tests/cases/compiler/file2.ts === +type Foo = number; +>Foo : Symbol(Foo, Decl(file2.ts, 0, 0)) + +class Bar {} +>Bar : Symbol(Bar, Decl(file2.ts, 0, 18)) + +=== tests/cases/compiler/file3.ts === +type Foo = 54; +>Foo : Symbol(Foo, Decl(file3.ts, 0, 0)) + +let Bar = 42 +>Bar : Symbol(Bar, Decl(file3.ts, 1, 3)) + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans1.types b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.types new file mode 100644 index 0000000000000..fff94f44081aa --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans1.types @@ -0,0 +1,23 @@ +=== tests/cases/compiler/file1.ts === +class Foo { } +>Foo : Foo + +const Bar = 3; +>Bar : 3 +>3 : 3 + +=== tests/cases/compiler/file2.ts === +type Foo = number; +>Foo : number + +class Bar {} +>Bar : Bar + +=== tests/cases/compiler/file3.ts === +type Foo = 54; +>Foo : 54 + +let Bar = 42 +>Bar : number +>42 : 42 + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans2.errors.txt b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.errors.txt new file mode 100644 index 0000000000000..2925b636d2d22 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.errors.txt @@ -0,0 +1,47 @@ +tests/cases/compiler/file1.ts:1:1 - error TS6200: Definitions of the following identifiers conflict with those in another file: A, B, C, D, E, F, G, H, I + +1 class A { } +  ~~~~~ + + tests/cases/compiler/file2.ts:1:1 + 1 class A { } +   ~~~~~ + Conflicts are in this file. +tests/cases/compiler/file2.ts:1:1 - error TS6200: Definitions of the following identifiers conflict with those in another file: A, B, C, D, E, F, G, H, I + +1 class A { } +  ~~~~~ + + tests/cases/compiler/file1.ts:1:1 + 1 class A { } +   ~~~~~ + Conflicts are in this file. + + +==== tests/cases/compiler/file1.ts (1 errors) ==== + class A { } + ~~~~~ +!!! error TS6200: Definitions of the following identifiers conflict with those in another file: A, B, C, D, E, F, G, H, I +!!! related TS6201 tests/cases/compiler/file2.ts:1:1: Conflicts are in this file. + class B { } + class C { } + class D { } + class E { } + class F { } + class G { } + class H { } + class I { } +==== tests/cases/compiler/file2.ts (1 errors) ==== + class A { } + ~~~~~ +!!! error TS6200: Definitions of the following identifiers conflict with those in another file: A, B, C, D, E, F, G, H, I +!!! related TS6201 tests/cases/compiler/file1.ts:1:1: Conflicts are in this file. + class B { } + class C { } + class D { } + class E { } + class F { } + class G { } + class H { } + class I { } + \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans2.js b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.js new file mode 100644 index 0000000000000..318bd4d135e2e --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.js @@ -0,0 +1,116 @@ +//// [tests/cases/compiler/duplicateIdentifierRelatedSpans2.ts] //// + +//// [file1.ts] +class A { } +class B { } +class C { } +class D { } +class E { } +class F { } +class G { } +class H { } +class I { } +//// [file2.ts] +class A { } +class B { } +class C { } +class D { } +class E { } +class F { } +class G { } +class H { } +class I { } + + +//// [file1.js] +var A = /** @class */ (function () { + function A() { + } + return A; +}()); +var B = /** @class */ (function () { + function B() { + } + return B; +}()); +var C = /** @class */ (function () { + function C() { + } + return C; +}()); +var D = /** @class */ (function () { + function D() { + } + return D; +}()); +var E = /** @class */ (function () { + function E() { + } + return E; +}()); +var F = /** @class */ (function () { + function F() { + } + return F; +}()); +var G = /** @class */ (function () { + function G() { + } + return G; +}()); +var H = /** @class */ (function () { + function H() { + } + return H; +}()); +var I = /** @class */ (function () { + function I() { + } + return I; +}()); +//// [file2.js] +var A = /** @class */ (function () { + function A() { + } + return A; +}()); +var B = /** @class */ (function () { + function B() { + } + return B; +}()); +var C = /** @class */ (function () { + function C() { + } + return C; +}()); +var D = /** @class */ (function () { + function D() { + } + return D; +}()); +var E = /** @class */ (function () { + function E() { + } + return E; +}()); +var F = /** @class */ (function () { + function F() { + } + return F; +}()); +var G = /** @class */ (function () { + function G() { + } + return G; +}()); +var H = /** @class */ (function () { + function H() { + } + return H; +}()); +var I = /** @class */ (function () { + function I() { + } + return I; +}()); diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans2.symbols b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.symbols new file mode 100644 index 0000000000000..aabbe5898c5eb --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.symbols @@ -0,0 +1,56 @@ +=== tests/cases/compiler/file1.ts === +class A { } +>A : Symbol(A, Decl(file1.ts, 0, 0)) + +class B { } +>B : Symbol(B, Decl(file1.ts, 0, 11)) + +class C { } +>C : Symbol(C, Decl(file1.ts, 1, 11)) + +class D { } +>D : Symbol(D, Decl(file1.ts, 2, 11)) + +class E { } +>E : Symbol(E, Decl(file1.ts, 3, 11)) + +class F { } +>F : Symbol(F, Decl(file1.ts, 4, 11)) + +class G { } +>G : Symbol(G, Decl(file1.ts, 5, 11)) + +class H { } +>H : Symbol(H, Decl(file1.ts, 6, 11)) + +class I { } +>I : Symbol(I, Decl(file1.ts, 7, 11)) + +=== tests/cases/compiler/file2.ts === +class A { } +>A : Symbol(A, Decl(file2.ts, 0, 0)) + +class B { } +>B : Symbol(B, Decl(file2.ts, 0, 11)) + +class C { } +>C : Symbol(C, Decl(file2.ts, 1, 11)) + +class D { } +>D : Symbol(D, Decl(file2.ts, 2, 11)) + +class E { } +>E : Symbol(E, Decl(file2.ts, 3, 11)) + +class F { } +>F : Symbol(F, Decl(file2.ts, 4, 11)) + +class G { } +>G : Symbol(G, Decl(file2.ts, 5, 11)) + +class H { } +>H : Symbol(H, Decl(file2.ts, 6, 11)) + +class I { } +>I : Symbol(I, Decl(file2.ts, 7, 11)) + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans2.types b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.types new file mode 100644 index 0000000000000..caea2d91f4fba --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans2.types @@ -0,0 +1,56 @@ +=== tests/cases/compiler/file1.ts === +class A { } +>A : A + +class B { } +>B : B + +class C { } +>C : C + +class D { } +>D : D + +class E { } +>E : E + +class F { } +>F : F + +class G { } +>G : G + +class H { } +>H : H + +class I { } +>I : I + +=== tests/cases/compiler/file2.ts === +class A { } +>A : A + +class B { } +>B : B + +class C { } +>C : C + +class D { } +>D : D + +class E { } +>E : E + +class F { } +>F : F + +class G { } +>G : G + +class H { } +>H : H + +class I { } +>I : I + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans3.errors.txt b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.errors.txt new file mode 100644 index 0000000000000..a97ce217928d7 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.errors.txt @@ -0,0 +1,87 @@ +tests/cases/compiler/file1.ts:2:5 - error TS2300: Duplicate identifier 'duplicate1'. + +2 duplicate1: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:2:5 + 2 duplicate1(): number; +    ~~~~~~~~~~ + 'duplicate1' was also declared here. +tests/cases/compiler/file1.ts:3:5 - error TS2300: Duplicate identifier 'duplicate2'. + +3 duplicate2: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:3:5 + 3 duplicate2(): number; +    ~~~~~~~~~~ + 'duplicate2' was also declared here. +tests/cases/compiler/file1.ts:4:5 - error TS2300: Duplicate identifier 'duplicate3'. + +4 duplicate3: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:4:5 + 4 duplicate3(): number; +    ~~~~~~~~~~ + 'duplicate3' was also declared here. +tests/cases/compiler/file2.ts:2:5 - error TS2300: Duplicate identifier 'duplicate1'. + +2 duplicate1(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:2:5 + 2 duplicate1: () => string; +    ~~~~~~~~~~ + 'duplicate1' was also declared here. +tests/cases/compiler/file2.ts:3:5 - error TS2300: Duplicate identifier 'duplicate2'. + +3 duplicate2(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:3:5 + 3 duplicate2: () => string; +    ~~~~~~~~~~ + 'duplicate2' was also declared here. +tests/cases/compiler/file2.ts:4:5 - error TS2300: Duplicate identifier 'duplicate3'. + +4 duplicate3(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:4:5 + 4 duplicate3: () => string; +    ~~~~~~~~~~ + 'duplicate3' was also declared here. + + +==== tests/cases/compiler/file1.ts (3 errors) ==== + interface TopLevel { + duplicate1: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate1'. +!!! related TS6203 tests/cases/compiler/file2.ts:2:5: 'duplicate1' was also declared here. + duplicate2: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate2'. +!!! related TS6203 tests/cases/compiler/file2.ts:3:5: 'duplicate2' was also declared here. + duplicate3: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate3'. +!!! related TS6203 tests/cases/compiler/file2.ts:4:5: 'duplicate3' was also declared here. + } +==== tests/cases/compiler/file2.ts (3 errors) ==== + interface TopLevel { + duplicate1(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate1'. +!!! related TS6203 tests/cases/compiler/file1.ts:2:5: 'duplicate1' was also declared here. + duplicate2(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate2'. +!!! related TS6203 tests/cases/compiler/file1.ts:3:5: 'duplicate2' was also declared here. + duplicate3(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate3'. +!!! related TS6203 tests/cases/compiler/file1.ts:4:5: 'duplicate3' was also declared here. + } + \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans3.js b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.js new file mode 100644 index 0000000000000..978b5013570c3 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.js @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/duplicateIdentifierRelatedSpans3.ts] //// + +//// [file1.ts] +interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; +} +//// [file2.ts] +interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; +} + + +//// [file1.js] +//// [file2.js] diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans3.symbols b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.symbols new file mode 100644 index 0000000000000..b24820d317ab7 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/file1.ts === +interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + duplicate1: () => string; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file1.ts, 0, 20)) + + duplicate2: () => string; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file1.ts, 1, 29)) + + duplicate3: () => string; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file1.ts, 2, 29)) +} +=== tests/cases/compiler/file2.ts === +interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + duplicate1(): number; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file2.ts, 0, 20)) + + duplicate2(): number; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file2.ts, 1, 25)) + + duplicate3(): number; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file2.ts, 2, 25)) +} + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans3.types b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.types new file mode 100644 index 0000000000000..84de4d9d8bfae --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans3.types @@ -0,0 +1,27 @@ +=== tests/cases/compiler/file1.ts === +interface TopLevel { +>TopLevel : TopLevel + + duplicate1: () => string; +>duplicate1 : () => string + + duplicate2: () => string; +>duplicate2 : () => string + + duplicate3: () => string; +>duplicate3 : () => string +} +=== tests/cases/compiler/file2.ts === +interface TopLevel { +>TopLevel : TopLevel + + duplicate1(): number; +>duplicate1 : () => number + + duplicate2(): number; +>duplicate2 : () => number + + duplicate3(): number; +>duplicate3 : () => number +} + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans4.errors.txt b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.errors.txt new file mode 100644 index 0000000000000..da50e3ad4a3dc --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.errors.txt @@ -0,0 +1,49 @@ +tests/cases/compiler/file1.ts:1:1 - error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8 + +1 interface TopLevel { +  ~~~~~~~~~ + + tests/cases/compiler/file2.ts:1:1 + 1 interface TopLevel { +   ~~~~~~~~~ + Conflicts are in this file. +tests/cases/compiler/file2.ts:1:1 - error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8 + +1 interface TopLevel { +  ~~~~~~~~~ + + tests/cases/compiler/file1.ts:1:1 + 1 interface TopLevel { +   ~~~~~~~~~ + Conflicts are in this file. + + +==== tests/cases/compiler/file1.ts (1 errors) ==== + interface TopLevel { + ~~~~~~~~~ +!!! error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8 +!!! related TS6201 tests/cases/compiler/file2.ts:1:1: Conflicts are in this file. + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + duplicate4: () => string; + duplicate5: () => string; + duplicate6: () => string; + duplicate7: () => string; + duplicate8: () => string; + } +==== tests/cases/compiler/file2.ts (1 errors) ==== + interface TopLevel { + ~~~~~~~~~ +!!! error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8 +!!! related TS6201 tests/cases/compiler/file1.ts:1:1: Conflicts are in this file. + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + duplicate4(): number; + duplicate5(): number; + duplicate6(): number; + duplicate7(): number; + duplicate8(): number; + } + \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans4.js b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.js new file mode 100644 index 0000000000000..113e488c7bb24 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.js @@ -0,0 +1,28 @@ +//// [tests/cases/compiler/duplicateIdentifierRelatedSpans4.ts] //// + +//// [file1.ts] +interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + duplicate4: () => string; + duplicate5: () => string; + duplicate6: () => string; + duplicate7: () => string; + duplicate8: () => string; +} +//// [file2.ts] +interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + duplicate4(): number; + duplicate5(): number; + duplicate6(): number; + duplicate7(): number; + duplicate8(): number; +} + + +//// [file1.js] +//// [file2.js] diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans4.symbols b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.symbols new file mode 100644 index 0000000000000..cef2fb78aca60 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.symbols @@ -0,0 +1,57 @@ +=== tests/cases/compiler/file1.ts === +interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + duplicate1: () => string; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file1.ts, 0, 20)) + + duplicate2: () => string; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file1.ts, 1, 29)) + + duplicate3: () => string; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file1.ts, 2, 29)) + + duplicate4: () => string; +>duplicate4 : Symbol(TopLevel.duplicate4, Decl(file1.ts, 3, 29)) + + duplicate5: () => string; +>duplicate5 : Symbol(TopLevel.duplicate5, Decl(file1.ts, 4, 29)) + + duplicate6: () => string; +>duplicate6 : Symbol(TopLevel.duplicate6, Decl(file1.ts, 5, 29)) + + duplicate7: () => string; +>duplicate7 : Symbol(TopLevel.duplicate7, Decl(file1.ts, 6, 29)) + + duplicate8: () => string; +>duplicate8 : Symbol(TopLevel.duplicate8, Decl(file1.ts, 7, 29)) +} +=== tests/cases/compiler/file2.ts === +interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + duplicate1(): number; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file2.ts, 0, 20)) + + duplicate2(): number; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file2.ts, 1, 25)) + + duplicate3(): number; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file2.ts, 2, 25)) + + duplicate4(): number; +>duplicate4 : Symbol(TopLevel.duplicate4, Decl(file2.ts, 3, 25)) + + duplicate5(): number; +>duplicate5 : Symbol(TopLevel.duplicate5, Decl(file2.ts, 4, 25)) + + duplicate6(): number; +>duplicate6 : Symbol(TopLevel.duplicate6, Decl(file2.ts, 5, 25)) + + duplicate7(): number; +>duplicate7 : Symbol(TopLevel.duplicate7, Decl(file2.ts, 6, 25)) + + duplicate8(): number; +>duplicate8 : Symbol(TopLevel.duplicate8, Decl(file2.ts, 7, 25)) +} + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans4.types b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.types new file mode 100644 index 0000000000000..b81a27617bdeb --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans4.types @@ -0,0 +1,57 @@ +=== tests/cases/compiler/file1.ts === +interface TopLevel { +>TopLevel : TopLevel + + duplicate1: () => string; +>duplicate1 : () => string + + duplicate2: () => string; +>duplicate2 : () => string + + duplicate3: () => string; +>duplicate3 : () => string + + duplicate4: () => string; +>duplicate4 : () => string + + duplicate5: () => string; +>duplicate5 : () => string + + duplicate6: () => string; +>duplicate6 : () => string + + duplicate7: () => string; +>duplicate7 : () => string + + duplicate8: () => string; +>duplicate8 : () => string +} +=== tests/cases/compiler/file2.ts === +interface TopLevel { +>TopLevel : TopLevel + + duplicate1(): number; +>duplicate1 : () => number + + duplicate2(): number; +>duplicate2 : () => number + + duplicate3(): number; +>duplicate3 : () => number + + duplicate4(): number; +>duplicate4 : () => number + + duplicate5(): number; +>duplicate5 : () => number + + duplicate6(): number; +>duplicate6 : () => number + + duplicate7(): number; +>duplicate7 : () => number + + duplicate8(): number; +>duplicate8 : () => number +} + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans5.errors.txt b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.errors.txt new file mode 100644 index 0000000000000..2cbd4fa9629f5 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.errors.txt @@ -0,0 +1,94 @@ +tests/cases/compiler/file1.ts:3:9 - error TS2300: Duplicate identifier 'duplicate1'. + +3 duplicate1: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:4:9 + 4 duplicate1(): number; +    ~~~~~~~~~~ + 'duplicate1' was also declared here. +tests/cases/compiler/file1.ts:4:9 - error TS2300: Duplicate identifier 'duplicate2'. + +4 duplicate2: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:5:9 + 5 duplicate2(): number; +    ~~~~~~~~~~ + 'duplicate2' was also declared here. +tests/cases/compiler/file1.ts:5:9 - error TS2300: Duplicate identifier 'duplicate3'. + +5 duplicate3: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:6:9 + 6 duplicate3(): number; +    ~~~~~~~~~~ + 'duplicate3' was also declared here. +tests/cases/compiler/file2.ts:4:9 - error TS2300: Duplicate identifier 'duplicate1'. + +4 duplicate1(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:3:9 + 3 duplicate1: () => string; +    ~~~~~~~~~~ + 'duplicate1' was also declared here. +tests/cases/compiler/file2.ts:5:9 - error TS2300: Duplicate identifier 'duplicate2'. + +5 duplicate2(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:4:9 + 4 duplicate2: () => string; +    ~~~~~~~~~~ + 'duplicate2' was also declared here. +tests/cases/compiler/file2.ts:6:9 - error TS2300: Duplicate identifier 'duplicate3'. + +6 duplicate3(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:5:9 + 5 duplicate3: () => string; +    ~~~~~~~~~~ + 'duplicate3' was also declared here. + + +==== tests/cases/compiler/file1.ts (3 errors) ==== + declare global { + interface TopLevel { + duplicate1: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate1'. +!!! related TS6203 tests/cases/compiler/file2.ts:4:9: 'duplicate1' was also declared here. + duplicate2: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate2'. +!!! related TS6203 tests/cases/compiler/file2.ts:5:9: 'duplicate2' was also declared here. + duplicate3: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate3'. +!!! related TS6203 tests/cases/compiler/file2.ts:6:9: 'duplicate3' was also declared here. + } + } + export {} +==== tests/cases/compiler/file2.ts (3 errors) ==== + import "./file1"; + declare global { + interface TopLevel { + duplicate1(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate1'. +!!! related TS6203 tests/cases/compiler/file1.ts:3:9: 'duplicate1' was also declared here. + duplicate2(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate2'. +!!! related TS6203 tests/cases/compiler/file1.ts:4:9: 'duplicate2' was also declared here. + duplicate3(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate3'. +!!! related TS6203 tests/cases/compiler/file1.ts:5:9: 'duplicate3' was also declared here. + } + } + export {} + \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans5.js b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.js new file mode 100644 index 0000000000000..681d435c0d330 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.js @@ -0,0 +1,30 @@ +//// [tests/cases/compiler/duplicateIdentifierRelatedSpans5.ts] //// + +//// [file1.ts] +declare global { + interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + } +} +export {} +//// [file2.ts] +import "./file1"; +declare global { + interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + } +} +export {} + + +//// [file1.js] +"use strict"; +exports.__esModule = true; +//// [file2.js] +"use strict"; +exports.__esModule = true; +require("./file1"); diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans5.symbols b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.symbols new file mode 100644 index 0000000000000..1364d5667dce6 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.symbols @@ -0,0 +1,38 @@ +=== tests/cases/compiler/file1.ts === +declare global { +>global : Symbol(global, Decl(file1.ts, 0, 0)) + + interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 16), Decl(file2.ts, 1, 16)) + + duplicate1: () => string; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file1.ts, 1, 24)) + + duplicate2: () => string; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file1.ts, 2, 33)) + + duplicate3: () => string; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file1.ts, 3, 33)) + } +} +export {} +=== tests/cases/compiler/file2.ts === +import "./file1"; +declare global { +>global : Symbol(global, Decl(file2.ts, 0, 17)) + + interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 16), Decl(file2.ts, 1, 16)) + + duplicate1(): number; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file2.ts, 2, 24)) + + duplicate2(): number; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file2.ts, 3, 29)) + + duplicate3(): number; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file2.ts, 4, 29)) + } +} +export {} + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans5.types b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.types new file mode 100644 index 0000000000000..aa2147f30ab6a --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans5.types @@ -0,0 +1,38 @@ +=== tests/cases/compiler/file1.ts === +declare global { +>global : any + + interface TopLevel { +>TopLevel : TopLevel + + duplicate1: () => string; +>duplicate1 : () => string + + duplicate2: () => string; +>duplicate2 : () => string + + duplicate3: () => string; +>duplicate3 : () => string + } +} +export {} +=== tests/cases/compiler/file2.ts === +import "./file1"; +declare global { +>global : any + + interface TopLevel { +>TopLevel : TopLevel + + duplicate1(): number; +>duplicate1 : () => number + + duplicate2(): number; +>duplicate2 : () => number + + duplicate3(): number; +>duplicate3 : () => number + } +} +export {} + diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans6.errors.txt b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.errors.txt new file mode 100644 index 0000000000000..afe6ebe9f42af --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.errors.txt @@ -0,0 +1,94 @@ +tests/cases/compiler/file1.ts:3:9 - error TS2300: Duplicate identifier 'duplicate1'. + +3 duplicate1: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:5:9 + 5 duplicate1(): number; +    ~~~~~~~~~~ + 'duplicate1' was also declared here. +tests/cases/compiler/file1.ts:4:9 - error TS2300: Duplicate identifier 'duplicate2'. + +4 duplicate2: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:6:9 + 6 duplicate2(): number; +    ~~~~~~~~~~ + 'duplicate2' was also declared here. +tests/cases/compiler/file1.ts:5:9 - error TS2300: Duplicate identifier 'duplicate3'. + +5 duplicate3: () => string; +   ~~~~~~~~~~ + + tests/cases/compiler/file2.ts:7:9 + 7 duplicate3(): number; +    ~~~~~~~~~~ + 'duplicate3' was also declared here. +tests/cases/compiler/file2.ts:5:9 - error TS2300: Duplicate identifier 'duplicate1'. + +5 duplicate1(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:3:9 + 3 duplicate1: () => string; +    ~~~~~~~~~~ + 'duplicate1' was also declared here. +tests/cases/compiler/file2.ts:6:9 - error TS2300: Duplicate identifier 'duplicate2'. + +6 duplicate2(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:4:9 + 4 duplicate2: () => string; +    ~~~~~~~~~~ + 'duplicate2' was also declared here. +tests/cases/compiler/file2.ts:7:9 - error TS2300: Duplicate identifier 'duplicate3'. + +7 duplicate3(): number; +   ~~~~~~~~~~ + + tests/cases/compiler/file1.ts:5:9 + 5 duplicate3: () => string; +    ~~~~~~~~~~ + 'duplicate3' was also declared here. + + +==== tests/cases/compiler/file2.ts (3 errors) ==== + /// + + declare module "someMod" { + export interface TopLevel { + duplicate1(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate1'. +!!! related TS6203 tests/cases/compiler/file1.ts:3:9: 'duplicate1' was also declared here. + duplicate2(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate2'. +!!! related TS6203 tests/cases/compiler/file1.ts:4:9: 'duplicate2' was also declared here. + duplicate3(): number; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate3'. +!!! related TS6203 tests/cases/compiler/file1.ts:5:9: 'duplicate3' was also declared here. + } + } + export {}; + +==== tests/cases/compiler/file1.ts (3 errors) ==== + declare module "someMod" { + export interface TopLevel { + duplicate1: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate1'. +!!! related TS6203 tests/cases/compiler/file2.ts:5:9: 'duplicate1' was also declared here. + duplicate2: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate2'. +!!! related TS6203 tests/cases/compiler/file2.ts:6:9: 'duplicate2' was also declared here. + duplicate3: () => string; + ~~~~~~~~~~ +!!! error TS2300: Duplicate identifier 'duplicate3'. +!!! related TS6203 tests/cases/compiler/file2.ts:7:9: 'duplicate3' was also declared here. + } + } \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans6.js b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.js new file mode 100644 index 0000000000000..d6a6501dca592 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.js @@ -0,0 +1,28 @@ +//// [tests/cases/compiler/duplicateIdentifierRelatedSpans6.ts] //// + +//// [file1.ts] +declare module "someMod" { + export interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + } +} +//// [file2.ts] +/// + +declare module "someMod" { + export interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + } +} +export {}; + + +//// [file1.js] +//// [file2.js] +"use strict"; +/// +exports.__esModule = true; diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans6.symbols b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.symbols new file mode 100644 index 0000000000000..0d8d01f1bed0e --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.symbols @@ -0,0 +1,38 @@ +=== tests/cases/compiler/file2.ts === +/// + +declare module "someMod" { +>"someMod" : Symbol("someMod", Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + export interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 26), Decl(file2.ts, 2, 26)) + + duplicate1(): number; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file2.ts, 3, 31)) + + duplicate2(): number; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file2.ts, 4, 29)) + + duplicate3(): number; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file2.ts, 5, 29)) + } +} +export {}; + +=== tests/cases/compiler/file1.ts === +declare module "someMod" { +>"someMod" : Symbol("someMod", Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + export interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 26), Decl(file2.ts, 2, 26)) + + duplicate1: () => string; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file1.ts, 1, 31)) + + duplicate2: () => string; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file1.ts, 2, 33)) + + duplicate3: () => string; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file1.ts, 3, 33)) + } +} diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans6.types b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.types new file mode 100644 index 0000000000000..446e402d834f8 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans6.types @@ -0,0 +1,38 @@ +=== tests/cases/compiler/file2.ts === +/// + +declare module "someMod" { +>"someMod" : typeof import("someMod") + + export interface TopLevel { +>TopLevel : TopLevel + + duplicate1(): number; +>duplicate1 : () => number + + duplicate2(): number; +>duplicate2 : () => number + + duplicate3(): number; +>duplicate3 : () => number + } +} +export {}; + +=== tests/cases/compiler/file1.ts === +declare module "someMod" { +>"someMod" : typeof import("someMod") + + export interface TopLevel { +>TopLevel : TopLevel + + duplicate1: () => string; +>duplicate1 : () => string + + duplicate2: () => string; +>duplicate2 : () => string + + duplicate3: () => string; +>duplicate3 : () => string + } +} diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans7.errors.txt b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.errors.txt new file mode 100644 index 0000000000000..76bb3d9c750b2 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.errors.txt @@ -0,0 +1,58 @@ +tests/cases/compiler/file1.ts:1:1 - error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8, duplicate9 + +1 declare module "someMod" { +  ~~~~~~~ + + tests/cases/compiler/file2.ts:3:1 + 3 declare module "someMod" { +   ~~~~~~~ + Conflicts are in this file. +tests/cases/compiler/file2.ts:3:1 - error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8, duplicate9 + +3 declare module "someMod" { +  ~~~~~~~ + + tests/cases/compiler/file1.ts:1:1 + 1 declare module "someMod" { +   ~~~~~~~ + Conflicts are in this file. + + +==== tests/cases/compiler/file2.ts (1 errors) ==== + /// + + declare module "someMod" { + ~~~~~~~ +!!! error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8, duplicate9 +!!! related TS6201 tests/cases/compiler/file1.ts:1:1: Conflicts are in this file. + export interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + duplicate4(): number; + duplicate5(): number; + duplicate6(): number; + duplicate7(): number; + duplicate8(): number; + duplicate9(): number; + } + } + export {}; + +==== tests/cases/compiler/file1.ts (1 errors) ==== + declare module "someMod" { + ~~~~~~~ +!!! error TS6200: Definitions of the following identifiers conflict with those in another file: duplicate1, duplicate2, duplicate3, duplicate4, duplicate5, duplicate6, duplicate7, duplicate8, duplicate9 +!!! related TS6201 tests/cases/compiler/file2.ts:3:1: Conflicts are in this file. + export interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + duplicate4: () => string; + duplicate5: () => string; + duplicate6: () => string; + duplicate7: () => string; + duplicate8: () => string; + duplicate9: () => string; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans7.js b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.js new file mode 100644 index 0000000000000..9bb8a73bd8d18 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.js @@ -0,0 +1,40 @@ +//// [tests/cases/compiler/duplicateIdentifierRelatedSpans7.ts] //// + +//// [file1.ts] +declare module "someMod" { + export interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + duplicate4: () => string; + duplicate5: () => string; + duplicate6: () => string; + duplicate7: () => string; + duplicate8: () => string; + duplicate9: () => string; + } +} +//// [file2.ts] +/// + +declare module "someMod" { + export interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + duplicate4(): number; + duplicate5(): number; + duplicate6(): number; + duplicate7(): number; + duplicate8(): number; + duplicate9(): number; + } +} +export {}; + + +//// [file1.js] +//// [file2.js] +"use strict"; +/// +exports.__esModule = true; diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans7.symbols b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.symbols new file mode 100644 index 0000000000000..e2843e9c2e2d3 --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.symbols @@ -0,0 +1,74 @@ +=== tests/cases/compiler/file2.ts === +/// + +declare module "someMod" { +>"someMod" : Symbol("someMod", Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + export interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 26), Decl(file2.ts, 2, 26)) + + duplicate1(): number; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file2.ts, 3, 31)) + + duplicate2(): number; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file2.ts, 4, 29)) + + duplicate3(): number; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file2.ts, 5, 29)) + + duplicate4(): number; +>duplicate4 : Symbol(TopLevel.duplicate4, Decl(file2.ts, 6, 29)) + + duplicate5(): number; +>duplicate5 : Symbol(TopLevel.duplicate5, Decl(file2.ts, 7, 29)) + + duplicate6(): number; +>duplicate6 : Symbol(TopLevel.duplicate6, Decl(file2.ts, 8, 29)) + + duplicate7(): number; +>duplicate7 : Symbol(TopLevel.duplicate7, Decl(file2.ts, 9, 29)) + + duplicate8(): number; +>duplicate8 : Symbol(TopLevel.duplicate8, Decl(file2.ts, 10, 29)) + + duplicate9(): number; +>duplicate9 : Symbol(TopLevel.duplicate9, Decl(file2.ts, 11, 29)) + } +} +export {}; + +=== tests/cases/compiler/file1.ts === +declare module "someMod" { +>"someMod" : Symbol("someMod", Decl(file1.ts, 0, 0), Decl(file2.ts, 0, 0)) + + export interface TopLevel { +>TopLevel : Symbol(TopLevel, Decl(file1.ts, 0, 26), Decl(file2.ts, 2, 26)) + + duplicate1: () => string; +>duplicate1 : Symbol(TopLevel.duplicate1, Decl(file1.ts, 1, 31)) + + duplicate2: () => string; +>duplicate2 : Symbol(TopLevel.duplicate2, Decl(file1.ts, 2, 33)) + + duplicate3: () => string; +>duplicate3 : Symbol(TopLevel.duplicate3, Decl(file1.ts, 3, 33)) + + duplicate4: () => string; +>duplicate4 : Symbol(TopLevel.duplicate4, Decl(file1.ts, 4, 33)) + + duplicate5: () => string; +>duplicate5 : Symbol(TopLevel.duplicate5, Decl(file1.ts, 5, 33)) + + duplicate6: () => string; +>duplicate6 : Symbol(TopLevel.duplicate6, Decl(file1.ts, 6, 33)) + + duplicate7: () => string; +>duplicate7 : Symbol(TopLevel.duplicate7, Decl(file1.ts, 7, 33)) + + duplicate8: () => string; +>duplicate8 : Symbol(TopLevel.duplicate8, Decl(file1.ts, 8, 33)) + + duplicate9: () => string; +>duplicate9 : Symbol(TopLevel.duplicate9, Decl(file1.ts, 9, 33)) + } +} diff --git a/tests/baselines/reference/duplicateIdentifierRelatedSpans7.types b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.types new file mode 100644 index 0000000000000..4776b7a0b928b --- /dev/null +++ b/tests/baselines/reference/duplicateIdentifierRelatedSpans7.types @@ -0,0 +1,74 @@ +=== tests/cases/compiler/file2.ts === +/// + +declare module "someMod" { +>"someMod" : typeof import("someMod") + + export interface TopLevel { +>TopLevel : TopLevel + + duplicate1(): number; +>duplicate1 : () => number + + duplicate2(): number; +>duplicate2 : () => number + + duplicate3(): number; +>duplicate3 : () => number + + duplicate4(): number; +>duplicate4 : () => number + + duplicate5(): number; +>duplicate5 : () => number + + duplicate6(): number; +>duplicate6 : () => number + + duplicate7(): number; +>duplicate7 : () => number + + duplicate8(): number; +>duplicate8 : () => number + + duplicate9(): number; +>duplicate9 : () => number + } +} +export {}; + +=== tests/cases/compiler/file1.ts === +declare module "someMod" { +>"someMod" : typeof import("someMod") + + export interface TopLevel { +>TopLevel : TopLevel + + duplicate1: () => string; +>duplicate1 : () => string + + duplicate2: () => string; +>duplicate2 : () => string + + duplicate3: () => string; +>duplicate3 : () => string + + duplicate4: () => string; +>duplicate4 : () => string + + duplicate5: () => string; +>duplicate5 : () => string + + duplicate6: () => string; +>duplicate6 : () => string + + duplicate7: () => string; +>duplicate7 : () => string + + duplicate8: () => string; +>duplicate8 : () => string + + duplicate9: () => string; +>duplicate9 : () => string + } +} diff --git a/tests/baselines/reference/duplicateIdentifiersAcrossFileBoundaries.errors.txt b/tests/baselines/reference/duplicateIdentifiersAcrossFileBoundaries.errors.txt index 400bafa3c1a75..8dca0b9ffcc3c 100644 --- a/tests/baselines/reference/duplicateIdentifiersAcrossFileBoundaries.errors.txt +++ b/tests/baselines/reference/duplicateIdentifiersAcrossFileBoundaries.errors.txt @@ -13,15 +13,18 @@ tests/cases/compiler/file2.ts(8,16): error TS2300: Duplicate identifier 'x'. class C2 { } ~~ !!! error TS2300: Duplicate identifier 'C2'. +!!! related TS6203 tests/cases/compiler/file2.ts:3:10: 'C2' was also declared here. function f() { } ~ !!! error TS2300: Duplicate identifier 'f'. +!!! related TS6203 tests/cases/compiler/file2.ts:4:7: 'f' was also declared here. var v = 3; class Foo { static x: number; ~ !!! error TS2300: Duplicate identifier 'x'. +!!! related TS6203 tests/cases/compiler/file2.ts:8:16: 'x' was also declared here. } module N { @@ -36,9 +39,11 @@ tests/cases/compiler/file2.ts(8,16): error TS2300: Duplicate identifier 'x'. function C2() { } // error -- cannot merge function with non-ambient class ~~ !!! error TS2300: Duplicate identifier 'C2'. +!!! related TS6203 tests/cases/compiler/file1.ts:3:7: 'C2' was also declared here. class f { } // error -- cannot merge function with non-ambient class ~ !!! error TS2300: Duplicate identifier 'f'. +!!! related TS6203 tests/cases/compiler/file1.ts:4:10: 'f' was also declared here. var v = 3; module Foo { @@ -47,6 +52,7 @@ tests/cases/compiler/file2.ts(8,16): error TS2300: Duplicate identifier 'x'. export var x: number; // error for redeclaring var in a different parent ~ !!! error TS2300: Duplicate identifier 'x'. +!!! related TS6203 tests/cases/compiler/file1.ts:8:12: 'x' was also declared here. } declare module N { diff --git a/tests/baselines/reference/esModuleInteropPrettyErrorRelatedInformation.errors.txt b/tests/baselines/reference/esModuleInteropPrettyErrorRelatedInformation.errors.txt index 96a31032d4dde..1d1c983162fc8 100644 --- a/tests/baselines/reference/esModuleInteropPrettyErrorRelatedInformation.errors.txt +++ b/tests/baselines/reference/esModuleInteropPrettyErrorRelatedInformation.errors.txt @@ -21,4 +21,5 @@ ~~~ !!! error TS2345: Argument of type '{ default: () => void; }' is not assignable to parameter of type '() => void'. !!! error TS2345: Type '{ default: () => void; }' provides no match for the signature '(): void'. +!!! related TS7038 tests/cases/compiler/index.ts:1:1: Type originates at this import. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead. \ No newline at end of file diff --git a/tests/baselines/reference/letDeclarations-scopes-duplicates2.errors.txt b/tests/baselines/reference/letDeclarations-scopes-duplicates2.errors.txt index 6b07619781618..3c684608285cb 100644 --- a/tests/baselines/reference/letDeclarations-scopes-duplicates2.errors.txt +++ b/tests/baselines/reference/letDeclarations-scopes-duplicates2.errors.txt @@ -6,8 +6,10 @@ tests/cases/compiler/file2.ts(1,5): error TS2451: Cannot redeclare block-scoped let var1 = 0; ~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file2.ts:1:5: 'var1' was also declared here. ==== tests/cases/compiler/file2.ts (1 errors) ==== let var1 = 0; ~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. \ No newline at end of file +!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/letDeclarations-scopes-duplicates3.errors.txt b/tests/baselines/reference/letDeclarations-scopes-duplicates3.errors.txt index 2ce3fd1c41a66..a29219219521e 100644 --- a/tests/baselines/reference/letDeclarations-scopes-duplicates3.errors.txt +++ b/tests/baselines/reference/letDeclarations-scopes-duplicates3.errors.txt @@ -6,8 +6,10 @@ tests/cases/compiler/file2.ts(1,7): error TS2451: Cannot redeclare block-scoped let var1 = 0; ~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file2.ts:1:7: 'var1' was also declared here. ==== tests/cases/compiler/file2.ts (1 errors) ==== const var1 = 0; ~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. \ No newline at end of file +!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/letDeclarations-scopes-duplicates4.errors.txt b/tests/baselines/reference/letDeclarations-scopes-duplicates4.errors.txt index b276d6a35151a..4d59fe30ec8b5 100644 --- a/tests/baselines/reference/letDeclarations-scopes-duplicates4.errors.txt +++ b/tests/baselines/reference/letDeclarations-scopes-duplicates4.errors.txt @@ -6,8 +6,10 @@ tests/cases/compiler/file2.ts(1,5): error TS2451: Cannot redeclare block-scoped const var1 = 0; ~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file2.ts:1:5: 'var1' was also declared here. ==== tests/cases/compiler/file2.ts (1 errors) ==== let var1 = 0; ~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. \ No newline at end of file +!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:7: 'var1' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/letDeclarations-scopes-duplicates5.errors.txt b/tests/baselines/reference/letDeclarations-scopes-duplicates5.errors.txt index 09955c14bc019..ca57232a2d939 100644 --- a/tests/baselines/reference/letDeclarations-scopes-duplicates5.errors.txt +++ b/tests/baselines/reference/letDeclarations-scopes-duplicates5.errors.txt @@ -6,8 +6,10 @@ tests/cases/compiler/file2.ts(1,7): error TS2451: Cannot redeclare block-scoped const var1 = 0; ~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file2.ts:1:7: 'var1' was also declared here. ==== tests/cases/compiler/file2.ts (1 errors) ==== const var1 = 0; ~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. \ No newline at end of file +!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:7: 'var1' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/letDeclarations-scopes-duplicates6.errors.txt b/tests/baselines/reference/letDeclarations-scopes-duplicates6.errors.txt index 1d39bcde276c1..bd57b2c479e5a 100644 --- a/tests/baselines/reference/letDeclarations-scopes-duplicates6.errors.txt +++ b/tests/baselines/reference/letDeclarations-scopes-duplicates6.errors.txt @@ -6,8 +6,10 @@ tests/cases/compiler/file2.ts(1,5): error TS2451: Cannot redeclare block-scoped var var1 = 0; ~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file2.ts:1:5: 'var1' was also declared here. ==== tests/cases/compiler/file2.ts (1 errors) ==== let var1 = 0; ~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. \ No newline at end of file +!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/letDeclarations-scopes-duplicates7.errors.txt b/tests/baselines/reference/letDeclarations-scopes-duplicates7.errors.txt index bead743dc4ef3..c9e9f7baf2fd5 100644 --- a/tests/baselines/reference/letDeclarations-scopes-duplicates7.errors.txt +++ b/tests/baselines/reference/letDeclarations-scopes-duplicates7.errors.txt @@ -6,8 +6,10 @@ tests/cases/compiler/file2.ts(1,5): error TS2451: Cannot redeclare block-scoped let var1 = 0; ~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file2.ts:1:5: 'var1' was also declared here. ==== tests/cases/compiler/file2.ts (1 errors) ==== var var1 = 0; ~~~~ -!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. \ No newline at end of file +!!! error TS2451: Cannot redeclare block-scoped variable 'var1'. +!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.errors.txt b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.errors.txt index 20bf52d1ca427..f9f564f1cc29b 100644 --- a/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.errors.txt +++ b/tests/baselines/reference/parser.asyncGenerators.functionExpressions.esnext.errors.txt @@ -37,6 +37,7 @@ tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldStarMissingVa !!! error TS1005: '(' expected. ~~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'await'. +!!! related TS6203 tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/awaitParameterIsError.ts:1:30: 'await' was also declared here. ~ !!! error TS1005: ',' expected. ~ @@ -48,6 +49,7 @@ tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldStarMissingVa !!! error TS1005: '(' expected. ~~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'yield'. +!!! related TS6203 tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldParameterIsError.ts:1:30: 'yield' was also declared here. ~ !!! error TS1005: ',' expected. ~ @@ -59,6 +61,7 @@ tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldStarMissingVa !!! error TS1138: Parameter declaration expected. ~~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'await'. +!!! related TS6203 tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/awaitNameIsError.ts:1:29: 'await' was also declared here. ~ !!! error TS1005: ',' expected. }; @@ -68,6 +71,7 @@ tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldStarMissingVa !!! error TS1138: Parameter declaration expected. ~~~~~ !!! error TS2451: Cannot redeclare block-scoped variable 'yield'. +!!! related TS6203 tests/cases/conformance/parser/ecmascriptnext/asyncGenerators/yieldNameIsError.ts:1:29: 'yield' was also declared here. ~ !!! error TS1005: ',' expected. }; diff --git a/tests/baselines/reference/project/declareVariableCollision/amd/declareVariableCollision.errors.txt b/tests/baselines/reference/project/declareVariableCollision/amd/declareVariableCollision.errors.txt index 64ec399fabf71..73d3a86d014bc 100644 --- a/tests/baselines/reference/project/declareVariableCollision/amd/declareVariableCollision.errors.txt +++ b/tests/baselines/reference/project/declareVariableCollision/amd/declareVariableCollision.errors.txt @@ -19,7 +19,9 @@ in2.d.ts(1,8): error TS2300: Duplicate identifier 'a'. import a = A; ~ !!! error TS2300: Duplicate identifier 'a'. +!!! related TS6203 in2.d.ts:1:8: 'a' was also declared here. ==== in2.d.ts (1 errors) ==== import a = A; ~ -!!! error TS2300: Duplicate identifier 'a'. \ No newline at end of file +!!! error TS2300: Duplicate identifier 'a'. +!!! related TS6203 in1.d.ts:1:8: 'a' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/project/declareVariableCollision/node/declareVariableCollision.errors.txt b/tests/baselines/reference/project/declareVariableCollision/node/declareVariableCollision.errors.txt index 64ec399fabf71..73d3a86d014bc 100644 --- a/tests/baselines/reference/project/declareVariableCollision/node/declareVariableCollision.errors.txt +++ b/tests/baselines/reference/project/declareVariableCollision/node/declareVariableCollision.errors.txt @@ -19,7 +19,9 @@ in2.d.ts(1,8): error TS2300: Duplicate identifier 'a'. import a = A; ~ !!! error TS2300: Duplicate identifier 'a'. +!!! related TS6203 in2.d.ts:1:8: 'a' was also declared here. ==== in2.d.ts (1 errors) ==== import a = A; ~ -!!! error TS2300: Duplicate identifier 'a'. \ No newline at end of file +!!! error TS2300: Duplicate identifier 'a'. +!!! related TS6203 in1.d.ts:1:8: 'a' was also declared here. \ No newline at end of file diff --git a/tests/baselines/reference/typedefCrossModule5.errors.txt b/tests/baselines/reference/typedefCrossModule5.errors.txt new file mode 100644 index 0000000000000..b75652a31d573 --- /dev/null +++ b/tests/baselines/reference/typedefCrossModule5.errors.txt @@ -0,0 +1,58 @@ +tests/cases/conformance/jsdoc/mod1.js:1:23 - error TS2300: Duplicate identifier 'Foo'. + +1 /** @typedef {number} Foo */ +   ~~~ + + tests/cases/conformance/jsdoc/mod2.js:1:7 + 1 class Foo { } // should error +    ~~~ + 'Foo' was also declared here. +tests/cases/conformance/jsdoc/mod1.js:2:7 - error TS2451: Cannot redeclare block-scoped variable 'Bar'. + +2 class Bar {} +   ~~~ + + tests/cases/conformance/jsdoc/mod2.js:2:7 + 2 const Bar = 3; +    ~~~ + 'Bar' was also declared here. +tests/cases/conformance/jsdoc/mod2.js:1:7 - error TS2300: Duplicate identifier 'Foo'. + +1 class Foo { } // should error +   ~~~ + + tests/cases/conformance/jsdoc/mod1.js:1:23 + 1 /** @typedef {number} Foo */ +    ~~~ + 'Foo' was also declared here. +tests/cases/conformance/jsdoc/mod2.js:2:7 - error TS2451: Cannot redeclare block-scoped variable 'Bar'. + +2 const Bar = 3; +   ~~~ + + tests/cases/conformance/jsdoc/mod1.js:2:7 + 2 class Bar {} +    ~~~ + 'Bar' was also declared here. + + +==== tests/cases/conformance/jsdoc/mod1.js (2 errors) ==== + /** @typedef {number} Foo */ + ~~~ +!!! error TS2300: Duplicate identifier 'Foo'. +!!! related TS6203 tests/cases/conformance/jsdoc/mod2.js:1:7: 'Foo' was also declared here. + class Bar {} + ~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'Bar'. +!!! related TS6203 tests/cases/conformance/jsdoc/mod2.js:2:7: 'Bar' was also declared here. + +==== tests/cases/conformance/jsdoc/mod2.js (2 errors) ==== + class Foo { } // should error + ~~~ +!!! error TS2300: Duplicate identifier 'Foo'. +!!! related TS6203 tests/cases/conformance/jsdoc/mod1.js:1:23: 'Foo' was also declared here. + const Bar = 3; + ~~~ +!!! error TS2451: Cannot redeclare block-scoped variable 'Bar'. +!!! related TS6203 tests/cases/conformance/jsdoc/mod1.js:2:7: 'Bar' was also declared here. + \ No newline at end of file diff --git a/tests/baselines/reference/typedefCrossModule5.symbols b/tests/baselines/reference/typedefCrossModule5.symbols new file mode 100644 index 0000000000000..a0f898799d5e8 --- /dev/null +++ b/tests/baselines/reference/typedefCrossModule5.symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/jsdoc/mod1.js === +/** @typedef {number} Foo */ +class Bar {} +>Bar : Symbol(Bar, Decl(mod1.js, 0, 0)) + +=== tests/cases/conformance/jsdoc/mod2.js === +class Foo { } // should error +>Foo : Symbol(Foo, Decl(mod2.js, 0, 0)) + +const Bar = 3; +>Bar : Symbol(Bar, Decl(mod2.js, 1, 5)) + diff --git a/tests/baselines/reference/typedefCrossModule5.types b/tests/baselines/reference/typedefCrossModule5.types new file mode 100644 index 0000000000000..0a561edde332d --- /dev/null +++ b/tests/baselines/reference/typedefCrossModule5.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/mod1.js === +/** @typedef {number} Foo */ +class Bar {} +>Bar : Bar + +=== tests/cases/conformance/jsdoc/mod2.js === +class Foo { } // should error +>Foo : Foo + +const Bar = 3; +>Bar : 3 +>3 : 3 + diff --git a/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt b/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt index 10b6a9b0c3bfd..0d78ecb6fb28f 100644 --- a/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt +++ b/tests/baselines/reference/variableDeclarationInStrictMode1.errors.txt @@ -9,4 +9,5 @@ lib.es5.d.ts(32,18): error TS2300: Duplicate identifier 'eval'. ~~~~ !!! error TS1100: Invalid use of 'eval' in strict mode. ~~~~ -!!! error TS2300: Duplicate identifier 'eval'. \ No newline at end of file +!!! error TS2300: Duplicate identifier 'eval'. +!!! related TS6203 /.ts/lib.es5.d.ts:32:18: 'eval' was also declared here. \ No newline at end of file diff --git a/tests/cases/compiler/duplicateIdentifierRelatedSpans1.ts b/tests/cases/compiler/duplicateIdentifierRelatedSpans1.ts new file mode 100644 index 0000000000000..80286eddcc9fd --- /dev/null +++ b/tests/cases/compiler/duplicateIdentifierRelatedSpans1.ts @@ -0,0 +1,10 @@ +// @pretty: true +// @filename: file1.ts +class Foo { } +const Bar = 3; +// @filename: file2.ts +type Foo = number; +class Bar {} +// @filename: file3.ts +type Foo = 54; +let Bar = 42 diff --git a/tests/cases/compiler/duplicateIdentifierRelatedSpans2.ts b/tests/cases/compiler/duplicateIdentifierRelatedSpans2.ts new file mode 100644 index 0000000000000..b38af1b4513d7 --- /dev/null +++ b/tests/cases/compiler/duplicateIdentifierRelatedSpans2.ts @@ -0,0 +1,21 @@ +// @pretty: true +// @filename: file1.ts +class A { } +class B { } +class C { } +class D { } +class E { } +class F { } +class G { } +class H { } +class I { } +// @filename: file2.ts +class A { } +class B { } +class C { } +class D { } +class E { } +class F { } +class G { } +class H { } +class I { } diff --git a/tests/cases/compiler/duplicateIdentifierRelatedSpans3.ts b/tests/cases/compiler/duplicateIdentifierRelatedSpans3.ts new file mode 100644 index 0000000000000..1e11dfe55491c --- /dev/null +++ b/tests/cases/compiler/duplicateIdentifierRelatedSpans3.ts @@ -0,0 +1,13 @@ +// @pretty: true +// @filename: file1.ts +interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; +} +// @filename: file2.ts +interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; +} diff --git a/tests/cases/compiler/duplicateIdentifierRelatedSpans4.ts b/tests/cases/compiler/duplicateIdentifierRelatedSpans4.ts new file mode 100644 index 0000000000000..8668e1ad4ce12 --- /dev/null +++ b/tests/cases/compiler/duplicateIdentifierRelatedSpans4.ts @@ -0,0 +1,23 @@ +// @pretty: true +// @filename: file1.ts +interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + duplicate4: () => string; + duplicate5: () => string; + duplicate6: () => string; + duplicate7: () => string; + duplicate8: () => string; +} +// @filename: file2.ts +interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + duplicate4(): number; + duplicate5(): number; + duplicate6(): number; + duplicate7(): number; + duplicate8(): number; +} diff --git a/tests/cases/compiler/duplicateIdentifierRelatedSpans5.ts b/tests/cases/compiler/duplicateIdentifierRelatedSpans5.ts new file mode 100644 index 0000000000000..372e0b52a31df --- /dev/null +++ b/tests/cases/compiler/duplicateIdentifierRelatedSpans5.ts @@ -0,0 +1,20 @@ +// @pretty: true +// @filename: file1.ts +declare global { + interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + } +} +export {} +// @filename: file2.ts +import "./file1"; +declare global { + interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + } +} +export {} diff --git a/tests/cases/compiler/duplicateIdentifierRelatedSpans6.ts b/tests/cases/compiler/duplicateIdentifierRelatedSpans6.ts new file mode 100644 index 0000000000000..4229f120932f6 --- /dev/null +++ b/tests/cases/compiler/duplicateIdentifierRelatedSpans6.ts @@ -0,0 +1,20 @@ +// @pretty: true +// @filename: file1.ts +declare module "someMod" { + export interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + } +} +// @filename: file2.ts +/// + +declare module "someMod" { + export interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + } +} +export {}; diff --git a/tests/cases/compiler/duplicateIdentifierRelatedSpans7.ts b/tests/cases/compiler/duplicateIdentifierRelatedSpans7.ts new file mode 100644 index 0000000000000..26063beea289b --- /dev/null +++ b/tests/cases/compiler/duplicateIdentifierRelatedSpans7.ts @@ -0,0 +1,32 @@ +// @pretty: true +// @filename: file1.ts +declare module "someMod" { + export interface TopLevel { + duplicate1: () => string; + duplicate2: () => string; + duplicate3: () => string; + duplicate4: () => string; + duplicate5: () => string; + duplicate6: () => string; + duplicate7: () => string; + duplicate8: () => string; + duplicate9: () => string; + } +} +// @filename: file2.ts +/// + +declare module "someMod" { + export interface TopLevel { + duplicate1(): number; + duplicate2(): number; + duplicate3(): number; + duplicate4(): number; + duplicate5(): number; + duplicate6(): number; + duplicate7(): number; + duplicate8(): number; + duplicate9(): number; + } +} +export {}; diff --git a/tests/cases/conformance/jsdoc/typedefCrossModule5.ts b/tests/cases/conformance/jsdoc/typedefCrossModule5.ts new file mode 100644 index 0000000000000..e90da7b43e80b --- /dev/null +++ b/tests/cases/conformance/jsdoc/typedefCrossModule5.ts @@ -0,0 +1,12 @@ +// @pretty: true +// @noEmit: true +// @allowJs: true +// @checkJs: true +// @Filename: mod1.js + +/** @typedef {number} Foo */ +class Bar {} + +// @Filename: mod2.js +class Foo { } // should error +const Bar = 3;