Skip to content

Commit fa0080f

Browse files
authored
Support interpreting non-literal computed properties in classes as implicit index signatures (#59860)
1 parent e24cc01 commit fa0080f

34 files changed

+400
-81
lines changed

src/compiler/checker.ts

Lines changed: 148 additions & 30 deletions
Large diffs are not rendered by default.

src/compiler/emitter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,7 @@ export const notImplementedResolver: EmitResolver = {
11671167
getDeclarationStatementsForSourceFile: notImplemented,
11681168
isImportRequiredByAugmentation: notImplemented,
11691169
isDefinitelyReferenceToGlobalSymbolObject: notImplemented,
1170+
createLateBoundIndexSignatures: notImplemented,
11701171
};
11711172

11721173
const enum PipelinePhase {

src/compiler/transformers/declarations.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
canHaveModifiers,
1313
canProduceDiagnostics,
1414
ClassDeclaration,
15+
ClassElement,
1516
compact,
1617
concatenate,
1718
ConditionalTypeNode,
@@ -1652,7 +1653,8 @@ export function transformDeclarations(context: TransformationContext): Transform
16521653
/*initializer*/ undefined,
16531654
),
16541655
] : undefined;
1655-
const memberNodes = concatenate(concatenate(privateIdentifier, parameterProperties), visitNodes(input.members, visitDeclarationSubtree, isClassElement));
1656+
const lateIndexes = resolver.createLateBoundIndexSignatures(input, enclosingDeclaration, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker);
1657+
const memberNodes = concatenate(concatenate(concatenate<ClassElement>(privateIdentifier, lateIndexes), parameterProperties), visitNodes(input.members, visitDeclarationSubtree, isClassElement));
16561658
const members = factory.createNodeArray(memberNodes);
16571659

16581660
const extendsClause = getEffectiveBaseTypeNode(input);

src/compiler/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5048,7 +5048,7 @@ export interface TypeChecker {
50485048
/** @internal */ getTypeOfPropertyOfType(type: Type, propertyName: string): Type | undefined;
50495049
getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined;
50505050
getIndexInfosOfType(type: Type): readonly IndexInfo[];
5051-
getIndexInfosOfIndexSymbol: (indexSymbol: Symbol) => IndexInfo[];
5051+
getIndexInfosOfIndexSymbol: (indexSymbol: Symbol, siblingSymbols?: Symbol[] | undefined) => IndexInfo[];
50525052
getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[];
50535053
getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined;
50545054
/** @internal */ getIndexType(type: Type): Type;
@@ -5867,6 +5867,7 @@ export interface EmitResolver {
58675867
getDeclarationStatementsForSourceFile(node: SourceFile, flags: NodeBuilderFlags, internalFlags: InternalNodeBuilderFlags, tracker: SymbolTracker): Statement[] | undefined;
58685868
isImportRequiredByAugmentation(decl: ImportDeclaration): boolean;
58695869
isDefinitelyReferenceToGlobalSymbolObject(node: Node): boolean;
5870+
createLateBoundIndexSignatures(cls: ClassLikeDeclaration, enclosingDeclaration: Node, flags: NodeBuilderFlags, internalFlags: InternalNodeBuilderFlags, tracker: SymbolTracker): IndexSignatureDeclaration[] | undefined;
58705871
}
58715872

58725873
// dprint-ignore

tests/baselines/reference/ES5SymbolProperty2.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ module M {
2424
> : ^^^
2525
}
2626
(new C)[Symbol.iterator];
27-
>(new C)[Symbol.iterator] : any
28-
> : ^^^
27+
>(new C)[Symbol.iterator] : () => void
28+
> : ^^^^^^^^^^
2929
>(new C) : C
3030
> : ^
3131
>new C : C
@@ -41,8 +41,8 @@ module M {
4141
}
4242

4343
(new M.C)[Symbol.iterator];
44-
>(new M.C)[Symbol.iterator] : any
45-
> : ^^^
44+
>(new M.C)[Symbol.iterator] : () => void
45+
> : ^^^^^^^^^^
4646
>(new M.C) : M.C
4747
> : ^^^
4848
>new M.C : M.C

tests/baselines/reference/ES5SymbolProperty3.types

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ class C {
1919
}
2020

2121
(new C)[Symbol.iterator]
22-
>(new C)[Symbol.iterator] : error
22+
>(new C)[Symbol.iterator] : () => void
23+
> : ^^^^^^^^^^
2324
>(new C) : C
2425
> : ^
2526
>new C : C

tests/baselines/reference/ES5SymbolProperty4.types

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class C {
2323
}
2424

2525
(new C)[Symbol.iterator]
26-
>(new C)[Symbol.iterator] : error
26+
>(new C)[Symbol.iterator] : () => void
27+
> : ^^^^^^^^^^
2728
>(new C) : C
2829
> : ^
2930
>new C : C
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
ES5SymbolProperty5.ts(7,26): error TS2554: Expected 0 arguments, but got 1.
2+
3+
4+
==== ES5SymbolProperty5.ts (1 errors) ====
5+
var Symbol: { iterator: symbol };
6+
7+
class C {
8+
[Symbol.iterator]() { }
9+
}
10+
11+
(new C)[Symbol.iterator](0) // Should error
12+
~
13+
!!! error TS2554: Expected 0 arguments, but got 1.

tests/baselines/reference/ES5SymbolProperty5.types

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ class C {
2323
}
2424

2525
(new C)[Symbol.iterator](0) // Should error
26-
>(new C)[Symbol.iterator](0) : error
27-
>(new C)[Symbol.iterator] : error
26+
>(new C)[Symbol.iterator](0) : void
27+
> : ^^^^
28+
>(new C)[Symbol.iterator] : () => void
29+
> : ^^^^^^^^^^
2830
>(new C) : C
2931
> : ^
3032
>new C : C

tests/baselines/reference/ES5SymbolProperty6.types

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ class C {
1717
}
1818

1919
(new C)[Symbol.iterator]
20-
>(new C)[Symbol.iterator] : any
21-
> : ^^^
20+
>(new C)[Symbol.iterator] : () => void
21+
> : ^^^^^^^^^^
2222
>(new C) : C
2323
> : ^
2424
>new C : C

0 commit comments

Comments
 (0)