Skip to content

Commit 647f179

Browse files
authored
Port "Keep accessors as accessors in emitted anonymous class declarations" (#1822)
1 parent 94ae2f2 commit 647f179

24 files changed

+83
-392
lines changed

internal/checker/checker.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15705,14 +15705,14 @@ func (c *Checker) getWriteTypeOfSymbolWithDeferredType(symbol *ast.Symbol) *Type
1570515705
// properties deriving from set accessors will either pre-compute or defer the union or
1570615706
// intersection of the writeTypes of their constituents.
1570715707
func (c *Checker) getWriteTypeOfSymbol(symbol *ast.Symbol) *Type {
15708-
if symbol.Flags&ast.SymbolFlagsProperty != 0 {
15709-
if symbol.CheckFlags&ast.CheckFlagsSyntheticProperty != 0 {
15710-
if symbol.CheckFlags&ast.CheckFlagsDeferredType != 0 {
15711-
return c.getWriteTypeOfSymbolWithDeferredType(symbol)
15712-
}
15713-
links := c.valueSymbolLinks.Get(symbol)
15714-
return core.OrElse(links.writeType, links.resolvedType)
15708+
if symbol.CheckFlags&ast.CheckFlagsSyntheticProperty != 0 {
15709+
if symbol.CheckFlags&ast.CheckFlagsDeferredType != 0 {
15710+
return c.getWriteTypeOfSymbolWithDeferredType(symbol)
1571515711
}
15712+
links := c.valueSymbolLinks.Get(symbol)
15713+
return core.OrElse(links.writeType, links.resolvedType)
15714+
}
15715+
if symbol.Flags&ast.SymbolFlagsProperty != 0 {
1571615716
return c.removeMissingType(c.getTypeOfSymbol(symbol), symbol.Flags&ast.SymbolFlagsOptional != 0)
1571715717
}
1571815718
if symbol.Flags&ast.SymbolFlagsAccessor != 0 {
@@ -20603,6 +20603,7 @@ func (c *Checker) getUnionOrIntersectionProperty(t *Type, name string, skipObjec
2060320603
}
2060420604

2060520605
func (c *Checker) createUnionOrIntersectionProperty(containingType *Type, name string, skipObjectFunctionPropertyAugment bool) *ast.Symbol {
20606+
propFlags := ast.SymbolFlagsNone
2060620607
var singleProp *ast.Symbol
2060720608
var propSet collections.OrderedSet[*ast.Symbol]
2060820609
var indexTypes []*Type
@@ -20632,6 +20633,7 @@ func (c *Checker) createUnionOrIntersectionProperty(containingType *Type, name s
2063220633
}
2063320634
if singleProp == nil {
2063420635
singleProp = prop
20636+
propFlags = core.OrElse(prop.Flags&ast.SymbolFlagsAccessor, ast.SymbolFlagsProperty)
2063520637
} else if prop != singleProp {
2063620638
isInstantiation := c.getTargetSymbol(prop) == c.getTargetSymbol(singleProp)
2063720639
// If the symbols are instances of one another with identical types - consider the symbols
@@ -20648,6 +20650,13 @@ func (c *Checker) createUnionOrIntersectionProperty(containingType *Type, name s
2064820650
}
2064920651
propSet.Add(prop)
2065020652
}
20653+
// classes created by mixins are represented as intersections
20654+
// and overriding a property in a derived class redefines it completely at runtime
20655+
// so a get accessor can't be merged with a set accessor in a base class,
20656+
// for that reason the accessor flags are only used when they are the same in all constituents
20657+
if propFlags&ast.SymbolFlagsAccessor != 0 && (prop.Flags&ast.SymbolFlagsAccessor != (propFlags & ast.SymbolFlagsAccessor)) {
20658+
propFlags = (propFlags &^ ast.SymbolFlagsAccessor) | ast.SymbolFlagsProperty
20659+
}
2065120660
}
2065220661
if isUnion && c.isReadonlySymbol(prop) {
2065320662
checkFlags |= ast.CheckFlagsReadonly
@@ -20675,6 +20684,7 @@ func (c *Checker) createUnionOrIntersectionProperty(containingType *Type, name s
2067520684
indexInfo = c.getApplicableIndexInfoForName(t, name)
2067620685
}
2067720686
if indexInfo != nil {
20687+
propFlags = propFlags&^ast.SymbolFlagsAccessor | ast.SymbolFlagsProperty
2067820688
checkFlags |= ast.CheckFlagsWritePartial | (core.IfElse(indexInfo.isReadonly, ast.CheckFlagsReadonly, 0))
2067920689
if isTupleType(t) {
2068020690
indexType := c.getRestTypeOfTupleType(t)
@@ -20767,7 +20777,7 @@ func (c *Checker) createUnionOrIntersectionProperty(containingType *Type, name s
2076720777
propTypes = append(propTypes, t)
2076820778
}
2076920779
propTypes = append(propTypes, indexTypes...)
20770-
result := c.newSymbolEx(ast.SymbolFlagsProperty|optionalFlag, name, checkFlags|syntheticFlag)
20780+
result := c.newSymbolEx(propFlags|optionalFlag, name, checkFlags|syntheticFlag)
2077120781
result.Declarations = declarations
2077220782
if !hasNonUniformValueDeclaration && firstValueDeclaration != nil {
2077320783
result.ValueDeclaration = firstValueDeclaration

internal/checker/nodebuilderimpl.go

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2214,22 +2214,45 @@ func (b *nodeBuilderImpl) addPropertyToElementList(propertySymbol *ast.Symbol, t
22142214

22152215
if propertySymbol.Flags&ast.SymbolFlagsAccessor != 0 {
22162216
writeType := b.ch.getWriteTypeOfSymbol(propertySymbol)
2217-
if propertyType != writeType && !b.ch.isErrorType(propertyType) && !b.ch.isErrorType(writeType) {
2218-
getterDeclaration := ast.GetDeclarationOfKind(propertySymbol, ast.KindGetAccessor)
2219-
getterSignature := b.ch.getSignatureFromDeclaration(getterDeclaration)
2220-
getter := b.signatureToSignatureDeclarationHelper(getterSignature, ast.KindGetAccessor, &SignatureToSignatureDeclarationOptions{
2221-
name: propertyName,
2222-
})
2223-
b.setCommentRange(getter, getterDeclaration)
2224-
typeElements = append(typeElements, getter)
2225-
setterDeclaration := ast.GetDeclarationOfKind(propertySymbol, ast.KindSetAccessor)
2226-
setterSignature := b.ch.getSignatureFromDeclaration(setterDeclaration)
2227-
setter := b.signatureToSignatureDeclarationHelper(setterSignature, ast.KindSetAccessor, &SignatureToSignatureDeclarationOptions{
2228-
name: propertyName,
2229-
})
2230-
b.setCommentRange(setter, setterDeclaration)
2231-
typeElements = append(typeElements, setter)
2232-
return typeElements
2217+
if !b.ch.isErrorType(propertyType) && !b.ch.isErrorType(writeType) {
2218+
propDeclaration := ast.GetDeclarationOfKind(propertySymbol, ast.KindPropertyDeclaration)
2219+
if propertyType != writeType || propertySymbol.Parent.Flags&ast.SymbolFlagsClass != 0 && propDeclaration == nil {
2220+
if getterDeclaration := ast.GetDeclarationOfKind(propertySymbol, ast.KindGetAccessor); getterDeclaration != nil {
2221+
getterSignature := b.ch.getSignatureFromDeclaration(getterDeclaration)
2222+
getter := b.signatureToSignatureDeclarationHelper(getterSignature, ast.KindGetAccessor, &SignatureToSignatureDeclarationOptions{
2223+
name: propertyName,
2224+
})
2225+
b.setCommentRange(getter, getterDeclaration)
2226+
typeElements = append(typeElements, getter)
2227+
}
2228+
if setterDeclaration := ast.GetDeclarationOfKind(propertySymbol, ast.KindSetAccessor); setterDeclaration != nil {
2229+
setterSignature := b.ch.getSignatureFromDeclaration(setterDeclaration)
2230+
setter := b.signatureToSignatureDeclarationHelper(setterSignature, ast.KindSetAccessor, &SignatureToSignatureDeclarationOptions{
2231+
name: propertyName,
2232+
})
2233+
b.setCommentRange(setter, setterDeclaration)
2234+
typeElements = append(typeElements, setter)
2235+
}
2236+
return typeElements
2237+
} else if propertySymbol.Parent.Flags&ast.SymbolFlagsClass != 0 && propDeclaration != nil && core.Find(propDeclaration.ModifierNodes(), func(m *ast.Node) bool {
2238+
return m.Kind == ast.KindAccessorKeyword
2239+
}) != nil {
2240+
fakeGetterSignature := b.ch.newSignature(SignatureFlagsNone, nil, nil, nil, nil, propertyType, nil, 0)
2241+
fakeGetterDeclaration := b.signatureToSignatureDeclarationHelper(fakeGetterSignature, ast.KindGetAccessor, &SignatureToSignatureDeclarationOptions{
2242+
name: propertyName,
2243+
})
2244+
b.setCommentRange(fakeGetterDeclaration, propDeclaration)
2245+
typeElements = append(typeElements, fakeGetterDeclaration)
2246+
2247+
setterParam := b.ch.newSymbol(ast.SymbolFlagsFunctionScopedVariable, "arg")
2248+
b.ch.valueSymbolLinks.Get(setterParam).resolvedType = writeType
2249+
fakeSetterSignature := b.ch.newSignature(SignatureFlagsNone, nil, nil, nil, []*ast.Symbol{setterParam}, b.ch.voidType, nil, 0)
2250+
fakeSetterDeclaration := b.signatureToSignatureDeclarationHelper(fakeSetterSignature, ast.KindSetAccessor, &SignatureToSignatureDeclarationOptions{
2251+
name: propertyName,
2252+
})
2253+
typeElements = append(typeElements, fakeSetterDeclaration)
2254+
return typeElements
2255+
}
22332256
}
22342257
}
22352258

testdata/baselines/reference/submodule/compiler/declarationEmitGenericTypeParamerSerialization3.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@ export const Cls = wrapper("test");
3636
//// [declarationEmitGenericTypeParamerSerialization3.d.ts]
3737
export declare function wrapper<T>(value: T): {
3838
new (): {
39-
name: T;
39+
get name(): T;
40+
set name(arg: T);
4041
};
4142
};
4243
export declare const Cls: {
4344
new (): {
44-
name: string;
45+
get name(): string;
46+
set name(arg: string);
4547
};
4648
};

testdata/baselines/reference/submodule/compiler/declarationEmitGenericTypeParamerSerialization3.js.diff

Lines changed: 0 additions & 18 deletions
This file was deleted.

testdata/baselines/reference/submodule/conformance/anonymousClassAccessorsDeclarationEmit1.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,16 @@ export declare abstract class Base {
5151
accessor a: number;
5252
}
5353
export declare function middle(Super?: typeof Base): abstract new () => {
54-
a: number;
54+
get a(): number;
55+
set a(arg: number);
5556
};
5657
declare class A {
5758
constructor(...args: any[]);
5859
}
5960
export declare function Mixin<T extends typeof A>(Super: T): {
6061
new (...args: any[]): {
61-
myName: string;
62+
get myName(): string;
63+
set myName(arg: string);
6264
};
6365
} & T;
6466
export {};

testdata/baselines/reference/submodule/conformance/anonymousClassAccessorsDeclarationEmit1.js.diff

Lines changed: 0 additions & 21 deletions
This file was deleted.

testdata/baselines/reference/submodule/conformance/autoAccessor8.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ declare class C2 {
4545
}
4646
declare function f(): {
4747
new (): {
48-
a: any;
48+
get a(): any;
49+
set a(arg: any);
4950
};
50-
b: any;
51+
get b(): any;
52+
set b(arg: any);
5153
};

testdata/baselines/reference/submodule/conformance/autoAccessor8.js.diff

Lines changed: 0 additions & 14 deletions
This file was deleted.

testdata/baselines/reference/submodule/conformance/mixinAccessors1.errors.txt

Lines changed: 0 additions & 27 deletions
This file was deleted.

testdata/baselines/reference/submodule/conformance/mixinAccessors1.errors.txt.diff

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)