Skip to content

Commit a5c64bd

Browse files
authored
Fix multiple issues related to extreme symbol merging (#2755)
1 parent be25a2b commit a5c64bd

File tree

4 files changed

+43
-24
lines changed

4 files changed

+43
-24
lines changed

internal/checker/checker.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21484,7 +21484,7 @@ func (c *Checker) fillMissingTypeArguments(typeArguments []*Type, typeParameters
2148421484
return nil
2148521485
}
2148621486
numTypeArguments := len(typeArguments)
21487-
if isJavaScriptImplicitAny || (numTypeArguments >= minTypeArgumentCount && numTypeArguments < numTypeParameters) {
21487+
if isJavaScriptImplicitAny || numTypeArguments < numTypeParameters {
2148821488
result := make([]*Type, numTypeParameters)
2148921489
copy(result, typeArguments)
2149021490
// Map invalid forward references in default types to the error type
@@ -22771,10 +22771,10 @@ func (c *Checker) createNormalizedTupleType(target *Type, elementTypes []*Type)
2277122771
}
2277222772
if d.combinedFlags&ElementFlagsVariadic != 0 {
2277322773
for i, e := range elementTypes {
22774-
if d.elementInfos[i].flags&ElementFlagsVariadic != 0 && e.flags&(TypeFlagsNever|TypeFlagsUnion) != 0 {
22774+
if i < len(d.elementInfos) && d.elementInfos[i].flags&ElementFlagsVariadic != 0 && e.flags&(TypeFlagsNever|TypeFlagsUnion) != 0 {
2277522775
// Transform [A, ...(X | Y | Z)] into [A, ...X] | [A, ...Y] | [A, ...Z]
2277622776
checkTypes := core.MapIndex(elementTypes, func(t *Type, i int) *Type {
22777-
if d.elementInfos[i].flags&ElementFlagsVariadic != 0 {
22777+
if i < len(d.elementInfos) && d.elementInfos[i].flags&ElementFlagsVariadic != 0 {
2277822778
return t
2277922779
}
2278022780
return c.unknownType
@@ -22787,15 +22787,20 @@ func (c *Checker) createNormalizedTupleType(target *Type, elementTypes []*Type)
2278722787
}
2278822788
}
2278922789
}
22790-
// We have optional, rest, or variadic n that may need normalizing. Normalization ensures that all variadic
22791-
// n are generic and that the tuple type has one of the following layouts, disregarding variadic n:
22792-
// (1) Zero or more required n, followed by zero or more optional n, followed by zero or one rest element.
22793-
// (2) Zero or more required n, followed by a rest element, followed by zero or more required n.
22794-
// In either layout, zero or more generic variadic n may be present at any location.
22790+
// We have optional, rest, or variadic elements that may need normalizing. Normalization ensures that all variadic
22791+
// elements are generic and that the tuple type has one of the following layouts, disregarding variadic elements:
22792+
// (1) Zero or more required elements, followed by zero or more optional elements, followed by zero or one rest element.
22793+
// (2) Zero or more required elements, followed by a rest element, followed by zero or more required elements.
22794+
// In either layout, zero or more generic variadic elements may be present at any location.
22795+
// Note that the element types may contain an extra 'this' type argument that we want to ignore during normalization
22796+
// and then just append to the normalized element types.
2279522797
n := &TupleNormalizer{}
22796-
if !n.normalize(c, elementTypes, d.elementInfos) {
22798+
if !n.normalize(c, elementTypes[:len(d.elementInfos)], d.elementInfos) {
2279722799
return c.errorType
2279822800
}
22801+
if len(elementTypes) > len(d.elementInfos) {
22802+
n.types = append(n.types, elementTypes[len(d.elementInfos)])
22803+
}
2279922804
tupleTarget := c.getTupleTargetType(n.infos, d.readonly)
2280022805
switch {
2280122806
case tupleTarget == c.emptyGenericType:
@@ -23515,7 +23520,6 @@ func (c *Checker) evaluateEntity(expr *ast.Node, location *ast.Node) evaluator.R
2351523520
name := expr.AsElementAccessExpression().ArgumentExpression.Text()
2351623521
member := rootSymbol.Exports[name]
2351723522
if member != nil {
23518-
debug.Assert(ast.GetSourceFileOfNode(member.ValueDeclaration) == ast.GetSourceFileOfNode(rootSymbol.ValueDeclaration))
2351923523
if location != nil {
2352023524
return c.evaluateEnumMember(expr, member, location)
2352123525
}

internal/parser/parser.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ func (p *Parser) parseExpectedMatchingBrackets(openKind ast.Kind, closeKind ast.
863863
return
864864
}
865865
if lastError != nil {
866-
related := ast.NewDiagnostic(nil, core.NewTextRange(openPosition, openPosition+1), diagnostics.The_parser_expected_to_find_a_1_to_match_the_0_token_here, scanner.TokenToString(openKind), scanner.TokenToString(closeKind))
866+
related := ast.NewDiagnostic(nil, core.NewTextRange(openPosition, openPosition), diagnostics.The_parser_expected_to_find_a_1_to_match_the_0_token_here, scanner.TokenToString(openKind), scanner.TokenToString(closeKind))
867867
lastError.AddRelatedInfo(related)
868868
}
869869
}
@@ -2925,7 +2925,7 @@ func (p *Parser) parseImportType() *ast.Node {
29252925
if len(p.diagnostics) != 0 {
29262926
lastDiagnostic := p.diagnostics[len(p.diagnostics)-1]
29272927
if lastDiagnostic.Code() == diagnostics.X_0_expected.Code() {
2928-
related := ast.NewDiagnostic(nil, core.NewTextRange(openBracePosition, openBracePosition+1), diagnostics.The_parser_expected_to_find_a_1_to_match_the_0_token_here, "{", "}")
2928+
related := ast.NewDiagnostic(nil, core.NewTextRange(openBracePosition, openBracePosition), diagnostics.The_parser_expected_to_find_a_1_to_match_the_0_token_here, "{", "}")
29292929
lastDiagnostic.AddRelatedInfo(related)
29302930
}
29312931
}
@@ -2972,7 +2972,7 @@ func (p *Parser) parseImportAttributes(token ast.Kind, skipKeyword bool) *ast.No
29722972
if len(p.diagnostics) != 0 {
29732973
lastDiagnostic := p.diagnostics[len(p.diagnostics)-1]
29742974
if lastDiagnostic.Code() == diagnostics.X_0_expected.Code() {
2975-
related := ast.NewDiagnostic(nil, core.NewTextRange(openBracePosition, openBracePosition+1), diagnostics.The_parser_expected_to_find_a_1_to_match_the_0_token_here, "{", "}")
2975+
related := ast.NewDiagnostic(nil, core.NewTextRange(openBracePosition, openBracePosition), diagnostics.The_parser_expected_to_find_a_1_to_match_the_0_token_here, "{", "}")
29762976
lastDiagnostic.AddRelatedInfo(related)
29772977
}
29782978
}

testdata/baselines/reference/submodule/conformance/instantiationExpressions.types

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ function f1() {
1818
>f1 : () => void
1919

2020
let f0 = fx<>; // Error
21-
>f0 : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
22-
>fx<> : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
21+
>f0 : { (x: unknown): unknown; (x: unknown, n: number): unknown; (t: [unknown, unknown]): [unknown, unknown]; }
22+
>fx<> : { (x: unknown): unknown; (x: unknown, n: number): unknown; (t: [unknown, unknown]): [unknown, unknown]; }
2323
>fx : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
2424

2525
let f1 = fx<string>; // { (x: string): string; (x: string, n: number): string; }
@@ -39,7 +39,7 @@ function f1() {
3939
}
4040

4141
type T10 = typeof fx<>; // Error
42-
>T10 : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
42+
>T10 : { (x: unknown): unknown; (x: unknown, n: number): unknown; (t: [unknown, unknown]): [unknown, unknown]; }
4343
>fx : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
4444

4545
type T11 = typeof fx<string>; // { (x: string): string; (x: string, n: number): string; }
@@ -58,8 +58,8 @@ function f2() {
5858
>f2 : () => void
5959

6060
const A0 = Array<>; // Error
61-
>A0 : { <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
62-
>Array<> : { <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
61+
>A0 : { (arrayLength: number): unknown[]; (...items: unknown[]): unknown[]; new (arrayLength: number): unknown[]; new (...items: unknown[]): unknown[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
62+
>Array<> : { (arrayLength: number): unknown[]; (...items: unknown[]): unknown[]; new (arrayLength: number): unknown[]; new (...items: unknown[]): unknown[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
6363
>Array : ArrayConstructor
6464

6565
const A1 = Array<string>; // new (...) => string[]
@@ -74,7 +74,7 @@ function f2() {
7474
}
7575

7676
type T20 = typeof Array<>; // Error
77-
>T20 : { <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
77+
>T20 : { (arrayLength: number): unknown[]; (...items: unknown[]): unknown[]; new (arrayLength: number): unknown[]; new (...items: unknown[]): unknown[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
7878
>Array : ArrayConstructor
7979

8080
type T21 = typeof Array<string>; // new (...) => string[]

testdata/baselines/reference/submodule/conformance/instantiationExpressions.types.diff

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,22 @@
2020
>t : [T, U]
2121

2222
function f1() {
23-
@@= skipped -41, +41 lines =@@
23+
>f1 : () => void
24+
25+
let f0 = fx<>; // Error
26+
->f0 : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
27+
->fx<> : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
28+
+>f0 : { (x: unknown): unknown; (x: unknown, n: number): unknown; (t: [unknown, unknown]): [unknown, unknown]; }
29+
+>fx<> : { (x: unknown): unknown; (x: unknown, n: number): unknown; (t: [unknown, unknown]): [unknown, unknown]; }
30+
>fx : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
31+
32+
let f1 = fx<string>; // { (x: string): string; (x: string, n: number): string; }
33+
@@= skipped -37, +37 lines =@@
34+
}
35+
36+
type T10 = typeof fx<>; // Error
37+
->T10 : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
38+
+>T10 : { (x: unknown): unknown; (x: unknown, n: number): unknown; (t: [unknown, unknown]): [unknown, unknown]; }
2439
>fx : { <T>(x: T): T; <T>(x: T, n: number): T; <T, U>(t: [T, U]): [T, U]; }
2540

2641
type T11 = typeof fx<string>; // { (x: string): string; (x: string, n: number): string; }
@@ -44,8 +59,8 @@
4459
const A0 = Array<>; // Error
4560
->A0 : ArrayConstructor
4661
->Array<> : ArrayConstructor
47-
+>A0 : { <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
48-
+>Array<> : { <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
62+
+>A0 : { (arrayLength: number): unknown[]; (...items: unknown[]): unknown[]; new (arrayLength: number): unknown[]; new (...items: unknown[]): unknown[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
63+
+>Array<> : { (arrayLength: number): unknown[]; (...items: unknown[]): unknown[]; new (arrayLength: number): unknown[]; new (...items: unknown[]): unknown[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
4964
>Array : ArrayConstructor
5065

5166
const A1 = Array<string>; // new (...) => string[]
@@ -65,7 +80,7 @@
6580

6681
type T20 = typeof Array<>; // Error
6782
->T20 : ArrayConstructor
68-
+>T20 : { <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
83+
+>T20 : { (arrayLength: number): unknown[]; (...items: unknown[]): unknown[]; new (arrayLength: number): unknown[]; new (...items: unknown[]): unknown[]; isArray(arg: any): arg is any[]; readonly prototype: any[]; from<T>(arrayLike: ArrayLike<T>): T[]; from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; from<T>(iterable: ArrayLike<T> | Iterable<T>): T[]; from<T, U>(iterable: ArrayLike<T> | Iterable<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[]; of<T>(...items: T[]): T[]; readonly [Symbol.species]: ArrayConstructor; }
6984
>Array : ArrayConstructor
7085

7186
type T21 = typeof Array<string>; // new (...) => string[]
@@ -79,7 +94,7 @@
7994
>Array : ArrayConstructor
8095

8196
declare class C<T> {
82-
@@= skipped -133, +133 lines =@@
97+
@@= skipped -137, +137 lines =@@
8398
}
8499

85100
function f15(f: { new <T>(a: T): T, <U>(a: U, b: number): U[] }) {

0 commit comments

Comments
 (0)