diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b2a0629cc71..99071469dec 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1034,7 +1034,6 @@ import { TypeReferenceType, TypeVariable, UnaryExpression, - UnderscoreEscapedMap, unescapeLeadingUnderscores, UnionOrIntersectionType, UnionOrIntersectionTypeNode, @@ -5259,7 +5258,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { exportsWithDuplicate?: ExportDeclaration[]; } - type ExportCollisionTrackerTable = UnderscoreEscapedMap; + type ExportCollisionTrackerTable = Map<__String, ExportCollisionTracker>; /** * Extends one symbol table with another while collecting information on name collisions for error message generation into the `lookupTable` argument @@ -5293,7 +5292,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function getExportsOfModuleWorker(moduleSymbol: Symbol) { const visitedSymbols: Symbol[] = []; - let typeOnlyExportStarMap: UnderscoreEscapedMap | undefined; + let typeOnlyExportStarMap: Map<__String, ExportDeclaration & { readonly isTypeOnly: true }> | undefined; const nonTypeOnlyNames = new Set<__String>(); // A module defined by an 'export=' consists of one export that needs to be resolved @@ -5706,7 +5705,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // The below is used to lookup type parameters within a class or interface, as they are added to the class/interface locals // These can never be latebound, so the symbol's raw members are sufficient. `getMembersOfNode` cannot be used, as it would // trigger resolving late-bound names, which we may already be in the process of doing while we're here! - let table: UnderscoreEscapedMap | undefined; + let table: Map<__String, Symbol> | undefined; // TODO: Should this filtered table be cached in some way? (getSymbolOfDeclaration(location as ClassLikeDeclaration | InterfaceDeclaration).members || emptySymbols).forEach((memberSymbol, key) => { if (memberSymbol.flags & (SymbolFlags.Type & ~SymbolFlags.Assignment)) { @@ -12354,7 +12353,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { * @param lateSymbols The late-bound symbols of the parent. * @param decl The member to bind. */ - function lateBindMember(parent: Symbol, earlySymbols: SymbolTable | undefined, lateSymbols: UnderscoreEscapedMap, decl: LateBoundDeclaration | LateBoundBinaryExpressionDeclaration) { + function lateBindMember(parent: Symbol, earlySymbols: SymbolTable | undefined, lateSymbols: Map<__String, TransientSymbol>, decl: LateBoundDeclaration | LateBoundBinaryExpressionDeclaration) { Debug.assert(!!decl.symbol, "The member is expected to have a symbol."); const links = getNodeLinks(decl); if (!links.resolvedSymbol) { @@ -12398,7 +12397,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return links.resolvedSymbol; } - function getResolvedMembersOrExportsOfSymbol(symbol: Symbol, resolutionKind: MembersOrExportsResolutionKind): UnderscoreEscapedMap { + function getResolvedMembersOrExportsOfSymbol(symbol: Symbol, resolutionKind: MembersOrExportsResolutionKind): Map<__String, Symbol> { const links = getSymbolLinks(symbol); if (!links[resolutionKind]) { const isStatic = resolutionKind === MembersOrExportsResolutionKind.resolvedExports; @@ -12412,7 +12411,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { links[resolutionKind] = earlySymbols || emptySymbols; // fill in any as-yet-unresolved late-bound members. - const lateSymbols = createSymbolTable() as UnderscoreEscapedMap; + const lateSymbols = createSymbolTable() as Map<__String, TransientSymbol>; for (const decl of symbol.declarations || emptyArray) { const members = getMembersOfDeclaration(decl); if (members) { @@ -13013,7 +13012,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (symbol.exports) { members = getExportsOfSymbol(symbol); if (symbol === globalThisSymbol) { - const varsOnly = new Map() as SymbolTable; + const varsOnly = new Map<__String, Symbol>(); members.forEach(p => { if (!(p.flags & SymbolFlags.BlockScoped) && !(p.flags & SymbolFlags.ValueModule && p.declarations?.length && every(p.declarations, isAmbientModule))) { varsOnly.set(p.escapedName, p); @@ -23426,7 +23425,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function getPropertiesOfContext(context: WideningContext): Symbol[] { if (!context.resolvedProperties) { - const names = new Map() as UnderscoreEscapedMap; + const names = new Map<__String, Symbol>(); for (const t of getSiblingsOfContext(context)) { if (isObjectLiteralType(t) && !(getObjectFlags(t) & ObjectFlags.ContainsSpread)) { for (const prop of getPropertiesOfType(t)) { @@ -37912,7 +37911,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } - function addName(names: UnderscoreEscapedMap, location: Node, name: __String, meaning: DeclarationMeaning) { + function addName(names: Map<__String, DeclarationMeaning>, location: Node, name: __String, meaning: DeclarationMeaning) { const prev = names.get(name); if (prev) { // For private identifiers, do not allow mixing of static and instance members with the same name diff --git a/src/compiler/core.ts b/src/compiler/core.ts index e24f79ef628..c16ae51c3aa 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1625,10 +1625,6 @@ export interface MultiMap extends Map { remove(key: K, value: V): void; } -/** @internal */ -export function createMultiMap(): MultiMap; -/** @internal */ -export function createMultiMap(): MultiMap; /** @internal */ export function createMultiMap(): MultiMap { const map = new Map() as MultiMap; diff --git a/src/compiler/resolutionCache.ts b/src/compiler/resolutionCache.ts index 6784dad515f..0f29b75d31b 100644 --- a/src/compiler/resolutionCache.ts +++ b/src/compiler/resolutionCache.ts @@ -263,7 +263,7 @@ export function createResolutionCache(resolutionHost: ResolutionCacheHost, rootD let filesWithChangedSetOfUnresolvedImports: Path[] | undefined; let filesWithInvalidatedResolutions: Set | undefined; let filesWithInvalidatedNonRelativeUnresolvedImports: ReadonlyMap | undefined; - const nonRelativeExternalModuleResolutions = createMultiMap(); + const nonRelativeExternalModuleResolutions = createMultiMap(); const resolutionsWithFailedLookups = new Set(); const resolutionsWithOnlyAffectingLocations = new Set(); diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 23810846bfa..df9221e20ab 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -380,7 +380,7 @@ function createDynamicPriorityPollingWatchFile(host: { function createUseFsEventsOnParentDirectoryWatchFile(fsWatch: FsWatch, useCaseSensitiveFileNames: boolean): HostWatchFile { // One file can have multiple watchers - const fileWatcherCallbacks = createMultiMap(); + const fileWatcherCallbacks = createMultiMap(); const dirWatchers = new Map(); const toCanonicalName = createGetCanonicalFileName(useCaseSensitiveFileNames); return nonPollingWatchFile; diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index c92fb214ba6..1a2d982e410 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -186,7 +186,6 @@ import { TextRange, TransformationContext, TransformFlags, - UnderscoreEscapedMap, VariableDeclaration, VariableStatement, visitEachChild, @@ -260,7 +259,7 @@ export function transformTypeScript(context: TransformationContext) { let currentNamespace: ModuleDeclaration; let currentNamespaceContainerName: Identifier; let currentLexicalScope: SourceFile | Block | ModuleBlock | CaseBlock; - let currentScopeFirstDeclarationsOfName: UnderscoreEscapedMap | undefined; + let currentScopeFirstDeclarationsOfName: Map<__String, Node> | undefined; let currentClassHasParameterProperties: boolean | undefined; /** diff --git a/src/compiler/transformers/utilities.ts b/src/compiler/transformers/utilities.ts index e6fd5c2346b..9650ae1a4a8 100644 --- a/src/compiler/transformers/utilities.ts +++ b/src/compiler/transformers/utilities.ts @@ -1,4 +1,5 @@ import { + __String, AccessorDeclaration, AllDecorators, append, @@ -81,7 +82,6 @@ import { SuperCall, SyntaxKind, TransformationContext, - UnderscoreEscapedMap, VariableDeclaration, VariableStatement, } from "../_namespaces/ts"; @@ -160,7 +160,7 @@ export function getImportNeedsImportDefaultHelper(node: ImportDeclaration): bool /** @internal */ export function collectExternalModuleInfo(context: TransformationContext, sourceFile: SourceFile, resolver: EmitResolver, compilerOptions: CompilerOptions): ExternalModuleInfo { const externalImports: (ImportDeclaration | ImportEqualsDeclaration | ExportDeclaration)[] = []; - const exportSpecifiers = createMultiMap(); + const exportSpecifiers = createMultiMap(); const exportedBindings: Identifier[][] = []; const uniqueExports = new Map(); let exportedNames: Identifier[] | undefined; @@ -652,7 +652,7 @@ export interface PrivateEnvironment { /** * A mapping of private names to information needed for transformation. */ - identifiers?: UnderscoreEscapedMap; + identifiers?: Map<__String, TEntry>; /** * A mapping of generated private names to information needed for transformation. diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 7bae07044f7..1cb2ebfac22 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -5811,7 +5811,7 @@ export interface SymbolLinks { deferralParent?: Type; // Source union/intersection of a deferred type cjsExportMerged?: Symbol; // Version of the symbol with all non export= exports merged with the export= target typeOnlyDeclaration?: TypeOnlyAliasDeclaration | false; // First resolved alias declaration that makes the symbol only usable in type constructs - typeOnlyExportStarMap?: UnderscoreEscapedMap; // Set on a module symbol when some of its exports were resolved through a 'export type * from "mod"' declaration + typeOnlyExportStarMap?: Map<__String, ExportDeclaration & { readonly isTypeOnly: true }>; // Set on a module symbol when some of its exports were resolved through a 'export type * from "mod"' declaration typeOnlyExportStarName?: __String; // Set to the name of the symbol re-exported by an 'export type *' declaration, when different from the symbol name isConstructorDeclaredProperty?: boolean; // Property declared through 'this.x = ...' assignment in constructor tupleLabelDeclaration?: NamedTupleMember | ParameterDeclaration; // Declaration associated with the tuple's label @@ -5917,16 +5917,14 @@ export const enum InternalSymbolName { */ export type __String = (string & { __escapedIdentifier: void }) | (void & { __escapedIdentifier: void }) | InternalSymbolName; -/** ReadonlyMap where keys are `__String`s. */ -export interface ReadonlyUnderscoreEscapedMap extends ReadonlyMap<__String, T> { -} +/** @deprecated Use ReadonlyMap<__String, T> instead. */ +export type ReadonlyUnderscoreEscapedMap = ReadonlyMap<__String, T>; -/** Map where keys are `__String`s. */ -export interface UnderscoreEscapedMap extends Map<__String, T> { -} +/** @deprecated Use Map<__String, T> instead. */ +export type UnderscoreEscapedMap = Map<__String, T>; /** SymbolTable based on ES6 Map interface. */ -export type SymbolTable = UnderscoreEscapedMap; +export type SymbolTable = Map<__String, Symbol>; /** * Used to track a `declare module "foo*"`-like declaration. diff --git a/src/harness/fourslashImpl.ts b/src/harness/fourslashImpl.ts index 755f5c648b6..2efd53af5b3 100644 --- a/src/harness/fourslashImpl.ts +++ b/src/harness/fourslashImpl.ts @@ -2692,7 +2692,7 @@ export class TestState { public rangesByText(): Map { if (this.testData.rangesByText) return this.testData.rangesByText; - const result = ts.createMultiMap(); + const result = ts.createMultiMap(); this.testData.rangesByText = result; for (const range of this.getRanges()) { const text = this.rangeText(range); diff --git a/src/services/codeFixProvider.ts b/src/services/codeFixProvider.ts index de923d72424..bcdda2349fd 100644 --- a/src/services/codeFixProvider.ts +++ b/src/services/codeFixProvider.ts @@ -25,7 +25,7 @@ import { textChanges, } from "./_namespaces/ts"; -const errorCodeToFixes = createMultiMap(); +const errorCodeToFixes = createMultiMap(); const fixIdToRegistration = new Map(); /** @internal */ diff --git a/src/services/codefixes/convertToAsyncFunction.ts b/src/services/codefixes/convertToAsyncFunction.ts index e6851157938..1f62bd26e19 100644 --- a/src/services/codefixes/convertToAsyncFunction.ts +++ b/src/services/codefixes/convertToAsyncFunction.ts @@ -285,7 +285,7 @@ function isPromiseTypedExpression(node: Node, checker: TypeChecker): node is Exp */ function renameCollidingVarNames(nodeToRename: FunctionLikeDeclaration, checker: TypeChecker, synthNamesMap: Map): FunctionLikeDeclaration { const identsToRenameMap = new Map(); // key is the symbol id - const collidingSymbolMap = createMultiMap(); + const collidingSymbolMap = createMultiMap(); forEachChild(nodeToRename, function visit(node: Node) { if (!isIdentifier(node)) { forEachChild(node, visit); diff --git a/src/services/codefixes/convertToEsModule.ts b/src/services/codefixes/convertToEsModule.ts index 7a4dbc97eea..2643d4d1ad3 100644 --- a/src/services/codefixes/convertToEsModule.ts +++ b/src/services/codefixes/convertToEsModule.ts @@ -594,7 +594,7 @@ interface Identifiers { type FreeIdentifiers = ReadonlyMap; function collectFreeIdentifiers(file: SourceFile): FreeIdentifiers { - const map = createMultiMap(); + const map = createMultiMap(); forEachFreeIdentifier(file, id => map.add(id.text, id)); return map; } diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 64389726ebc..fe82e145ed8 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -1148,7 +1148,7 @@ function getExportInfos( ): ReadonlyMap { // For each original symbol, keep all re-exports of that symbol together so we can call `getCodeActionsForImport` on the whole group at once. // Maps symbol id to info for modules providing that symbol (original export + re-exports). - const originalSymbolToExportInfos = createMultiMap(); + const originalSymbolToExportInfos = createMultiMap(); const packageJsonFilter = createPackageJsonImportFilter(fromFile, preferences, host); const moduleSpecifierCache = host.getModuleSpecifierCache?.(); const getModuleSpecifierResolutionHost = memoizeOne((isFromPackageJson: boolean) => { diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index e49ead2f36f..d76babcb778 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -92,13 +92,11 @@ import { SyntaxKind, textChanges, Token, - TransientSymbol, tryCast, Type, TypeFlags, TypeNode, TypeReference, - UnderscoreEscapedMap, UnionOrIntersectionType, UnionReduction, UserPreferences, @@ -581,7 +579,7 @@ function inferTypeFromReferences(program: Program, references: readonly Identifi isNumberOrString: boolean | undefined; candidateTypes: Type[] | undefined; - properties: UnderscoreEscapedMap | undefined; + properties: Map<__String, Usage> | undefined; calls: CallUsage[] | undefined; constructs: CallUsage[] | undefined; numberIndex: Usage | undefined; @@ -1024,10 +1022,10 @@ function inferTypeFromReferences(program: Program, references: readonly Identifi const numberIndices = []; let stringIndexReadonly = false; let numberIndexReadonly = false; - const props = createMultiMap(); + const props = createMultiMap<__String, Type>(); for (const anon of anons) { for (const p of checker.getPropertiesOfType(anon)) { - props.add(p.name, p.valueDeclaration ? checker.getTypeOfSymbolAtLocation(p, p.valueDeclaration) : checker.getAnyType()); + props.add(p.escapedName, p.valueDeclaration ? checker.getTypeOfSymbolAtLocation(p, p.valueDeclaration) : checker.getAnyType()); } calls.push(...checker.getSignaturesOfType(anon, SignatureKind.Call)); constructs.push(...checker.getSignaturesOfType(anon, SignatureKind.Construct)); @@ -1044,7 +1042,7 @@ function inferTypeFromReferences(program: Program, references: readonly Identifi } const members = mapEntries(props, (name, types) => { const isOptional = types.length < anons.length ? SymbolFlags.Optional : 0; - const s = checker.createSymbol(SymbolFlags.Property | isOptional, name as __String); + const s = checker.createSymbol(SymbolFlags.Property | isOptional, name); s.links.type = checker.getUnionType(types); return [name, s]; }); @@ -1053,7 +1051,7 @@ function inferTypeFromReferences(program: Program, references: readonly Identifi if (numberIndices.length) indexInfos.push(checker.createIndexInfo(checker.getNumberType(), checker.getUnionType(numberIndices), numberIndexReadonly)); return checker.createAnonymousType( anons[0].symbol, - members as UnderscoreEscapedMap, + members, calls, constructs, indexInfos); diff --git a/src/services/services.ts b/src/services/services.ts index f5bba46bdbc..953c29c3ec8 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -309,7 +309,6 @@ import { TypePredicate, TypeReference, typeToDisplayParts, - UnderscoreEscapedMap, UnionOrIntersectionType, UnionType, updateSourceFile, @@ -1030,7 +1029,7 @@ class SourceFileObject extends NodeObject implements SourceFile { public languageVersion!: ScriptTarget; public languageVariant!: LanguageVariant; public identifiers!: Map; - public nameTable: UnderscoreEscapedMap | undefined; + public nameTable: Map<__String, number> | undefined; public resolvedModules: ModeAwareCache | undefined; public resolvedTypeReferenceDirectiveNames!: ModeAwareCache; public imports!: readonly StringLiteralLike[]; @@ -1090,7 +1089,7 @@ class SourceFileObject extends NodeObject implements SourceFile { } private computeNamedDeclarations(): Map { - const result = createMultiMap(); + const result = createMultiMap(); this.forEachChild(visit); @@ -3082,7 +3081,7 @@ export function createLanguageService( * * @internal */ -export function getNameTable(sourceFile: SourceFile): UnderscoreEscapedMap { +export function getNameTable(sourceFile: SourceFile): Map<__String, number> { if (!sourceFile.nameTable) { initializeNameTable(sourceFile); } diff --git a/src/services/types.ts b/src/services/types.ts index d0ed926108d..6af97fa7ef2 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -159,7 +159,7 @@ declare module "../compiler/types" { export interface SourceFile { /** @internal */ version: string; /** @internal */ scriptSnapshot: IScriptSnapshot | undefined; - /** @internal */ nameTable: UnderscoreEscapedMap | undefined; + /** @internal */ nameTable: Map<__String, number> | undefined; /** @internal */ getNamedDeclarations(): Map; diff --git a/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts b/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts index 12e650e4d84..15aec588ed2 100644 --- a/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts +++ b/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts @@ -43,7 +43,7 @@ describe("unittests:: tsserver:: CachingFileSystemInformation:: tsserverProjectS return logCacheAndClear; function setCallsTrackingWithSingleArgFn(prop: CalledMapsWithSingleArg) { - const calledMap = ts.createMultiMap(); + const calledMap = ts.createMultiMap(); const cb = (host as any)[prop].bind(host); (host as any)[prop] = (f: string) => { calledMap.add(f, /*value*/ true); @@ -53,7 +53,7 @@ describe("unittests:: tsserver:: CachingFileSystemInformation:: tsserverProjectS } function setCallsTrackingWithFiveArgFn(prop: CalledMapsWithFiveArgs) { - const calledMap = ts.createMultiMap<[U, V, W, X]>(); + const calledMap = ts.createMultiMap(); const cb = (host as any)[prop].bind(host); (host as any)[prop] = (f: string, arg1?: U, arg2?: V, arg3?: W, arg4?: X) => { calledMap.add(f, [arg1!, arg2!, arg3!, arg4!]); // TODO: GH#18217 diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 0a8127b2a19..deca7c43b4b 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -6636,14 +6636,12 @@ declare namespace ts { }) | (void & { __escapedIdentifier: void; }) | InternalSymbolName; - /** ReadonlyMap where keys are `__String`s. */ - interface ReadonlyUnderscoreEscapedMap extends ReadonlyMap<__String, T> { - } - /** Map where keys are `__String`s. */ - interface UnderscoreEscapedMap extends Map<__String, T> { - } + /** @deprecated Use ReadonlyMap<__String, T> instead. */ + type ReadonlyUnderscoreEscapedMap = ReadonlyMap<__String, T>; + /** @deprecated Use Map<__String, T> instead. */ + type UnderscoreEscapedMap = Map<__String, T>; /** SymbolTable based on ES6 Map interface. */ - type SymbolTable = UnderscoreEscapedMap; + type SymbolTable = Map<__String, Symbol>; enum TypeFlags { Any = 1, Unknown = 2, diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 920d6e74840..b7a1a455832 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -2661,14 +2661,12 @@ declare namespace ts { }) | (void & { __escapedIdentifier: void; }) | InternalSymbolName; - /** ReadonlyMap where keys are `__String`s. */ - interface ReadonlyUnderscoreEscapedMap extends ReadonlyMap<__String, T> { - } - /** Map where keys are `__String`s. */ - interface UnderscoreEscapedMap extends Map<__String, T> { - } + /** @deprecated Use ReadonlyMap<__String, T> instead. */ + type ReadonlyUnderscoreEscapedMap = ReadonlyMap<__String, T>; + /** @deprecated Use Map<__String, T> instead. */ + type UnderscoreEscapedMap = Map<__String, T>; /** SymbolTable based on ES6 Map interface. */ - type SymbolTable = UnderscoreEscapedMap; + type SymbolTable = Map<__String, Symbol>; enum TypeFlags { Any = 1, Unknown = 2,