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.
- package/README.md +1 -1
- package/dist/api/compiler/ast.d.ts +67 -27
- package/dist/api/compiler/ast.js +156 -55
- package/dist/api/compiler/binder-utilities.js +4 -3
- package/dist/api/compiler/binder.js +14 -13
- package/dist/api/compiler/checker-calls.js +7 -6
- package/dist/api/compiler/checker-contextual.js +1 -1
- package/dist/api/compiler/checker-declaration-order.js +2 -1
- package/dist/api/compiler/checker-declarations.js +14 -14
- package/dist/api/compiler/checker-declared-types.d.ts +1 -1
- package/dist/api/compiler/checker-declared-types.js +12 -11
- package/dist/api/compiler/checker-decorators.js +3 -3
- package/dist/api/compiler/checker-deprecation.js +17 -18
- package/dist/api/compiler/checker-destructuring.d.ts +1 -1
- package/dist/api/compiler/checker-destructuring.js +3 -3
- package/dist/api/compiler/checker-elaboration.js +8 -7
- package/dist/api/compiler/checker-emit-helpers.d.ts +2 -1
- package/dist/api/compiler/checker-emit-helpers.js +5 -4
- package/dist/api/compiler/checker-emit-resolver.d.ts +1 -1
- package/dist/api/compiler/checker-emit-resolver.js +5 -4
- package/dist/api/compiler/checker-grammar.js +23 -9
- package/dist/api/compiler/checker-heritage.d.ts +1 -1
- package/dist/api/compiler/checker-heritage.js +14 -13
- package/dist/api/compiler/checker-inference.d.ts +21 -11
- package/dist/api/compiler/checker-inference.js +57 -34
- package/dist/api/compiler/checker-javascript.d.ts +1 -1
- package/dist/api/compiler/checker-javascript.js +5 -4
- package/dist/api/compiler/checker-jsx.d.ts +1 -1
- package/dist/api/compiler/checker-jsx.js +4 -4
- package/dist/api/compiler/checker-literals.js +2 -2
- package/dist/api/compiler/checker-members.d.ts +32 -3
- package/dist/api/compiler/checker-members.js +240 -53
- package/dist/api/compiler/checker-modules.d.ts +15 -1
- package/dist/api/compiler/checker-modules.js +86 -14
- package/dist/api/compiler/checker-object-literals.d.ts +1 -1
- package/dist/api/compiler/checker-object-literals.js +11 -7
- package/dist/api/compiler/checker-overloads.d.ts +1 -1
- package/dist/api/compiler/checker-overloads.js +4 -3
- package/dist/api/compiler/checker-property-access.d.ts +1 -1
- package/dist/api/compiler/checker-property-access.js +2 -2
- package/dist/api/compiler/checker-services.js +2 -2
- package/dist/api/compiler/checker-signatures.d.ts +1 -1
- package/dist/api/compiler/checker-signatures.js +9 -8
- package/dist/api/compiler/checker-symbol-types.d.ts +2 -18
- package/dist/api/compiler/checker-symbol-types.js +22 -952
- package/dist/api/compiler/checker-symbols.d.ts +2 -2
- package/dist/api/compiler/checker-symbols.js +29 -27
- package/dist/api/compiler/checker-type-factory.d.ts +2 -2
- package/dist/api/compiler/checker-type-factory.js +57 -16
- package/dist/api/compiler/checker-type-nodes.d.ts +1 -1
- package/dist/api/compiler/checker-type-nodes.js +2 -2
- package/dist/api/compiler/checker-type-operators.d.ts +1 -1
- package/dist/api/compiler/checker-type-operators.js +5 -5
- package/dist/api/compiler/checker-types.d.ts +73 -7
- package/dist/api/compiler/checker-types.js +220 -43
- package/dist/api/compiler/checker-unused.d.ts +1 -1
- package/dist/api/compiler/checker-unused.js +3 -3
- package/dist/api/compiler/checker.d.ts +45 -8
- package/dist/api/compiler/checker.js +46 -9
- package/dist/api/compiler/diagnostics.d.ts +2 -8
- package/dist/api/compiler/diagnostics.js +13 -45
- package/dist/api/compiler/file-include.d.ts +35 -8
- package/dist/api/compiler/file-include.js +81 -18
- package/dist/api/compiler/file-loader.d.ts +33 -4
- package/dist/api/compiler/file-loader.js +90 -24
- package/dist/api/compiler/instantiation.d.ts +1 -1
- package/dist/api/compiler/instantiation.js +86 -50
- package/dist/api/compiler/link-tables.d.ts +69 -0
- package/dist/api/compiler/link-tables.js +236 -0
- package/dist/api/compiler/name-resolver.js +3 -3
- package/dist/api/compiler/node-builder-names.d.ts +1 -1
- package/dist/api/compiler/node-builder-names.js +12 -12
- package/dist/api/compiler/node-builder-pseudo.d.ts +1 -1
- package/dist/api/compiler/node-builder-pseudo.js +2 -1
- package/dist/api/compiler/node-builder.d.ts +1 -1
- package/dist/api/compiler/node-builder.js +16 -16
- package/dist/api/compiler/parallel-parse.d.ts +2 -0
- package/dist/api/compiler/parallel-parse.js +7 -1
- package/dist/api/compiler/parser.d.ts +33 -16
- package/dist/api/compiler/parser.js +127 -98
- package/dist/api/compiler/printer/emit-context.d.ts +5 -2
- package/dist/api/compiler/printer/emit-context.js +19 -13
- package/dist/api/compiler/printer/factory-base.js +8 -8
- package/dist/api/compiler/printer/factory.js +4 -4
- package/dist/api/compiler/printer/printer.js +6 -6
- package/dist/api/compiler/program-checker.d.ts +5 -0
- package/dist/api/compiler/program-checker.js +14 -1
- package/dist/api/compiler/program.js +9 -1
- package/dist/api/compiler/relations.d.ts +1 -1
- package/dist/api/compiler/relations.js +18 -13
- package/dist/api/compiler/reparser.js +13 -5
- package/dist/api/compiler/symbol-accessibility.d.ts +1 -1
- package/dist/api/compiler/symbol-accessibility.js +123 -26
- package/dist/api/compiler/symbol.d.ts +45 -3
- package/dist/api/compiler/symbol.js +121 -10
- package/dist/api/compiler/transformers/alias-references.d.ts +1 -1
- package/dist/api/compiler/transformers/alias-references.js +2 -1
- package/dist/api/compiler/transformers/class-fields.js +3 -3
- package/dist/api/compiler/transformers/commonjs-module.js +3 -3
- package/dist/api/compiler/transformers/declarations-diagnostics.js +2 -1
- package/dist/api/compiler/transformers/declarations-pseudo.js +6 -4
- package/dist/api/compiler/transformers/declarations-syntactic.d.ts +1 -1
- package/dist/api/compiler/transformers/declarations-syntactic.js +9 -9
- package/dist/api/compiler/transformers/declarations-tracker.d.ts +1 -1
- package/dist/api/compiler/transformers/declarations-tracker.js +3 -2
- package/dist/api/compiler/transformers/declarations.js +6 -5
- package/dist/api/compiler/transformers/module.js +2 -2
- package/dist/api/compiler/transformers/optional-chain.js +3 -3
- package/dist/api/compiler/transformers/reference-resolver.d.ts +2 -1
- package/dist/api/compiler/transformers/reference-resolver.js +26 -24
- package/dist/api/compiler/transformers/subtree-facts.d.ts +1 -0
- package/dist/api/compiler/transformers/subtree-facts.js +9 -7
- package/dist/api/compiler/transformers/syntax-facts.d.ts +1 -0
- package/dist/api/compiler/transformers/syntax-facts.js +9 -5
- package/dist/api/compiler/transformers/tagged-template.js +2 -2
- package/dist/api/compiler/transformers/type-eraser.js +2 -2
- package/dist/api/compiler/transformers/type-serialization.js +12 -12
- package/dist/api/compiler/transformers/visitor-base.js +3 -3
- package/dist/api/compiler/tsconfig.js +2 -2
- package/package.json +9 -9
- package/src/compiler/ast.ts +211 -78
- package/src/compiler/binder-utilities.ts +4 -3
- package/src/compiler/binder.ts +26 -16
- package/src/compiler/checker-calls.ts +8 -6
- package/src/compiler/checker-contextual.ts +1 -1
- package/src/compiler/checker-declaration-order.ts +2 -2
- package/src/compiler/checker-declarations.ts +21 -14
- package/src/compiler/checker-declared-types.ts +12 -12
- package/src/compiler/checker-decorators.ts +3 -3
- package/src/compiler/checker-deprecation.ts +17 -21
- package/src/compiler/checker-destructuring.ts +3 -3
- package/src/compiler/checker-elaboration.ts +8 -8
- package/src/compiler/checker-emit-helpers.ts +5 -4
- package/src/compiler/checker-emit-resolver.ts +5 -5
- package/src/compiler/checker-grammar.ts +22 -8
- package/src/compiler/checker-heritage.ts +21 -14
- package/src/compiler/checker-inference.ts +66 -34
- package/src/compiler/checker-javascript.ts +5 -5
- package/src/compiler/checker-jsx.ts +12 -8
- package/src/compiler/checker-literals.ts +2 -2
- package/src/compiler/checker-members.ts +255 -47
- package/src/compiler/checker-modules.ts +115 -14
- package/src/compiler/checker-object-literals.ts +22 -6
- package/src/compiler/checker-overloads.ts +6 -6
- package/src/compiler/checker-property-access.ts +2 -2
- package/src/compiler/checker-services.ts +2 -2
- package/src/compiler/checker-signatures.ts +9 -9
- package/src/compiler/checker-symbol-types.ts +20 -940
- package/src/compiler/checker-symbols.ts +42 -35
- package/src/compiler/checker-type-factory.ts +53 -16
- package/src/compiler/checker-type-nodes.ts +2 -2
- package/src/compiler/checker-type-operators.ts +13 -5
- package/src/compiler/checker-types.ts +223 -43
- package/src/compiler/checker-unused.ts +3 -3
- package/src/compiler/checker.ts +50 -9
- package/src/compiler/decoder.ts +5 -4
- package/src/compiler/diagnostics.ts +14 -48
- package/src/compiler/encoder.ts +10 -5
- package/src/compiler/file-include.ts +85 -17
- package/src/compiler/file-loader.ts +104 -35
- package/src/compiler/incremental.ts +39 -5
- package/src/compiler/instantiation.ts +99 -55
- package/src/compiler/link-tables.ts +245 -0
- package/src/compiler/name-resolver.ts +3 -3
- package/src/compiler/node-builder-names.ts +21 -19
- package/src/compiler/node-builder-pseudo.ts +2 -2
- package/src/compiler/node-builder.ts +24 -16
- package/src/compiler/parallel-check.ts +11 -8
- package/src/compiler/parallel-parse.ts +8 -1
- package/src/compiler/parse-thread.ts +0 -4
- package/src/compiler/parser.ts +173 -93
- package/src/compiler/printer/emit-context.ts +20 -15
- package/src/compiler/printer/factory-base.ts +14 -7
- package/src/compiler/printer/factory.ts +5 -3
- package/src/compiler/printer/printer.ts +8 -6
- package/src/compiler/program-checker.ts +12 -1
- package/src/compiler/program.ts +8 -1
- package/src/compiler/relations.ts +20 -12
- package/src/compiler/reparser.ts +14 -4
- package/src/compiler/symbol-accessibility.ts +120 -25
- package/src/compiler/symbol.ts +127 -9
- package/src/compiler/transformers/alias-references.ts +2 -2
- package/src/compiler/transformers/class-fields.ts +12 -2
- package/src/compiler/transformers/commonjs-module.ts +3 -2
- package/src/compiler/transformers/declarations-diagnostics.ts +2 -1
- package/src/compiler/transformers/declarations-pseudo.ts +9 -5
- package/src/compiler/transformers/declarations-syntactic.ts +17 -9
- package/src/compiler/transformers/declarations-tracker.ts +3 -3
- package/src/compiler/transformers/declarations.ts +7 -7
- package/src/compiler/transformers/module.ts +2 -1
- package/src/compiler/transformers/optional-chain.ts +5 -2
- package/src/compiler/transformers/reference-resolver.ts +37 -25
- package/src/compiler/transformers/subtree-facts.ts +15 -6
- package/src/compiler/transformers/syntax-facts.ts +10 -5
- package/src/compiler/transformers/tagged-template.ts +2 -2
- package/src/compiler/transformers/type-eraser.ts +2 -1
- package/src/compiler/transformers/type-serialization.ts +12 -12
- package/src/compiler/transformers/visitor-base.ts +10 -5
- package/src/compiler/tsc-build.ts +17 -13
- package/src/compiler/tsc-cli.ts +9 -6
- package/src/compiler/tsc-compile.ts +16 -7
- package/src/compiler/tsc-watch.ts +94 -26
- 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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return
|
|
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
|
-
/**
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
270
|
-
? getTypeWithThisArgument(c, instantiateType(c, baseType, mapper),
|
|
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 `
|
|
609
|
+
* type's properties, at most `limit` of them (`PropertyMembers`).
|
|
582
610
|
*/
|
|
583
|
-
export function keepPropertiesOnly(
|
|
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 >
|
|
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
|
-
|
|
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
|
|
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
|
|
1498
|
-
if (
|
|
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
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
if (
|
|
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
|
|
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
|
|
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
|
|
2031
|
+
if (declarationCount(symbol) === 0) return false;
|
|
1825
2032
|
if (common === undefined) {
|
|
1826
|
-
common = new Set(symbol
|
|
2033
|
+
common = new Set(getDeclarations(symbol));
|
|
1827
2034
|
continue;
|
|
1828
2035
|
}
|
|
1829
2036
|
const next = new Set<Node>();
|
|
1830
|
-
for (const d of symbol
|
|
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
|
|
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
|
|
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;
|