Skip to content

Commit dc8aa08

Browse files
committed
Keep optional signature state out of hot records
Most signatures have no type parameters, explicit this parameter, predicate, composite constituents, or isolated-type cache. Reserving this state for every instantiated signature wastes memory and GC scanning. Negative predicate results need no pointer at all. Signature shrinks from 128 to 80 bytes on amd64. Checker-owned cold storage preserves slice aliasing and independent clone caches; a private, non-propagating flag retains the recursive no-predicate guard. A full VS Code field census found 648637 signatures and only 84956 requiring cold storage (13.1%). Six fresh-process interleaved comparisons against the parent commit, with normal GC, save 0.65% retained bytes, 0.73% scan bytes, and 0.49% allocated bytes. Allocation events and instructions are not statistically different. This is incremental, not a CPU breakthrough. Production diagnostics and semantic counts match exactly. goos: linux goarch: amd64 pkg: github.com/microsoft/TypeScript/tsc/internal/checker cpu: Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz │ vscode-signature-before.txt │ vscode-signature.txt │ │ retained-B │ retained-B vs base │ ExternalProgram-20 3.848Gi ± 0% 3.823Gi ± 0% -0.65% (p=0.002 n=6) │ vscode-signature-before.txt │ vscode-signature.txt │ │ scan-B │ scan-B vs base │ ExternalProgram-20 3.443Gi ± 0% 3.418Gi ± 0% -0.73% (p=0.002 n=6) │ vscode-signature-before.txt │ vscode-signature.txt │ │ B/op │ B/op vs base │ ExternalProgram-20 5.468Gi ± 0% 5.441Gi ± 0% -0.49% (p=0.002 n=6) │ vscode-signature-before.txt │ vscode-signature.txt │ │ allocs/op │ allocs/op vs base │ ExternalProgram-20 27.36M ± 0% 27.36M ± 0% ~ (p=0.589 n=6) │ signature-before-instructions.txt │ signature-instructions.txt │ │ instructions/op │ instructions/op vs base │ ExternalInstructions-20 297.9G ± 3% 296.1G ± 3% ~ (p=0.699 n=6)
1 parent ec7b1ea commit dc8aa08

11 files changed

Lines changed: 295 additions & 143 deletions

File tree

‎tsc/internal/checker/checker.go‎

Lines changed: 92 additions & 91 deletions
Large diffs are not rendered by default.

‎tsc/internal/checker/flow.go‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,7 +2071,7 @@ func (c *Checker) getEffectsSignature(node *ast.Node) *Signature {
20712071
}
20722072
signatures := c.getSignaturesOfType(core.OrElse(apparentType, c.unknownType), SignatureKindCall)
20732073
switch {
2074-
case len(signatures) == 1 && len(signatures[0].typeParameters) == 0:
2074+
case len(signatures) == 1 && len(signatures[0].TypeParameters()) == 0:
20752075
signature = signatures[0]
20762076
case core.Some(signatures, c.hasTypePredicateOrNeverReturnType):
20772077
signature = c.getResolvedSignature(node, nil, CheckModeNormal)
@@ -2216,8 +2216,8 @@ func (c *Checker) getExplicitThisType(node *ast.Node) *Type {
22162216
container := ast.GetThisContainer(node, false /*includeArrowFunctions*/, false /*includeClassComputedPropertyName*/)
22172217
if ast.IsFunctionLike(container) {
22182218
signature := c.getSignatureFromDeclaration(container)
2219-
if signature.thisParameter != nil {
2220-
return c.getExplicitTypeOfSymbol(signature.thisParameter, nil)
2219+
if signature.ThisParameter() != nil {
2220+
return c.getExplicitTypeOfSymbol(signature.ThisParameter(), nil)
22212221
}
22222222
}
22232223
if container.Parent != nil && ast.IsClassLike(container.Parent) {

‎tsc/internal/checker/jsx.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -987,14 +987,14 @@ func (c *Checker) getJsxPropsTypeFromClassType(sig *Signature, context *ast.Node
987987
}
988988

989989
func (c *Checker) getJsxPropsTypeForSignatureFromMember(sig *Signature, forcedLookupLocation string) *Type {
990-
if sig.composite != nil {
990+
if sig.getComposite() != nil {
991991
// JSX Elements using the legacy `props`-field based lookup (eg, react class components) need to treat the `props` member as an input
992992
// instead of an output position when resolving the signature. We need to go back to the input signatures of the composite signature,
993993
// get the type of `props` on each return type individually, and then _intersect them_, rather than union them (as would normally occur
994994
// for a union signature). It's an unfortunate quirk of looking in the output of the signature for the type we want to use for the input.
995995
// The default behavior of `getTypeOfFirstParameterOfSignatureWithFallback` when no `props` member name is defined is much more sane.
996996
var results []*Type
997-
for _, signature := range sig.composite.signatures {
997+
for _, signature := range sig.getComposite().signatures {
998998
instance := c.getReturnTypeOfSignature(signature)
999999
if IsTypeAny(instance) {
10001000
return instance

‎tsc/internal/checker/nodebuilderimpl.go‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,12 +1882,12 @@ func (b *NodeBuilderImpl) signatureToSignatureDeclarationHelper(signature *Signa
18821882
b.ctx.approximateLength += 3
18831883
// Usually a signature contributes a few more characters than this, but 3 is the minimum
18841884

1885-
if b.ctx.flags&nodebuilder.FlagsWriteTypeArgumentsOfSignature != 0 && signature.target != nil && signature.mapper != nil && len(signature.target.typeParameters) != 0 {
1886-
for _, parameter := range signature.target.typeParameters {
1885+
if b.ctx.flags&nodebuilder.FlagsWriteTypeArgumentsOfSignature != 0 && signature.target != nil && signature.mapper != nil && len(signature.target.TypeParameters()) != 0 {
1886+
for _, parameter := range signature.target.TypeParameters() {
18871887
typeParameters = append(typeParameters, b.typeToTypeNode(b.ch.instantiateType(parameter, signature.mapper)))
18881888
}
18891889
} else {
1890-
for _, parameter := range signature.typeParameters {
1890+
for _, parameter := range signature.TypeParameters() {
18911891
typeParameters = append(typeParameters, b.typeParameterToDeclaration(parameter))
18921892
}
18931893
}
@@ -2084,8 +2084,8 @@ func (c *Checker) getExpandedParameters(sig *Signature, skipUnionExpanding bool)
20842084
}
20852085

20862086
func (b *NodeBuilderImpl) tryGetThisParameterDeclaration(signature *Signature) *ast.Node {
2087-
if signature.thisParameter != nil {
2088-
return b.symbolToParameterDeclaration(signature.thisParameter, false)
2087+
if signature.ThisParameter() != nil {
2088+
return b.symbolToParameterDeclaration(signature.ThisParameter(), false)
20892089
}
20902090
if signature.declaration != nil && ast.IsInJSFile(signature.declaration) {
20912091
// !!! JSDoc Support

‎tsc/internal/checker/nodebuilderscopes.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (b *NodeBuilderImpl) addSymbolTypeToContext(symbol *ast.Symbol, t *Type) fu
5252

5353
func (b *NodeBuilderImpl) enterSignatureScope(signature *Signature) (expandedParams []*ast.Symbol, cleanup func()) {
5454
expandedParams = b.ch.getExpandedParameters(signature, true /*skipUnionExpanding*/)[0]
55-
cleanup = b.enterNewScope(signature.declaration, expandedParams, signature.typeParameters, signature.parameters, signature.mapper)
55+
cleanup = b.enterNewScope(signature.declaration, expandedParams, signature.TypeParameters(), signature.parameters, signature.mapper)
5656
return expandedParams, cleanup
5757
}
5858

‎tsc/internal/checker/nodecopy.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ func getExistingNodeTreeVisitor(b *NodeBuilderImpl, bound *recoveryBoundary) *as
842842
if ast.IsFunctionLike(node) {
843843
sig := b.ch.getSignatureFromDeclaration(node)
844844
params = sig.parameters
845-
typeParams = sig.typeParameters
845+
typeParams = sig.TypeParameters()
846846
} else if ast.IsConditionalTypeNode(node) { // !!! TODO: impossible in combination with the scope start check???
847847
typeParams = b.ch.getInferTypeParameters(node)
848848
} else if ast.IsMappedTypeNode(node) {

‎tsc/internal/checker/pseudotypenodebuilder.go‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ func (b *NodeBuilderImpl) pseudoTypeToNode(t *pseudochecker.PseudoType) *ast.Nod
178178
d := t.AsPseudoTypeSingleCallSignature()
179179
signature := b.ch.getSignatureFromDeclaration(d.Signature)
180180
expandedParams := b.ch.getExpandedParameters(signature, true /*skipUnionExpanding*/)[0]
181-
cleanup := b.enterNewScope(d.Signature, expandedParams, signature.typeParameters, signature.parameters, signature.mapper)
181+
cleanup := b.enterNewScope(d.Signature, expandedParams, signature.TypeParameters(), signature.parameters, signature.mapper)
182182
defer cleanup()
183183
var typeParams *ast.NodeList
184184
if len(d.TypeParameters) > 0 {
@@ -233,7 +233,7 @@ func (b *NodeBuilderImpl) pseudoTypeToNode(t *pseudochecker.PseudoType) *ast.Nod
233233
if e.Kind != pseudochecker.PseudoObjectElementKindPropertyAssignment {
234234
signature := b.ch.getSignatureFromDeclaration(e.Signature())
235235
expandedParams := b.ch.getExpandedParameters(signature, true /*skipUnionExpanding*/)[0]
236-
cleanup = b.enterNewScope(e.Signature(), expandedParams, signature.typeParameters, signature.parameters, signature.mapper)
236+
cleanup = b.enterNewScope(e.Signature(), expandedParams, signature.TypeParameters(), signature.parameters, signature.mapper)
237237
}
238238
var newProp *ast.Node
239239
switch e.Kind {
@@ -549,7 +549,7 @@ func (b *NodeBuilderImpl) pseudoTypeEquivalentToType(t *pseudochecker.PseudoType
549549
return false
550550
}
551551
pt := t.AsPseudoTypeSingleCallSignature()
552-
if len(targetSig.typeParameters) != len(pt.TypeParameters) {
552+
if len(targetSig.TypeParameters()) != len(pt.TypeParameters) {
553553
if reportErrors {
554554
b.ctx.tracker.ReportInferenceFallback(pt.Signature)
555555
}
@@ -583,13 +583,13 @@ func (b *NodeBuilderImpl) pseudoTypeEquivalentToType(t *pseudochecker.PseudoType
583583
}
584584

585585
func (b *NodeBuilderImpl) pseudoParametersEquivalentToParameters(params []*pseudochecker.PseudoParameter, targetSig *Signature, reportErrors bool, nonParamErrorLocation *ast.Node) bool {
586-
if targetSig.thisParameter != nil && len(params) == 0 {
586+
if targetSig.ThisParameter() != nil && len(params) == 0 {
587587
if reportErrors {
588588
b.ctx.tracker.ReportInferenceFallback(nonParamErrorLocation) // missing `this` param
589589
}
590590
return false
591-
} else if targetSig.thisParameter != nil && ast.IsThisIdentifier(params[0].Name) {
592-
targetParam := targetSig.thisParameter
591+
} else if targetSig.ThisParameter() != nil && ast.IsThisIdentifier(params[0].Name) {
592+
targetParam := targetSig.ThisParameter()
593593
paramType := b.ch.getTypeOfParameter(targetParam)
594594
if !b.pseudoTypeEquivalentToType(params[0].Type, paramType, params[0].Optional, false) {
595595
if reportErrors {
@@ -598,7 +598,7 @@ func (b *NodeBuilderImpl) pseudoParametersEquivalentToParameters(params []*pseud
598598
return false
599599
}
600600
params = params[1:]
601-
} else if targetSig.thisParameter != nil {
601+
} else if targetSig.ThisParameter() != nil {
602602
if reportErrors {
603603
b.ctx.tracker.ReportInferenceFallback(nonParamErrorLocation)
604604
}

‎tsc/internal/checker/relater.go‎

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,7 +1515,7 @@ func (c *Checker) compareSignaturesRelated(source *Signature, target *Signature,
15151515
}
15161516
return TernaryFalse
15171517
}
1518-
if len(source.typeParameters) != 0 && !core.Same(source.typeParameters, target.typeParameters) {
1518+
if len(source.TypeParameters()) != 0 && !core.Same(source.TypeParameters(), target.TypeParameters()) {
15191519
target = c.getCanonicalSignature(target)
15201520
source = c.instantiateSignatureInContextOf(source, target /*inferenceContext*/, nil, compareTypes)
15211521
}
@@ -1706,7 +1706,7 @@ func (c *Checker) compareTypePredicateRelatedTo(source *TypePredicate, target *T
17061706

17071707
// Returns true if `s` is `(...args: A) => R` where `A` is `any`, `any[]`, `never`, or `never[]`, and `R` is `any` or `unknown`.
17081708
func (c *Checker) isTopSignature(s *Signature) bool {
1709-
if len(s.typeParameters) == 0 && (s.thisParameter == nil || IsTypeAny(c.getTypeOfParameter(s.thisParameter))) && len(s.parameters) == 1 && signatureHasRestParameter(s) {
1709+
if len(s.TypeParameters()) == 0 && (s.ThisParameter() == nil || IsTypeAny(c.getTypeOfParameter(s.ThisParameter()))) && len(s.parameters) == 1 && signatureHasRestParameter(s) {
17101710
paramType := c.getTypeOfParameter(s.parameters[0])
17111711
var restType *Type
17121712
if c.isArrayType(paramType) {
@@ -1945,8 +1945,8 @@ func (c *Checker) getRestArrayTypeOfTupleType(t *Type) *Type {
19451945
}
19461946

19471947
func (c *Checker) getThisTypeOfSignature(signature *Signature) *Type {
1948-
if signature.thisParameter != nil {
1949-
return c.getTypeOfSymbol(signature.thisParameter)
1948+
if signature.ThisParameter() != nil {
1949+
return c.getTypeOfSymbol(signature.ThisParameter())
19501950
}
19511951
return nil
19521952
}
@@ -2047,37 +2047,38 @@ func (c *Checker) getTupleElementLabelFromBindingElement(node *ast.Node, index i
20472047
}
20482048

20492049
func (c *Checker) getTypePredicateOfSignature(sig *Signature) *TypePredicate {
2050-
if sig.resolvedTypePredicate == nil {
2050+
if sig.getResolvedTypePredicate(c) == nil {
20512051
switch {
20522052
case sig.target != nil:
20532053
targetTypePredicate := c.getTypePredicateOfSignature(sig.target)
20542054
if targetTypePredicate != nil {
2055-
sig.resolvedTypePredicate = c.instantiateTypePredicate(targetTypePredicate, sig.mapper)
2055+
sig.setResolvedTypePredicate(c, c.instantiateTypePredicate(targetTypePredicate, sig.mapper))
20562056
}
2057-
case sig.composite != nil:
2058-
sig.resolvedTypePredicate = c.getUnionOrIntersectionTypePredicate(sig.composite.signatures, sig.composite.isUnion)
2057+
case sig.getComposite() != nil:
2058+
sig.setResolvedTypePredicate(c, c.getUnionOrIntersectionTypePredicate(sig.getComposite().signatures, sig.getComposite().isUnion))
20592059
default:
20602060
if sig.declaration != nil {
20612061
typeNode := sig.declaration.Type()
20622062
switch {
20632063
case typeNode != nil:
20642064
if ast.IsTypePredicateNode(typeNode) {
2065-
sig.resolvedTypePredicate = c.createTypePredicateFromTypePredicateNode(typeNode, sig)
2065+
sig.setResolvedTypePredicate(c, c.createTypePredicateFromTypePredicateNode(typeNode, sig))
20662066
}
20672067
case ast.IsFunctionLikeDeclaration(sig.declaration) && (sig.resolvedReturnType == nil || sig.resolvedReturnType.flags&TypeFlagsBoolean != 0) && c.getParameterCount(sig) > 0:
2068-
sig.resolvedTypePredicate = c.noTypePredicate // avoid infinite loop
2069-
sig.resolvedTypePredicate = c.getTypePredicateFromBody(sig.declaration)
2068+
sig.setResolvedTypePredicate(c, c.noTypePredicate) // avoid infinite loop
2069+
sig.setResolvedTypePredicate(c, c.getTypePredicateFromBody(sig.declaration))
20702070
}
20712071
}
20722072
}
2073-
if sig.resolvedTypePredicate == nil {
2074-
sig.resolvedTypePredicate = c.noTypePredicate
2073+
if sig.getResolvedTypePredicate(c) == nil {
2074+
sig.setResolvedTypePredicate(c, c.noTypePredicate)
20752075
}
20762076
}
2077-
if sig.resolvedTypePredicate == c.noTypePredicate {
2077+
predicate := sig.getResolvedTypePredicate(c)
2078+
if predicate == c.noTypePredicate {
20782079
return nil
20792080
}
2080-
return sig.resolvedTypePredicate
2081+
return predicate
20812082
}
20822083

20832084
func (c *Checker) getUnionOrIntersectionTypePredicate(signatures []*Signature, isUnion bool) *TypePredicate {
@@ -2143,14 +2144,14 @@ func (c *Checker) newTypePredicate(kind TypePredicateKind, parameterName string,
21432144
}
21442145

21452146
func (c *Checker) isResolvingReturnTypeOfSignature(signature *Signature) bool {
2146-
if signature.composite != nil && core.Some(signature.composite.signatures, c.isResolvingReturnTypeOfSignature) {
2147+
if signature.getComposite() != nil && core.Some(signature.getComposite().signatures, c.isResolvingReturnTypeOfSignature) {
21472148
return true
21482149
}
21492150
return signature.resolvedReturnType == nil && c.findResolutionCycleStartIndex(signature, TypeSystemPropertyNameResolvedReturnType) >= 0
21502151
}
21512152

21522153
func (c *Checker) findMatchingSignatures(signatureLists [][]*Signature, signature *Signature, listIndex int) []*Signature {
2153-
if len(signature.typeParameters) != 0 {
2154+
if len(signature.TypeParameters()) != 0 {
21542155
// We require an exact match for generic signatures, so we only return signatures from the first
21552156
// signature list and only if they have exact matches in the other signature lists.
21562157
if listIndex > 0 {
@@ -2205,16 +2206,16 @@ func (c *Checker) compareSignaturesIdentical(source *Signature, target *Signatur
22052206
return TernaryFalse
22062207
}
22072208
// Check that the two signatures have the same number of type parameters.
2208-
if len(source.typeParameters) != len(target.typeParameters) {
2209+
if len(source.TypeParameters()) != len(target.TypeParameters()) {
22092210
return TernaryFalse
22102211
}
22112212
// Check that type parameter constraints and defaults match. If they do, instantiate the source
22122213
// signature with the type parameters of the target signature and continue the comparison.
2213-
if len(target.typeParameters) != 0 {
2214-
mapper := newTypeMapper(source.typeParameters, target.typeParameters)
2215-
for i := range len(target.typeParameters) {
2216-
s := source.typeParameters[i]
2217-
t := target.typeParameters[i]
2214+
if len(target.TypeParameters()) != 0 {
2215+
mapper := newTypeMapper(source.TypeParameters(), target.TypeParameters())
2216+
for i := range len(target.TypeParameters()) {
2217+
s := source.TypeParameters()[i]
2218+
t := target.TypeParameters()[i]
22182219
if !(s == t || compareTypes(c.instantiateType(c.getConstraintOrUnknownFromTypeParameter(s), mapper), c.getConstraintOrUnknownFromTypeParameter(t)) != TernaryFalse &&
22192220
compareTypes(c.instantiateType(c.getDefaultOrUnknownFromTypeParameter(s), mapper), c.getDefaultOrUnknownFromTypeParameter(t)) != TernaryFalse) {
22202221
return TernaryFalse

‎tsc/internal/checker/services.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -726,10 +726,10 @@ func (c *Checker) getUninstantiatedSignatures(node *ast.Node) []*Signature {
726726
func (c *Checker) getTypeParameterConstraintForPositionAcrossSignatures(signatures []*Signature, position int) *Type {
727727
var relevantConstraints []*Type
728728
for _, signature := range signatures {
729-
if position >= len(signature.typeParameters) {
729+
if position >= len(signature.TypeParameters()) {
730730
continue
731731
}
732-
relevantTypeParameter := signature.typeParameters[position]
732+
relevantTypeParameter := signature.TypeParameters()[position]
733733
relevantConstraint := c.getConstraintOfTypeParameter(relevantTypeParameter)
734734
if relevantConstraint != nil {
735735
relevantConstraints = append(relevantConstraints, relevantConstraint)

‎tsc/internal/checker/types.go‎

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,6 +1510,7 @@ const (
15101510
SignatureFlagsIsUntypedSignatureInJSFile SignatureFlags = 1 << 6 // Indicates signature is from a js file and has no types
15111511
SignatureFlagsIsNonInferrable SignatureFlags = 1 << 7 // Indicates signature comes from a non-inferrable type
15121512
SignatureFlagsIsSignatureCandidateForOverloadFailure SignatureFlags = 1 << 8
1513+
signatureFlagsNoTypePredicate SignatureFlags = 1 << 9
15131514
// We do not propagate `IsInnerCallChain` or `IsOuterCallChain` to instantiated signatures, as that would result in us
15141515
// attempting to add `| undefined` on each recursive call to `getReturnTypeOfSignature` when
15151516
// instantiating the return type.
@@ -1525,27 +1526,94 @@ type Signature struct {
15251526
minArgumentCount int32
15261527
resolvedMinArgumentCount int32
15271528
declaration *ast.Node
1528-
typeParameters []*Type
15291529
parameters []*ast.Symbol
1530-
thisParameter *ast.Symbol
15311530
resolvedReturnType *Type
1532-
resolvedTypePredicate *TypePredicate
15331531
target *Signature
15341532
mapper *TypeMapper
1535-
isolatedSignatureType *Type
1536-
composite *CompositeSignature
1533+
extra *signatureExtra
1534+
}
1535+
1536+
type signatureExtra struct {
1537+
typeParameters []*Type
1538+
thisParameter *ast.Symbol
1539+
resolvedTypePredicate *TypePredicate
1540+
isolatedSignatureType *Type
1541+
composite *CompositeSignature
1542+
}
1543+
1544+
func (s *Signature) ensureExtra(c *Checker) *signatureExtra {
1545+
if s.extra == nil {
1546+
s.extra = c.signatureExtraArena.New()
1547+
}
1548+
return s.extra
1549+
}
1550+
1551+
func (s *Signature) setTypeParameters(c *Checker, types []*Type) {
1552+
if types != nil || s.extra != nil {
1553+
s.ensureExtra(c).typeParameters = types
1554+
}
1555+
}
1556+
1557+
func (s *Signature) setThisParameter(c *Checker, parameter *ast.Symbol) {
1558+
if parameter != nil || s.extra != nil {
1559+
s.ensureExtra(c).thisParameter = parameter
1560+
}
1561+
}
1562+
1563+
func (s *Signature) getResolvedTypePredicate(c *Checker) *TypePredicate {
1564+
if s.flags&signatureFlagsNoTypePredicate != 0 {
1565+
return c.noTypePredicate
1566+
}
1567+
if s.extra == nil {
1568+
return nil
1569+
}
1570+
return s.extra.resolvedTypePredicate
1571+
}
1572+
1573+
func (s *Signature) setResolvedTypePredicate(c *Checker, predicate *TypePredicate) {
1574+
s.flags &^= signatureFlagsNoTypePredicate
1575+
if predicate != nil && predicate == c.noTypePredicate {
1576+
s.flags |= signatureFlagsNoTypePredicate
1577+
predicate = nil
1578+
}
1579+
if predicate != nil || s.extra != nil {
1580+
s.ensureExtra(c).resolvedTypePredicate = predicate
1581+
}
1582+
}
1583+
1584+
func (s *Signature) getComposite() *CompositeSignature {
1585+
if s.extra == nil {
1586+
return nil
1587+
}
1588+
return s.extra.composite
1589+
}
1590+
1591+
func (s *Signature) setComposite(c *Checker, composite *CompositeSignature) {
1592+
if composite != nil || s.extra != nil {
1593+
s.ensureExtra(c).composite = composite
1594+
}
1595+
}
1596+
1597+
func (s *Signature) getIsolatedSignatureType() *Type {
1598+
if s.extra == nil {
1599+
return nil
1600+
}
1601+
return s.extra.isolatedSignatureType
15371602
}
15381603

15391604
func (s *Signature) Id() SignatureId {
15401605
return s.id
15411606
}
15421607

15431608
func (s *Signature) Flags() SignatureFlags {
1544-
return s.flags
1609+
return s.flags &^ signatureFlagsNoTypePredicate
15451610
}
15461611

15471612
func (s *Signature) TypeParameters() []*Type {
1548-
return s.typeParameters
1613+
if s.extra == nil {
1614+
return nil
1615+
}
1616+
return s.extra.typeParameters
15491617
}
15501618

15511619
func (s *Signature) Declaration() *ast.Node {
@@ -1557,7 +1625,10 @@ func (s *Signature) Target() *Signature {
15571625
}
15581626

15591627
func (s *Signature) ThisParameter() *ast.Symbol {
1560-
return s.thisParameter
1628+
if s.extra == nil {
1629+
return nil
1630+
}
1631+
return s.extra.thisParameter
15611632
}
15621633

15631634
func (s *Signature) Parameters() []*ast.Symbol {

0 commit comments

Comments
 (0)