tsc-ts 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +1 -1
  2. package/dist/api/compiler/ast.d.ts +67 -27
  3. package/dist/api/compiler/ast.js +156 -55
  4. package/dist/api/compiler/binder-utilities.js +4 -3
  5. package/dist/api/compiler/binder.js +14 -13
  6. package/dist/api/compiler/checker-calls.js +7 -6
  7. package/dist/api/compiler/checker-contextual.js +1 -1
  8. package/dist/api/compiler/checker-declaration-order.js +2 -1
  9. package/dist/api/compiler/checker-declarations.js +14 -14
  10. package/dist/api/compiler/checker-declared-types.d.ts +1 -1
  11. package/dist/api/compiler/checker-declared-types.js +12 -11
  12. package/dist/api/compiler/checker-decorators.js +3 -3
  13. package/dist/api/compiler/checker-deprecation.js +17 -18
  14. package/dist/api/compiler/checker-destructuring.d.ts +1 -1
  15. package/dist/api/compiler/checker-destructuring.js +3 -3
  16. package/dist/api/compiler/checker-elaboration.js +8 -7
  17. package/dist/api/compiler/checker-emit-helpers.d.ts +2 -1
  18. package/dist/api/compiler/checker-emit-helpers.js +5 -4
  19. package/dist/api/compiler/checker-emit-resolver.d.ts +1 -1
  20. package/dist/api/compiler/checker-emit-resolver.js +5 -4
  21. package/dist/api/compiler/checker-grammar.js +23 -9
  22. package/dist/api/compiler/checker-heritage.d.ts +1 -1
  23. package/dist/api/compiler/checker-heritage.js +14 -13
  24. package/dist/api/compiler/checker-inference.d.ts +21 -11
  25. package/dist/api/compiler/checker-inference.js +57 -34
  26. package/dist/api/compiler/checker-javascript.d.ts +1 -1
  27. package/dist/api/compiler/checker-javascript.js +5 -4
  28. package/dist/api/compiler/checker-jsx.d.ts +1 -1
  29. package/dist/api/compiler/checker-jsx.js +4 -4
  30. package/dist/api/compiler/checker-literals.js +2 -2
  31. package/dist/api/compiler/checker-members.d.ts +32 -3
  32. package/dist/api/compiler/checker-members.js +240 -53
  33. package/dist/api/compiler/checker-modules.d.ts +15 -1
  34. package/dist/api/compiler/checker-modules.js +86 -14
  35. package/dist/api/compiler/checker-object-literals.d.ts +1 -1
  36. package/dist/api/compiler/checker-object-literals.js +11 -7
  37. package/dist/api/compiler/checker-overloads.d.ts +1 -1
  38. package/dist/api/compiler/checker-overloads.js +4 -3
  39. package/dist/api/compiler/checker-property-access.d.ts +1 -1
  40. package/dist/api/compiler/checker-property-access.js +2 -2
  41. package/dist/api/compiler/checker-services.js +2 -2
  42. package/dist/api/compiler/checker-signatures.d.ts +1 -1
  43. package/dist/api/compiler/checker-signatures.js +9 -8
  44. package/dist/api/compiler/checker-symbol-types.d.ts +2 -18
  45. package/dist/api/compiler/checker-symbol-types.js +22 -952
  46. package/dist/api/compiler/checker-symbols.d.ts +2 -2
  47. package/dist/api/compiler/checker-symbols.js +29 -27
  48. package/dist/api/compiler/checker-type-factory.d.ts +2 -2
  49. package/dist/api/compiler/checker-type-factory.js +57 -16
  50. package/dist/api/compiler/checker-type-nodes.d.ts +1 -1
  51. package/dist/api/compiler/checker-type-nodes.js +2 -2
  52. package/dist/api/compiler/checker-type-operators.d.ts +1 -1
  53. package/dist/api/compiler/checker-type-operators.js +5 -5
  54. package/dist/api/compiler/checker-types.d.ts +73 -7
  55. package/dist/api/compiler/checker-types.js +220 -43
  56. package/dist/api/compiler/checker-unused.d.ts +1 -1
  57. package/dist/api/compiler/checker-unused.js +3 -3
  58. package/dist/api/compiler/checker.d.ts +45 -8
  59. package/dist/api/compiler/checker.js +46 -9
  60. package/dist/api/compiler/diagnostics.d.ts +2 -8
  61. package/dist/api/compiler/diagnostics.js +13 -45
  62. package/dist/api/compiler/file-include.d.ts +35 -8
  63. package/dist/api/compiler/file-include.js +81 -18
  64. package/dist/api/compiler/file-loader.d.ts +33 -4
  65. package/dist/api/compiler/file-loader.js +90 -24
  66. package/dist/api/compiler/instantiation.d.ts +1 -1
  67. package/dist/api/compiler/instantiation.js +86 -50
  68. package/dist/api/compiler/link-tables.d.ts +69 -0
  69. package/dist/api/compiler/link-tables.js +236 -0
  70. package/dist/api/compiler/name-resolver.js +3 -3
  71. package/dist/api/compiler/node-builder-names.d.ts +1 -1
  72. package/dist/api/compiler/node-builder-names.js +12 -12
  73. package/dist/api/compiler/node-builder-pseudo.d.ts +1 -1
  74. package/dist/api/compiler/node-builder-pseudo.js +2 -1
  75. package/dist/api/compiler/node-builder.d.ts +1 -1
  76. package/dist/api/compiler/node-builder.js +16 -16
  77. package/dist/api/compiler/parallel-parse.d.ts +2 -0
  78. package/dist/api/compiler/parallel-parse.js +7 -1
  79. package/dist/api/compiler/parser.d.ts +33 -16
  80. package/dist/api/compiler/parser.js +127 -98
  81. package/dist/api/compiler/printer/emit-context.d.ts +5 -2
  82. package/dist/api/compiler/printer/emit-context.js +19 -13
  83. package/dist/api/compiler/printer/factory-base.js +8 -8
  84. package/dist/api/compiler/printer/factory.js +4 -4
  85. package/dist/api/compiler/printer/printer.js +6 -6
  86. package/dist/api/compiler/program-checker.d.ts +5 -0
  87. package/dist/api/compiler/program-checker.js +14 -1
  88. package/dist/api/compiler/program.js +9 -1
  89. package/dist/api/compiler/relations.d.ts +1 -1
  90. package/dist/api/compiler/relations.js +18 -13
  91. package/dist/api/compiler/reparser.js +13 -5
  92. package/dist/api/compiler/symbol-accessibility.d.ts +1 -1
  93. package/dist/api/compiler/symbol-accessibility.js +123 -26
  94. package/dist/api/compiler/symbol.d.ts +45 -3
  95. package/dist/api/compiler/symbol.js +121 -10
  96. package/dist/api/compiler/transformers/alias-references.d.ts +1 -1
  97. package/dist/api/compiler/transformers/alias-references.js +2 -1
  98. package/dist/api/compiler/transformers/class-fields.js +3 -3
  99. package/dist/api/compiler/transformers/commonjs-module.js +3 -3
  100. package/dist/api/compiler/transformers/declarations-diagnostics.js +2 -1
  101. package/dist/api/compiler/transformers/declarations-pseudo.js +6 -4
  102. package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -1
  103. package/dist/api/compiler/transformers/declarations-syntactic.js +9 -9
  104. package/dist/api/compiler/transformers/declarations-tracker.d.ts +1 -1
  105. package/dist/api/compiler/transformers/declarations-tracker.js +3 -2
  106. package/dist/api/compiler/transformers/declarations.js +6 -5
  107. package/dist/api/compiler/transformers/module.js +2 -2
  108. package/dist/api/compiler/transformers/optional-chain.js +3 -3
  109. package/dist/api/compiler/transformers/reference-resolver.d.ts +2 -1
  110. package/dist/api/compiler/transformers/reference-resolver.js +26 -24
  111. package/dist/api/compiler/transformers/subtree-facts.d.ts +1 -0
  112. package/dist/api/compiler/transformers/subtree-facts.js +9 -7
  113. package/dist/api/compiler/transformers/syntax-facts.d.ts +1 -0
  114. package/dist/api/compiler/transformers/syntax-facts.js +9 -5
  115. package/dist/api/compiler/transformers/tagged-template.js +2 -2
  116. package/dist/api/compiler/transformers/type-eraser.js +2 -2
  117. package/dist/api/compiler/transformers/type-serialization.js +12 -12
  118. package/dist/api/compiler/transformers/visitor-base.js +3 -3
  119. package/dist/api/compiler/tsconfig.js +2 -2
  120. package/package.json +9 -9
  121. package/src/compiler/ast.ts +211 -78
  122. package/src/compiler/binder-utilities.ts +4 -3
  123. package/src/compiler/binder.ts +26 -16
  124. package/src/compiler/checker-calls.ts +8 -6
  125. package/src/compiler/checker-contextual.ts +1 -1
  126. package/src/compiler/checker-declaration-order.ts +2 -2
  127. package/src/compiler/checker-declarations.ts +21 -14
  128. package/src/compiler/checker-declared-types.ts +12 -12
  129. package/src/compiler/checker-decorators.ts +3 -3
  130. package/src/compiler/checker-deprecation.ts +17 -21
  131. package/src/compiler/checker-destructuring.ts +3 -3
  132. package/src/compiler/checker-elaboration.ts +8 -8
  133. package/src/compiler/checker-emit-helpers.ts +5 -4
  134. package/src/compiler/checker-emit-resolver.ts +5 -5
  135. package/src/compiler/checker-grammar.ts +22 -8
  136. package/src/compiler/checker-heritage.ts +21 -14
  137. package/src/compiler/checker-inference.ts +66 -34
  138. package/src/compiler/checker-javascript.ts +5 -5
  139. package/src/compiler/checker-jsx.ts +12 -8
  140. package/src/compiler/checker-literals.ts +2 -2
  141. package/src/compiler/checker-members.ts +255 -47
  142. package/src/compiler/checker-modules.ts +115 -14
  143. package/src/compiler/checker-object-literals.ts +22 -6
  144. package/src/compiler/checker-overloads.ts +6 -6
  145. package/src/compiler/checker-property-access.ts +2 -2
  146. package/src/compiler/checker-services.ts +2 -2
  147. package/src/compiler/checker-signatures.ts +9 -9
  148. package/src/compiler/checker-symbol-types.ts +20 -940
  149. package/src/compiler/checker-symbols.ts +42 -35
  150. package/src/compiler/checker-type-factory.ts +53 -16
  151. package/src/compiler/checker-type-nodes.ts +2 -2
  152. package/src/compiler/checker-type-operators.ts +13 -5
  153. package/src/compiler/checker-types.ts +223 -43
  154. package/src/compiler/checker-unused.ts +3 -3
  155. package/src/compiler/checker.ts +50 -9
  156. package/src/compiler/decoder.ts +5 -4
  157. package/src/compiler/diagnostics.ts +14 -48
  158. package/src/compiler/encoder.ts +10 -5
  159. package/src/compiler/file-include.ts +85 -17
  160. package/src/compiler/file-loader.ts +104 -35
  161. package/src/compiler/incremental.ts +39 -5
  162. package/src/compiler/instantiation.ts +99 -55
  163. package/src/compiler/link-tables.ts +245 -0
  164. package/src/compiler/name-resolver.ts +3 -3
  165. package/src/compiler/node-builder-names.ts +21 -19
  166. package/src/compiler/node-builder-pseudo.ts +2 -2
  167. package/src/compiler/node-builder.ts +24 -16
  168. package/src/compiler/parallel-check.ts +11 -8
  169. package/src/compiler/parallel-parse.ts +8 -1
  170. package/src/compiler/parse-thread.ts +0 -4
  171. package/src/compiler/parser.ts +173 -93
  172. package/src/compiler/printer/emit-context.ts +20 -15
  173. package/src/compiler/printer/factory-base.ts +14 -7
  174. package/src/compiler/printer/factory.ts +5 -3
  175. package/src/compiler/printer/printer.ts +8 -6
  176. package/src/compiler/program-checker.ts +12 -1
  177. package/src/compiler/program.ts +8 -1
  178. package/src/compiler/relations.ts +20 -12
  179. package/src/compiler/reparser.ts +14 -4
  180. package/src/compiler/symbol-accessibility.ts +120 -25
  181. package/src/compiler/symbol.ts +127 -9
  182. package/src/compiler/transformers/alias-references.ts +2 -2
  183. package/src/compiler/transformers/class-fields.ts +12 -2
  184. package/src/compiler/transformers/commonjs-module.ts +3 -2
  185. package/src/compiler/transformers/declarations-diagnostics.ts +2 -1
  186. package/src/compiler/transformers/declarations-pseudo.ts +9 -5
  187. package/src/compiler/transformers/declarations-syntactic.ts +17 -9
  188. package/src/compiler/transformers/declarations-tracker.ts +3 -3
  189. package/src/compiler/transformers/declarations.ts +7 -7
  190. package/src/compiler/transformers/module.ts +2 -1
  191. package/src/compiler/transformers/optional-chain.ts +5 -2
  192. package/src/compiler/transformers/reference-resolver.ts +37 -25
  193. package/src/compiler/transformers/subtree-facts.ts +15 -6
  194. package/src/compiler/transformers/syntax-facts.ts +10 -5
  195. package/src/compiler/transformers/tagged-template.ts +2 -2
  196. package/src/compiler/transformers/type-eraser.ts +2 -1
  197. package/src/compiler/transformers/type-serialization.ts +12 -12
  198. package/src/compiler/transformers/visitor-base.ts +10 -5
  199. package/src/compiler/tsc-build.ts +17 -13
  200. package/src/compiler/tsc-cli.ts +9 -6
  201. package/src/compiler/tsc-compile.ts +16 -7
  202. package/src/compiler/tsc-watch.ts +94 -26
  203. package/src/compiler/tsconfig.ts +2 -1
@@ -1,6 +1,6 @@
1
1
  // Object literal types: freshness and regular forms.
2
2
  import type { Checker } from './checker.js';
3
- import { CheckFlags, type Symbol, getSymbolId } from './symbol.js';
3
+ import { CheckFlags, copyDeclarations, getSymbolId, type Symbol } from './symbol.js';
4
4
  import { CachedTypeKind, cachedTypeKey, ObjectFlags, type Type, TypeFlags } from './checker-types.js';
5
5
  import { createAnonymousType } from './checker-type-factory.js';
6
6
  import { getPropertiesOfObjectType, resolveStructuredTypeMembers } from './checker-members.js';
@@ -41,7 +41,7 @@ export function getRegularTypeOfObjectLiteral(c: Checker, t: Type): Type {
41
41
 
42
42
  function createSymbolWithTypeLocal(c: Checker, source: Symbol, t: Type): Symbol {
43
43
  const symbol = c.newSymbolWithCheckFlags(source.flags, source.name, source.checkFlags & CheckFlags.Readonly);
44
- symbol.declarations = source.declarations;
44
+ copyDeclarations(symbol, source);
45
45
  symbol.parent = source.parent;
46
46
  symbol.valueDeclaration = source.valueDeclaration;
47
47
  const id = getSymbolId(symbol);
@@ -4,7 +4,6 @@ import type { Node } from './ast.js';
4
4
  import { getCombinedModifierFlags, getDeclarationOfKind } from './binder-utilities.js';
5
5
  import { Diagnostics } from './diagnostics.js';
6
6
  import { ModifierFlags, getSymbol, MappedTypeNode, getName } from './ast.js';
7
- import { CheckFlags, InternalSymbolName, type Symbol, SymbolFlags, type SymbolTable, getSymbolId } from './symbol.js';
8
7
  import { SyntaxKind } from './syntax-kind.js';
9
8
  import type { Checker } from './checker.js';
10
9
  import {
@@ -34,11 +33,13 @@ import {
34
33
  type TypeParameter,
35
34
  type TypeReference,
36
35
  type UnionOrIntersectionType,
36
+ unionOrIntersectionMembers,
37
37
  type UnionType,
38
38
  emptyIndexInfos,
39
39
  emptySignatures,
40
40
  emptySymbols,
41
41
  emptyTypes,
42
+ newThisArgumentTypeMapper,
42
43
  newTypeMapper,
43
44
  prependTypeMapping,
44
45
  LiteralType,
@@ -151,7 +152,19 @@ import {
151
152
  } from './checker-type-operators.js';
152
153
  import { getGlobalBigIntType, getGlobalESSymbolType } from './checker-globals.js';
153
154
  import { isLateBoundName, isNumericLiteralName } from './checker-utilities.js';
154
- import { lazyObjectFlags, sideOf } from './side-state.js';
155
+ import { lazyObjectFlags, sideOf, sideOfIfAny } from './side-state.js';
156
+ import {
157
+ CheckFlags,
158
+ copyDeclarations,
159
+ declarationCount,
160
+ getDeclarations,
161
+ getSymbolId,
162
+ InternalSymbolName,
163
+ setDeclarations,
164
+ type Symbol,
165
+ SymbolFlags,
166
+ type SymbolTable,
167
+ } from './symbol.js';
155
168
 
156
169
  // ---- Resolution
157
170
 
@@ -172,12 +185,18 @@ export function resolveStructuredTypeMembers(c: Checker, t: Type): StructuredTyp
172
185
  * `t` writes them there; `t` keeps its identity and is never written.
173
186
  */
174
187
  export function membersHolder(c: Checker, t: Type): StructuredType {
175
- return sideOf(c, t as StructuredType);
188
+ const side = sideOf(c, t);
189
+ if ((side.flags & TypeFlags.UnionOrIntersection) !== 0)
190
+ return unionOrIntersectionMembers(side as UnionOrIntersectionType);
191
+ return side as StructuredType;
176
192
  }
177
193
 
178
194
  /** The `objectFlags` of `t` that resolving its members sets (MembersResolved, UnresolvedMembers). */
179
195
  export function memberResolutionFlags(c: Checker, t: Type): ObjectFlags {
180
- return lazyObjectFlags(c, t);
196
+ if ((t.flags & TypeFlags.UnionOrIntersection) === 0) return lazyObjectFlags(c, t);
197
+ const side = sideOfIfAny(c, t) as UnionOrIntersectionType | undefined;
198
+ const members = side !== undefined ? side.membersOf : undefined;
199
+ return members !== undefined ? members.objectFlags : ObjectFlags.None;
181
200
  }
182
201
 
183
202
  function resolveMembersOfType(c: Checker, t: Type): void {
@@ -185,7 +204,7 @@ function resolveMembersOfType(c: Checker, t: Type): void {
185
204
  const objectFlags = t.objectFlags;
186
205
  if ((objectFlags & ObjectFlags.Reference) !== 0) resolveTypeReferenceMembers(c, t as TypeReference);
187
206
  else if ((objectFlags & ObjectFlags.ClassOrInterface) !== 0)
188
- resolveObjectTypeMembers(c, membersHolder(c, t), t as InterfaceType, emptyTypes, emptyTypes);
207
+ resolveObjectTypeMembers(c, membersHolder(c, t), t as InterfaceType, emptyTypes, emptyTypes, undefined);
189
208
  else if ((objectFlags & ObjectFlags.ReverseMapped) !== 0) resolveReverseMappedTypeMembers(c, t);
190
209
  else if ((objectFlags & ObjectFlags.Anonymous) !== 0) resolveAnonymousTypeMembers(c, t as ObjectType);
191
210
  else if ((objectFlags & ObjectFlags.Mapped) !== 0) resolveMappedTypeMembers(c, t as MappedType);
@@ -197,29 +216,30 @@ function resolveTypeReferenceMembers(c: Checker, t: TypeReference): void {
197
216
  const source = t.target as InterfaceType;
198
217
  const typeParameters = source.allTypeParameters;
199
218
  const typeArguments = getTypeArguments(c, t);
200
- let padded = typeArguments;
201
- if (typeArguments.length === typeParameters.length - 1) {
202
- // The reference itself is the `this` type argument.
203
- padded = [];
204
- for (const typeArgument of typeArguments) padded.push(typeArgument);
205
- padded.push(t as Type);
206
- }
207
- resolveObjectTypeMembers(c, membersHolder(c, t), source, typeParameters, padded);
219
+ // With one type argument fewer than parameters, the reference itself is the `this` type argument.
220
+ const thisArgument = typeArguments.length === typeParameters.length - 1 ? (t as Type) : undefined;
221
+ resolveObjectTypeMembers(c, membersHolder(c, t), source, typeParameters, typeArguments, thisArgument);
208
222
  }
209
223
 
210
- function sameTypes(a: readonly Type[], b: readonly Type[]): boolean {
211
- if (a.length !== b.length) return false;
212
- for (let i = 0; i < a.length; i++) if (a[i]! !== b[i]!) return false;
213
- return true;
224
+ /** Whether `b`, followed by `last` where given, is the list `a`. */
225
+ function sameTypes(a: readonly Type[], b: readonly Type[], last: Type | undefined): boolean {
226
+ const count = b.length;
227
+ if (a.length !== (last !== undefined ? count + 1 : count)) return false;
228
+ for (let i = 0; i < count; i++) if (a[i]! !== b[i]!) return false;
229
+ return last === undefined || a[count]! === last;
214
230
  }
215
231
 
216
- /** Resolves the members of an instantiation of `source` into `t`, the holder of its members. */
232
+ /**
233
+ * Resolves the members of an instantiation of `source` into `t`, the holder of its members: with
234
+ * `typeArguments` for its type parameters, followed by `thisArgument` where given.
235
+ */
217
236
  function resolveObjectTypeMembers(
218
237
  c: Checker,
219
238
  t: StructuredType,
220
239
  source: InterfaceType,
221
240
  typeParameters: Type[],
222
241
  typeArguments: Type[],
242
+ thisArgument: Type | undefined,
223
243
  ): void {
224
244
  const declared = resolveDeclaredMembers(c, source);
225
245
  let mapper: TypeMapper | undefined;
@@ -230,14 +250,17 @@ function resolveObjectTypeMembers(
230
250
  let instantiated = false;
231
251
  // The member symbols of an instantiation are instantiated on demand (PendingInstantiatedMembers).
232
252
  let pending: PendingInstantiatedMembers | undefined;
233
- if (sameTypes(typeParameters, typeArguments)) {
253
+ if (sameTypes(typeParameters, typeArguments, thisArgument)) {
234
254
  members = declared.declaredMembers;
235
255
  callSignatures = declared.declaredCallSignatures;
236
256
  constructSignatures = declared.declaredConstructSignatures;
237
257
  indexInfos = declared.declaredIndexInfos;
238
258
  } else {
239
259
  instantiated = true;
240
- mapper = newTypeMapper(typeParameters, typeArguments);
260
+ mapper =
261
+ thisArgument !== undefined
262
+ ? newThisArgumentTypeMapper(typeParameters, typeArguments, thisArgument)
263
+ : newTypeMapper(typeParameters, typeArguments);
241
264
  pending = pendingInstantiatedTable(c, source, mapper);
242
265
  members = pending === undefined ? instantiateSymbolTable(c, declared.declaredMembers, mapper) : undefined;
243
266
  callSignatures = instantiateSignatures(c, declared.declaredCallSignatures, mapper);
@@ -245,6 +268,9 @@ function resolveObjectTypeMembers(
245
268
  indexInfos = instantiateIndexInfos(c, declared.declaredIndexInfos, mapper);
246
269
  }
247
270
  const baseTypes = getBaseTypes(c, source);
271
+ // The last type argument, the `this` type argument where the reference has one.
272
+ const lastArgument =
273
+ thisArgument ?? (typeArguments.length !== 0 ? typeArguments[typeArguments.length - 1]! : undefined);
248
274
  if (pending !== undefined) {
249
275
  resolvePendingObjectTypeMembers(
250
276
  c,
@@ -252,7 +278,7 @@ function resolveObjectTypeMembers(
252
278
  pending,
253
279
  baseTypes,
254
280
  mapper!,
255
- typeArguments,
281
+ lastArgument,
256
282
  callSignatures,
257
283
  constructSignatures,
258
284
  indexInfos,
@@ -262,12 +288,11 @@ function resolveObjectTypeMembers(
262
288
  if (baseTypes.length !== 0) {
263
289
  members = !instantiated || members === undefined ? new Map(members ?? []) : members;
264
290
  setStructuredTypeMembers(c, t, members, callSignatures, constructSignatures, indexInfos);
265
- const thisArgument = typeArguments.length !== 0 ? typeArguments[typeArguments.length - 1]! : undefined;
266
291
  t.objectFlags |= ObjectFlags.UnresolvedMembers;
267
292
  for (const baseType of baseTypes) {
268
293
  const instantiatedBaseType =
269
- thisArgument !== undefined
270
- ? getTypeWithThisArgument(c, instantiateType(c, baseType, mapper), thisArgument, false)
294
+ lastArgument !== undefined
295
+ ? getTypeWithThisArgument(c, instantiateType(c, baseType, mapper), lastArgument, false)
271
296
  : baseType;
272
297
  addInheritedMembers(members, getPropertiesOfType(c, instantiatedBaseType));
273
298
  // A base without signatures adds none: no copy of the list then.
@@ -576,14 +601,22 @@ export class PropertyMembers extends PendingMembers {
576
601
  /** The most properties of a table that `keepPropertiesOnly` drops: a lookup compares that many names at most. */
577
602
  const scannedPropertiesLimit = 8;
578
603
 
604
+ /** The most properties of an object literal's table that `keepPropertiesOnly` drops: literals are looked up often. */
605
+ export const scannedLiteralPropertiesLimit = 4;
606
+
579
607
  /**
580
608
  * After `setStructuredTypeMembers(c, t, members, ...)`: drops `members` where it holds only the
581
- * type's properties, at most `scannedPropertiesLimit` of them (`PropertyMembers`).
609
+ * type's properties, at most `limit` of them (`PropertyMembers`).
582
610
  */
583
- export function keepPropertiesOnly(c: Checker, t: StructuredType, members: SymbolTable): void {
611
+ export function keepPropertiesOnly(
612
+ c: Checker,
613
+ t: StructuredType,
614
+ members: SymbolTable,
615
+ limit: number = scannedPropertiesLimit,
616
+ ): void {
584
617
  const resolved = membersHolder(c, t);
585
618
  const properties = resolved.propertiesValue;
586
- if (members.size === 0 || members.size > scannedPropertiesLimit || properties.length !== members.size) return;
619
+ if (members.size === 0 || members.size > limit || properties.length !== members.size) return;
587
620
  resolved.membersValue = undefined;
588
621
  resolved.pendingMembers = new PropertyMembers(properties, undefined);
589
622
  }
@@ -807,7 +840,7 @@ function resolvePendingObjectTypeMembers(
807
840
  pending: PendingInstantiatedMembers,
808
841
  baseTypes: Type[],
809
842
  mapper: TypeMapper,
810
- typeArguments: Type[],
843
+ thisArgument: Type | undefined,
811
844
  callSignatures: Signature[],
812
845
  constructSignatures: Signature[],
813
846
  indexInfos: IndexInfo[],
@@ -816,7 +849,6 @@ function resolvePendingObjectTypeMembers(
816
849
  if (baseTypes.length === 0) return;
817
850
  pending.hasBases = true;
818
851
  pending.resolving = true;
819
- const thisArgument = typeArguments.length !== 0 ? typeArguments[typeArguments.length - 1]! : undefined;
820
852
  t.objectFlags |= ObjectFlags.UnresolvedMembers;
821
853
  for (const baseType of baseTypes) {
822
854
  const instantiatedBaseType =
@@ -999,7 +1031,7 @@ function resolveAnonymousTypeMembers(c: Checker, t: ObjectType): void {
999
1031
  const varsOnly = new Map<string, Symbol>();
1000
1032
  for (const p of members.values()) {
1001
1033
  if ((p.flags & SymbolFlags.BlockScoped) !== 0) continue;
1002
- if ((p.flags & SymbolFlags.ValueModule) !== 0 && isOnlyAmbientModuleDeclarations(p.declarations)) continue;
1034
+ if ((p.flags & SymbolFlags.ValueModule) !== 0 && isOnlyAmbientModuleDeclarations(getDeclarations(p))) continue;
1003
1035
  varsOnly.set(p.name, p);
1004
1036
  }
1005
1037
  members = varsOnly;
@@ -1494,8 +1526,9 @@ export function getPropertiesOfObjectType(c: Checker, t: Type): Symbol[] {
1494
1526
  }
1495
1527
 
1496
1528
  export function getPropertiesOfUnionOrIntersectionType(c: Checker, t: UnionOrIntersectionType): Symbol[] {
1497
- const side = sideOf(c, t);
1498
- if (side.resolvedProperties === undefined) {
1529
+ const known = sideOf(c, t).membersOf;
1530
+ if (known !== undefined && known.resolvedProperties !== undefined) return known.resolvedProperties;
1531
+ {
1499
1532
  const checked = new Set<string>();
1500
1533
  const props: Symbol[] = [];
1501
1534
  for (const current of t.types) {
@@ -1513,9 +1546,11 @@ export function getPropertiesOfUnionOrIntersectionType(c: Checker, t: UnionOrInt
1513
1546
  // Union properties are in every constituent: the first without index signatures suffices.
1514
1547
  if ((t.flags & TypeFlags.Union) !== 0 && getIndexInfosOfType(c, current).length === 0) break;
1515
1548
  }
1549
+ // Resolving the properties may have created the holder.
1550
+ const side = unionOrIntersectionMembers(sideOf(c, t));
1516
1551
  side.resolvedProperties = props;
1552
+ return props;
1517
1553
  }
1518
- return side.resolvedProperties;
1519
1554
  }
1520
1555
 
1521
1556
  export function getPropertyOfType(c: Checker, t: Type, name: string): Symbol | undefined {
@@ -1576,6 +1611,170 @@ export function getPropertyOfTypeEx(
1576
1611
  return undefined;
1577
1612
  }
1578
1613
 
1614
+ /**
1615
+ * A long property list that `propertiesRelatedTo` walks: the position of each name, and the positions of
1616
+ * the static private properties, which `getUnmatchedProperty` never reports, and of the required ones.
1617
+ */
1618
+ export class PropertyListIndex {
1619
+ readonly positions: Map<string, number>;
1620
+ readonly staticPrivate: number[];
1621
+ readonly required: number[];
1622
+
1623
+ constructor(positions: Map<string, number>, staticPrivate: number[], required: number[]) {
1624
+ this.positions = positions;
1625
+ this.staticPrivate = staticPrivate;
1626
+ this.required = required;
1627
+ }
1628
+ }
1629
+
1630
+ /** The uses of a long property list after which `propertyListIndex` indexes it by a table of its own. */
1631
+ const propertyListUsesBeforeIndex = 3;
1632
+
1633
+ /**
1634
+ * The index of `properties`, the properties of `target`. Where the members of `target` are properties
1635
+ * with shared names (`PropertyMembers` with `MemberNames`), the index reads the positions of those names.
1636
+ * Other lists get a positions table of their own on the use after the first `propertyListUsesBeforeIndex`:
1637
+ * most long lists are related only a few times, and the lists related many times hold most of the lookups
1638
+ * the index saves. Undefined before that, and where the list repeats a name.
1639
+ */
1640
+ function propertyListIndex(c: Checker, target: Type, properties: Symbol[]): PropertyListIndex | undefined {
1641
+ const known = c.propertyListIndexes.get(properties);
1642
+ if (known instanceof PropertyListIndex) return known;
1643
+ if (known === null) return undefined;
1644
+ let positions: Map<string, number> | undefined;
1645
+ const pending = (target.flags & TypeFlags.Object) !== 0 ? membersHolder(c, target).pendingMembers : undefined;
1646
+ if (
1647
+ pending instanceof PropertyMembers &&
1648
+ pending.materializedProperties === properties &&
1649
+ pending.names !== undefined
1650
+ ) {
1651
+ // The names are the names of the properties, in order (hasMemberNames).
1652
+ positions = pending.names.positions;
1653
+ if (positions.size !== properties.length) {
1654
+ c.propertyListIndexes.set(properties, null);
1655
+ return undefined;
1656
+ }
1657
+ } else {
1658
+ const uses = known ?? 0;
1659
+ if (uses < propertyListUsesBeforeIndex) {
1660
+ c.propertyListIndexes.set(properties, uses + 1);
1661
+ return undefined;
1662
+ }
1663
+ }
1664
+ const own = positions === undefined ? new Map<string, number>() : undefined;
1665
+ const staticPrivate: number[] = [];
1666
+ const required: number[] = [];
1667
+ for (let i = 0; i < properties.length; i++) {
1668
+ const p = properties[i]!;
1669
+ if (own !== undefined) {
1670
+ if (own.has(p.name)) {
1671
+ c.propertyListIndexes.set(properties, null);
1672
+ return undefined;
1673
+ }
1674
+ own.set(p.name, i);
1675
+ }
1676
+ if (isStaticPrivateIdentifierProperty(p)) staticPrivate.push(i);
1677
+ else if ((p.flags & SymbolFlags.Optional) === 0 && (p.checkFlags & CheckFlags.Partial) === 0) required.push(i);
1678
+ }
1679
+ const index = new PropertyListIndex((positions ?? own)!, staticPrivate, required);
1680
+ c.propertyListIndexes.set(properties, index);
1681
+ return index;
1682
+ }
1683
+
1684
+ /**
1685
+ * `getUnmatchedProperty(c, source, target, requireOptionalProperties, false)` where `targetProperties` are
1686
+ * the target's properties and `found` the positions of the names the source has
1687
+ * (`positionsOfNamesFoundInSource`): the first property that is not static private, and is required unless
1688
+ * `requireOptionalProperties`, at a position not in `found`.
1689
+ */
1690
+ export function firstUnmatchedProperty(
1691
+ c: Checker,
1692
+ targetProperties: Symbol[],
1693
+ found: number[],
1694
+ requireOptionalProperties: boolean,
1695
+ ): Symbol | undefined {
1696
+ const index = c.propertyListIndexes.get(targetProperties) as PropertyListIndex;
1697
+ let next = 0;
1698
+ if (!requireOptionalProperties) {
1699
+ for (const position of index.required) {
1700
+ while (next < found.length && found[next]! < position) next++;
1701
+ if (next === found.length || found[next] !== position) return targetProperties[position];
1702
+ }
1703
+ return undefined;
1704
+ }
1705
+ const staticPrivate = index.staticPrivate;
1706
+ let nextPrivate = 0;
1707
+ for (let position = 0; position < targetProperties.length; position++) {
1708
+ // A position can be both found and static private: both lists move past it.
1709
+ const isFound = next < found.length && found[next] === position;
1710
+ if (isFound) next++;
1711
+ const isStaticPrivate = nextPrivate < staticPrivate.length && staticPrivate[nextPrivate] === position;
1712
+ if (isStaticPrivate) nextPrivate++;
1713
+ if (!isFound && !isStaticPrivate) return targetProperties[position];
1714
+ }
1715
+ return undefined;
1716
+ }
1717
+
1718
+ /** The shortest target property list that `positionsOfNamesFoundInSource` indexes. */
1719
+ const indexedTargetPropertiesMinimum = 32;
1720
+
1721
+ /** The properties of `t` where its members are resolved and instantiated, else undefined. */
1722
+ function resolvedPropertiesIfAny(c: Checker, t: Type): Symbol[] | undefined {
1723
+ const holder = (t.objectFlags & ObjectFlags.MembersResolved) !== 0 ? (t as StructuredType) : membersHolder(c, t);
1724
+ if ((holder.objectFlags & ObjectFlags.MembersResolved) === 0) return undefined;
1725
+ const pending = holder.pendingMembers;
1726
+ return pending === undefined || pending.materializedProperties !== undefined ? holder.properties : undefined;
1727
+ }
1728
+
1729
+ /**
1730
+ * The positions in `targetProperties`, the properties of `target`, ascending, of the names
1731
+ * `getPropertyOfType(c, source, name)` finds: the names of the source's properties and of the Function and
1732
+ * Object members its lookups fall back to. `getPropertyOfType` answers undefined for the names at every
1733
+ * other position. Undefined where the answer cannot be read from resolved property lists without resolving
1734
+ * anything (not an object type, an apparent type, members not resolved or not instantiated yet, a module),
1735
+ * where the target list is too short or the source list too long to save lookups, and where the target
1736
+ * list has no index (yet: `propertyListIndex`).
1737
+ */
1738
+ export function positionsOfNamesFoundInSource(
1739
+ c: Checker,
1740
+ source: Type,
1741
+ target: Type,
1742
+ targetProperties: Symbol[],
1743
+ ): number[] | undefined {
1744
+ if (targetProperties.length < indexedTargetPropertiesMinimum) return undefined;
1745
+ if ((source.flags & TypeFlags.Object) === 0 || !isOwnReducedApparentType(source)) return undefined;
1746
+ // A module's member that only an `export type *` declaration exports is not found.
1747
+ if (source.symbol !== undefined && (source.symbol.flags & SymbolFlags.ValueModule) !== 0) return undefined;
1748
+ const sourceProperties = resolvedPropertiesIfAny(c, source);
1749
+ if (sourceProperties === undefined) return undefined;
1750
+ const resolved = membersHolder(c, source);
1751
+ let functionType: Type | undefined;
1752
+ if (source === c.anyFunctionType) functionType = c.globalFunctionType;
1753
+ else if (resolved.callSignatures.length !== 0) functionType = c.globalCallableFunctionType;
1754
+ else if (resolved.constructSignatures.length !== 0) functionType = c.globalNewableFunctionType;
1755
+ let functionProperties = emptySymbols;
1756
+ if (functionType !== undefined && (functionType.flags & TypeFlags.Object) !== 0) {
1757
+ const properties = resolvedPropertiesIfAny(c, functionType);
1758
+ if (properties === undefined) return undefined;
1759
+ functionProperties = properties;
1760
+ }
1761
+ const objectProperties =
1762
+ (c.globalObjectType.flags & TypeFlags.Object) !== 0 ? resolvedPropertiesIfAny(c, c.globalObjectType) : emptySymbols;
1763
+ if (objectProperties === undefined) return undefined;
1764
+ if ((sourceProperties.length + functionProperties.length + objectProperties.length) * 4 > targetProperties.length)
1765
+ return undefined;
1766
+ const index = propertyListIndex(c, target, targetProperties);
1767
+ if (index === undefined) return undefined;
1768
+ const positions = index.positions;
1769
+ const found: number[] = [];
1770
+ for (const list of [sourceProperties, functionProperties, objectProperties])
1771
+ for (const p of list) {
1772
+ const position = positions.get(p.name);
1773
+ if (position !== undefined && !found.includes(position)) found.push(position);
1774
+ }
1775
+ return found.sort((a, b) => a - b);
1776
+ }
1777
+
1579
1778
  export function getPropertyOfObjectType(c: Checker, t: Type, name: string): Symbol | undefined {
1580
1779
  if ((t.flags & TypeFlags.Object) === 0) return undefined;
1581
1780
  const symbol = getResolvedMember(resolveStructuredTypeMembers(c, t), name);
@@ -1614,16 +1813,24 @@ export function getUnionOrIntersectionProperty(
1614
1813
  name: string,
1615
1814
  skipObjectFunctionPropertyAugment: boolean,
1616
1815
  ): Symbol | undefined {
1617
- const side = sideOf(c, t);
1618
- let cache = skipObjectFunctionPropertyAugment ? side.propertyCacheWithoutFunctionPropertyAugment : side.propertyCache;
1619
- const cached = cache?.get(name);
1620
- if (cached !== undefined) return cached;
1621
- if (!skipObjectFunctionPropertyAugment) {
1622
- const withoutAugment = side.propertyCacheWithoutFunctionPropertyAugment?.get(name);
1623
- if (withoutAugment !== undefined && (withoutAugment.checkFlags & CheckFlags.Partial) === 0) return withoutAugment;
1816
+ const known = sideOf(c, t).membersOf;
1817
+ if (known !== undefined) {
1818
+ const cached = (
1819
+ skipObjectFunctionPropertyAugment ? known.propertyCacheWithoutFunctionPropertyAugment : known.propertyCache
1820
+ )?.get(name);
1821
+ if (cached !== undefined) return cached;
1822
+ if (!skipObjectFunctionPropertyAugment) {
1823
+ const withoutAugment = known.propertyCacheWithoutFunctionPropertyAugment?.get(name);
1824
+ if (withoutAugment !== undefined && (withoutAugment.checkFlags & CheckFlags.Partial) === 0) return withoutAugment;
1825
+ }
1624
1826
  }
1625
1827
  const prop = createUnionOrIntersectionProperty(c, t, name, skipObjectFunctionPropertyAugment);
1626
1828
  if (prop !== undefined) {
1829
+ // Creating the property may have created the holder and its caches.
1830
+ const side = unionOrIntersectionMembers(sideOf(c, t));
1831
+ let cache = skipObjectFunctionPropertyAugment
1832
+ ? side.propertyCacheWithoutFunctionPropertyAugment
1833
+ : side.propertyCache;
1627
1834
  if (cache === undefined) {
1628
1835
  cache = new Map<string, Symbol>();
1629
1836
  if (skipObjectFunctionPropertyAugment) side.propertyCacheWithoutFunctionPropertyAugment = cache;
@@ -1765,7 +1972,7 @@ export function createUnionOrIntersectionProperty(
1765
1972
  if (firstValueDeclaration === undefined) firstValueDeclaration = prop.valueDeclaration;
1766
1973
  else if (prop.valueDeclaration !== undefined && prop.valueDeclaration !== firstValueDeclaration)
1767
1974
  hasNonUniformValueDeclaration = true;
1768
- for (const d of prop.declarations) declarations.push(d);
1975
+ for (const d of getDeclarations(prop)) declarations.push(d);
1769
1976
  const t = getTypeOfSymbol(c, prop);
1770
1977
  if (firstType === undefined) {
1771
1978
  firstType = t;
@@ -1783,7 +1990,7 @@ export function createUnionOrIntersectionProperty(
1783
1990
  }
1784
1991
  for (const t of indexTypes) propTypes.push(t);
1785
1992
  const result = c.newSymbolWithCheckFlags(propFlags | optionalFlag, name, checkFlags | syntheticFlag);
1786
- result.declarations = declarations;
1993
+ setDeclarations(result, declarations);
1787
1994
  if (!hasNonUniformValueDeclaration && firstValueDeclaration !== undefined) {
1788
1995
  result.valueDeclaration = firstValueDeclaration;
1789
1996
  result.parent = getSymbol(firstValueDeclaration)?.parent;
@@ -1821,13 +2028,13 @@ export function isPrototypeProperty(symbol: Symbol): boolean {
1821
2028
  function hasCommonDeclaration(symbols: Symbol[]): boolean {
1822
2029
  let common: Set<Node> | undefined;
1823
2030
  for (const symbol of symbols) {
1824
- if (symbol.declarations.length === 0) return false;
2031
+ if (declarationCount(symbol) === 0) return false;
1825
2032
  if (common === undefined) {
1826
- common = new Set(symbol.declarations);
2033
+ common = new Set(getDeclarations(symbol));
1827
2034
  continue;
1828
2035
  }
1829
2036
  const next = new Set<Node>();
1830
- for (const d of symbol.declarations) if (common.has(d)) next.add(d);
2037
+ for (const d of getDeclarations(symbol)) if (common.has(d)) next.add(d);
1831
2038
  if (next.size === 0) return false;
1832
2039
  common = next;
1833
2040
  }
@@ -1836,7 +2043,7 @@ function hasCommonDeclaration(symbols: Symbol[]): boolean {
1836
2043
 
1837
2044
  export function createSymbolWithType(c: Checker, source: Symbol, t: Type | undefined): Symbol {
1838
2045
  const symbol = c.newSymbolWithCheckFlags(source.flags, source.name, source.checkFlags & CheckFlags.Readonly);
1839
- symbol.declarations = source.declarations;
2046
+ copyDeclarations(symbol, source);
1840
2047
  symbol.parent = source.parent;
1841
2048
  symbol.valueDeclaration = source.valueDeclaration;
1842
2049
  const id = getSymbolId(symbol);
@@ -2111,7 +2318,8 @@ export function getReducedType(c: Checker, t: Type): Type {
2111
2318
  * private, are combined, and the costliest constituent's properties are only looked up by name.
2112
2319
  */
2113
2320
  function hasNeverReducedProperty(c: Checker, t: IntersectionType): boolean {
2114
- const resolved = sideOf(c, t).resolvedProperties;
2321
+ const members = sideOf(c, t).membersOf;
2322
+ const resolved = members !== undefined ? members.resolvedProperties : undefined;
2115
2323
  if (resolved !== undefined) {
2116
2324
  for (const p of resolved) if (isNeverReducedProperty(c, p)) return true;
2117
2325
  return false;