Skip to content

Error on types named "undefined" #57575

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Mar 11, 2024
Prev Previous commit
Next Next commit
Restore global
  • Loading branch information
jakebailey committed Feb 29, 2024
commit f8db7074ce3c63479343de81cc19f9e709ca122b
24 changes: 23 additions & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1473,7 +1473,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
var globals = createSymbolTable();
var undefinedSymbol = createSymbol(SymbolFlags.Property, "undefined" as __String);
undefinedSymbol.declarations = [];
globals.set(undefinedSymbol.escapedName, undefinedSymbol);

var globalThisSymbol = createSymbol(SymbolFlags.Module, "globalThis" as __String, CheckFlags.Readonly);
globalThisSymbol.exports = globals;
Expand Down Expand Up @@ -2256,6 +2255,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
var identityRelation = new Map<string, RelationComparisonResult>();
var enumRelation = new Map<string, RelationComparisonResult>();

var builtinGlobals = createSymbolTable();
builtinGlobals.set(undefinedSymbol.escapedName, undefinedSymbol);

// Extensions suggested for path imports when module resolution is node16 or higher.
// The first element of each tuple is the extension a file has.
// The second element of each tuple is the extension that should be used in a path import.
Expand Down Expand Up @@ -2718,6 +2720,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
}

function addToSymbolTable(target: SymbolTable, source: SymbolTable, message: DiagnosticMessage) {
source.forEach((sourceSymbol, id) => {
const targetSymbol = target.get(id);
if (targetSymbol) {
// Error on redeclarations
forEach(targetSymbol.declarations, addDeclarationDiagnostic(unescapeLeadingUnderscores(id), message));
}
else {
target.set(id, sourceSymbol);
}
});

function addDeclarationDiagnostic(id: string, message: DiagnosticMessage) {
return (declaration: Declaration) => diagnostics.add(createDiagnosticForNode(declaration, message, id));
}
}

function getSymbolLinks(symbol: Symbol): SymbolLinks {
if (symbol.flags & SymbolFlags.Transient) return (symbol as TransientSymbol).links;
const id = getSymbolId(symbol);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I opted to eliminate builtinGlobals while here; its only use is to complain about undefined, but now we're going to complain even less and the new code had to exclude type declarations anyway.

Expand Down Expand Up @@ -48777,6 +48796,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
}

// Setup global builtins
addToSymbolTable(globals, builtinGlobals, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0);

getSymbolLinks(undefinedSymbol).type = undefinedWideningType;
getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments" as __String, /*arity*/ 0, /*reportErrors*/ true);
getSymbolLinks(unknownSymbol).type = errorType;
Expand Down
8 changes: 4 additions & 4 deletions tests/baselines/reference/mappedTypeRecursiveInference.types

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
undefinedTypeAssignment1.ts(1,6): error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.
undefinedTypeAssignment1.ts(1,6): error TS2457: Type alias name cannot be 'undefined'.


==== undefinedTypeAssignment1.ts (1 errors) ====
==== undefinedTypeAssignment1.ts (2 errors) ====
type undefined = string;
~~~~~~~~~
!!! error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.
~~~~~~~~~
!!! error TS2457: Type alias name cannot be 'undefined'.
function p(undefined = "wat") {
return undefined;
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/undefinedTypeAssignment2.errors.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
undefinedTypeAssignment2.ts(1,5): error TS2300: Duplicate identifier 'undefined'.
undefinedTypeAssignment2.ts(1,5): error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.


==== undefinedTypeAssignment2.ts (1 errors) ====
var undefined = void 0;
~~~~~~~~~
!!! error TS2300: Duplicate identifier 'undefined'.
!!! error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.

4 changes: 2 additions & 2 deletions tests/baselines/reference/undefinedTypeAssignment3.errors.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
undefinedTypeAssignment3.ts(1,5): error TS2300: Duplicate identifier 'undefined'.
undefinedTypeAssignment3.ts(1,5): error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.


==== undefinedTypeAssignment3.ts (1 errors) ====
var undefined = null;
~~~~~~~~~
!!! error TS2300: Duplicate identifier 'undefined'.
!!! error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.

12 changes: 6 additions & 6 deletions tests/baselines/reference/undefinedTypeAssignment4.errors.txt
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
undefinedTypeAssignment4.ts(1,7): error TS2300: Duplicate identifier 'undefined'.
undefinedTypeAssignment4.ts(1,7): error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.
undefinedTypeAssignment4.ts(1,7): error TS2414: Class name cannot be 'undefined'.
undefinedTypeAssignment4.ts(4,11): error TS2300: Duplicate identifier 'undefined'.
undefinedTypeAssignment4.ts(4,11): error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.
undefinedTypeAssignment4.ts(4,11): error TS2427: Interface name cannot be 'undefined'.
undefinedTypeAssignment4.ts(7,11): error TS2300: Duplicate identifier 'undefined'.
undefinedTypeAssignment4.ts(7,11): error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.


==== undefinedTypeAssignment4.ts (5 errors) ====
class undefined {
~~~~~~~~~
!!! error TS2300: Duplicate identifier 'undefined'.
!!! error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.
~~~~~~~~~
!!! error TS2414: Class name cannot be 'undefined'.
foo: string;
}
interface undefined {
~~~~~~~~~
!!! error TS2300: Duplicate identifier 'undefined'.
!!! error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.
~~~~~~~~~
!!! error TS2427: Interface name cannot be 'undefined'.
member: number;
}
namespace undefined {
~~~~~~~~~
!!! error TS2300: Duplicate identifier 'undefined'.
!!! error TS2397: Declaration name conflicts with built-in global identifier 'undefined'.
export var x = 42;
}
var x: undefined;
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/undefinedTypeAssignment4.symbols
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ var x: undefined;

var y: typeof undefined;
>y : Symbol(y, Decl(undefinedTypeAssignment4.ts, 10, 3))
>undefined : Symbol(undefined)
>undefined : Symbol(undefined, Decl(undefinedTypeAssignment4.ts, 0, 0), Decl(undefinedTypeAssignment4.ts, 2, 1), Decl(undefinedTypeAssignment4.ts, 5, 1))

4 changes: 2 additions & 2 deletions tests/baselines/reference/undefinedTypeAssignment4.types
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ var x: undefined;
>x : undefined

var y: typeof undefined;
>y : any
>undefined : undefined
>y : typeof undefined
>undefined : typeof undefined

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy