Adds related spans and error grouping for duplicate identifier errors (#25328)

* Adds related spans and error grouping for duplicate identifier errors

* Trim trailing whitespace

* Record related info in error baselines

* Make error more whimsical
This commit is contained in:
Wesley Wigham
2018-07-02 10:47:52 -07:00
committed by GitHub
parent 656f356495
commit 7084e6cf47
60 changed files with 1902 additions and 24 deletions
+108 -10
View File
@@ -422,6 +422,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<Type | undefined>();
let ambientModulesCache: Symbol[] | undefined;
/**
@@ -693,6 +694,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)
@@ -803,23 +826,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;
@@ -27449,6 +27512,8 @@ namespace ts {
bindSourceFile(file, compilerOptions);
}
amalgamatedDuplicates = createMap();
// Initialize global symbol table
let augmentations: ReadonlyArray<StringLiteral | Identifier>[] | undefined;
for (const file of host.getSourceFiles()) {
@@ -27526,6 +27591,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) {
+16
View File
@@ -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",
+5 -4
View File
@@ -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;
}
+3
View File
@@ -5330,6 +5330,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[];
+39
View File
@@ -2878,6 +2878,7 @@ namespace ts {
return {
add,
lookup,
getGlobalDiagnostics,
getDiagnostics,
reattachFileDiagnostics
@@ -2887,6 +2888,24 @@ namespace ts {
forEach(fileDiagnostics.get(newFile.fileName), diagnostic => diagnostic.file = newFile);
}
function lookup(diagnostic: Diagnostic): Diagnostic | undefined {
let diagnostics: SortedArray<Diagnostic> | 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<Diagnostic> | undefined;
if (diagnostic.file) {
@@ -6838,6 +6857,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) ||
@@ -6846,6 +6872,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;
+11
View File
@@ -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++;
+7
View File
@@ -4505,6 +4505,7 @@ declare namespace ts {
}
interface DiagnosticCollection {
add(diagnostic: Diagnostic): void;
lookup(diagnostic: Diagnostic): Diagnostic | undefined;
getGlobalDiagnostics(): Diagnostic[];
getDiagnostics(fileName: string): DiagnosticWithLocation[];
getDiagnostics(): Diagnostic[];
@@ -5716,6 +5717,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;
@@ -7083,6 +7088,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"];
@@ -8913,6 +8919,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<Diagnostic>, host: FormatDiagnosticsHost): string;
function flattenDiagnosticMessageText(messageText: string | DiagnosticMessageChain | undefined, newLine: string): string;
/**
@@ -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'.
!!! error TS2300: Duplicate identifier 'C3'.
!!! related TS6203 tests/cases/conformance/classes/classDeclarations/file2.ts:1:15: 'C3' was also declared here.
@@ -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
}
@@ -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.
@@ -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;
@@ -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))
@@ -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
@@ -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 { }
@@ -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;
}());
@@ -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))
@@ -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
@@ -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.
}
@@ -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]
@@ -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))
}
@@ -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
}
@@ -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;
}
@@ -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]
@@ -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))
}
@@ -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
}
@@ -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 {}
@@ -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");
@@ -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 {}
@@ -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 {}
@@ -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) ====
/// <reference path="./file1" />
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.
}
}
@@ -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]
/// <reference path="./file1" />
declare module "someMod" {
export interface TopLevel {
duplicate1(): number;
duplicate2(): number;
duplicate3(): number;
}
}
export {};
//// [file1.js]
//// [file2.js]
"use strict";
/// <reference path="./file1" />
exports.__esModule = true;
@@ -0,0 +1,38 @@
=== tests/cases/compiler/file2.ts ===
/// <reference path="./file1" />
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))
}
}
@@ -0,0 +1,38 @@
=== tests/cases/compiler/file2.ts ===
/// <reference path="./file1" />
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
}
}
@@ -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) ====
/// <reference path="./file1" />
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;
}
}
@@ -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]
/// <reference path="./file1" />
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";
/// <reference path="./file1" />
exports.__esModule = true;
@@ -0,0 +1,74 @@
=== tests/cases/compiler/file2.ts ===
/// <reference path="./file1" />
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))
}
}
@@ -0,0 +1,74 @@
=== tests/cases/compiler/file2.ts ===
/// <reference path="./file1" />
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
}
}
@@ -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 {
@@ -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.
@@ -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'.
!!! error TS2451: Cannot redeclare block-scoped variable 'var1'.
!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here.
@@ -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'.
!!! error TS2451: Cannot redeclare block-scoped variable 'var1'.
!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here.
@@ -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'.
!!! error TS2451: Cannot redeclare block-scoped variable 'var1'.
!!! related TS6203 tests/cases/compiler/file1.ts:1:7: 'var1' was also declared here.
@@ -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'.
!!! error TS2451: Cannot redeclare block-scoped variable 'var1'.
!!! related TS6203 tests/cases/compiler/file1.ts:1:7: 'var1' was also declared here.
@@ -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'.
!!! error TS2451: Cannot redeclare block-scoped variable 'var1'.
!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here.
@@ -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'.
!!! error TS2451: Cannot redeclare block-scoped variable 'var1'.
!!! related TS6203 tests/cases/compiler/file1.ts:1:5: 'var1' was also declared here.
@@ -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.
};
@@ -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'.
!!! error TS2300: Duplicate identifier 'a'.
!!! related TS6203 in1.d.ts:1:8: 'a' was also declared here.
@@ -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'.
!!! error TS2300: Duplicate identifier 'a'.
!!! related TS6203 in1.d.ts:1:8: 'a' was also declared here.
@@ -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.
@@ -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))
@@ -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
@@ -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'.
!!! error TS2300: Duplicate identifier 'eval'.
!!! related TS6203 /.ts/lib.es5.d.ts:32:18: 'eval' was also declared here.
@@ -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
@@ -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 { }
@@ -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;
}
@@ -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;
}
@@ -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 {}
@@ -0,0 +1,20 @@
// @pretty: true
// @filename: file1.ts
declare module "someMod" {
export interface TopLevel {
duplicate1: () => string;
duplicate2: () => string;
duplicate3: () => string;
}
}
// @filename: file2.ts
/// <reference path="./file1" />
declare module "someMod" {
export interface TopLevel {
duplicate1(): number;
duplicate2(): number;
duplicate3(): number;
}
}
export {};
@@ -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
/// <reference path="./file1" />
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 {};
@@ -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;