From 80b19a09a1b205631c5772dbcfb0000a31807b0e Mon Sep 17 00:00:00 2001 From: Andy Date: Tue, 18 Jul 2017 10:26:11 -0700 Subject: [PATCH] Introduce a ReadonlyMap interface and use it in core.ts (#17161) --- src/compiler/core.ts | 22 +++++++++++----------- src/compiler/types.ts | 28 ++++++++++++++++++---------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 6da3a5b77aa..fa54abd4038 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -585,7 +585,7 @@ namespace ts { return result; } - export function mapEntries(map: Map, f: (key: string, value: T) => [string, U]): Map { + export function mapEntries(map: ReadonlyMap, f: (key: string, value: T) => [string, U]): Map { if (!map) { return undefined; } @@ -998,9 +998,9 @@ namespace ts { * Calls `callback` for each entry in the map, returning the first truthy result. * Use `map.forEach` instead for normal iteration. */ - export function forEachEntry(map: UnderscoreEscapedMap, callback: (value: T, key: __String) => U | undefined): U | undefined; - export function forEachEntry(map: Map, callback: (value: T, key: string) => U | undefined): U | undefined; - export function forEachEntry(map: UnderscoreEscapedMap | Map, callback: (value: T, key: (string & __String)) => U | undefined): U | undefined { + export function forEachEntry(map: ReadonlyUnderscoreEscapedMap, callback: (value: T, key: __String) => U | undefined): U | undefined; + export function forEachEntry(map: ReadonlyMap, callback: (value: T, key: string) => U | undefined): U | undefined; + export function forEachEntry(map: ReadonlyUnderscoreEscapedMap | ReadonlyMap, callback: (value: T, key: (string & __String)) => U | undefined): U | undefined { const iterator = map.entries(); for (let { value: pair, done } = iterator.next(); !done; { value: pair, done } = iterator.next()) { const [key, value] = pair; @@ -1013,9 +1013,9 @@ namespace ts { } /** `forEachEntry` for just keys. */ - export function forEachKey(map: UnderscoreEscapedMap<{}>, callback: (key: __String) => T | undefined): T | undefined; - export function forEachKey(map: Map<{}>, callback: (key: string) => T | undefined): T | undefined; - export function forEachKey(map: UnderscoreEscapedMap<{}> | Map<{}>, callback: (key: string & __String) => T | undefined): T | undefined { + export function forEachKey(map: ReadonlyUnderscoreEscapedMap<{}>, callback: (key: __String) => T | undefined): T | undefined; + export function forEachKey(map: ReadonlyMap<{}>, callback: (key: string) => T | undefined): T | undefined; + export function forEachKey(map: ReadonlyUnderscoreEscapedMap<{}> | ReadonlyMap<{}>, callback: (key: string & __String) => T | undefined): T | undefined { const iterator = map.keys(); for (let { value: key, done } = iterator.next(); !done; { value: key, done } = iterator.next()) { const result = callback(key as string & __String); @@ -1027,8 +1027,8 @@ namespace ts { } /** Copy entries from `source` to `target`. */ - export function copyEntries(source: UnderscoreEscapedMap, target: UnderscoreEscapedMap): void; - export function copyEntries(source: Map, target: Map): void; + export function copyEntries(source: ReadonlyUnderscoreEscapedMap, target: UnderscoreEscapedMap): void; + export function copyEntries(source: ReadonlyMap, target: Map): void; export function copyEntries | Map>(source: U, target: U): void { (source as Map).forEach((value, key) => { (target as Map).set(key, value); @@ -1106,8 +1106,8 @@ namespace ts { } export function cloneMap(map: SymbolTable): SymbolTable; - export function cloneMap(map: Map): Map; - export function cloneMap(map: Map | SymbolTable): Map | SymbolTable { + export function cloneMap(map: ReadonlyMap): Map; + export function cloneMap(map: ReadonlyMap | SymbolTable): Map | SymbolTable { const clone = createMap(); copyEntries(map as Map, clone); return clone; diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 581e9161ed5..9aa6c07816e 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -8,13 +8,10 @@ namespace ts { [index: string]: T; } - /** ES6 Map interface. */ - export interface Map { + /** ES6 Map interface, only read methods included. */ + export interface ReadonlyMap { get(key: string): T | undefined; has(key: string): boolean; - set(key: string, value: T): this; - delete(key: string): boolean; - clear(): void; forEach(action: (value: T, key: string) => void): void; readonly size: number; keys(): Iterator; @@ -22,6 +19,13 @@ namespace ts { entries(): Iterator<[string, T]>; } + /** ES6 Map interface. */ + export interface Map extends ReadonlyMap { + set(key: string, value: T): this; + delete(key: string): boolean; + clear(): void; + } + /** ES6 Iterator type. */ export interface Iterator { next(): { value: T, done: false } | { value: never, done: true }; @@ -2983,13 +2987,10 @@ namespace ts { */ export type __String = (string & { __escapedIdentifier: void }) | (void & { __escapedIdentifier: void }) | InternalSymbolName; - /** EscapedStringMap based on ES6 Map interface. */ - export interface UnderscoreEscapedMap { + /** ReadonlyMap where keys are `__String`s. */ + export interface ReadonlyUnderscoreEscapedMap { get(key: __String): T | undefined; has(key: __String): boolean; - set(key: __String, value: T): this; - delete(key: __String): boolean; - clear(): void; forEach(action: (value: T, key: __String) => void): void; readonly size: number; keys(): Iterator<__String>; @@ -2997,6 +2998,13 @@ namespace ts { entries(): Iterator<[__String, T]>; } + /** Map where keys are `__String`s. */ + export interface UnderscoreEscapedMap extends ReadonlyUnderscoreEscapedMap { + set(key: __String, value: T): this; + delete(key: __String): boolean; + clear(): void; + } + /** SymbolTable based on ES6 Map interface. */ export type SymbolTable = UnderscoreEscapedMap;