Skip to content

Commit 36a4dc1

Browse files
Andaristsnovader
authored andcommitted
Fixed display of optional and rest parameters created as result of combining union parameters (microsoft#55625)
1 parent 755f812 commit 36a4dc1

8 files changed

+141
-10
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13202,12 +13202,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1320213202
const paramSymbol = createSymbol(
1320313203
SymbolFlags.FunctionScopedVariable | (isOptional && !isRestParam ? SymbolFlags.Optional : 0),
1320413204
paramName || `arg${i}` as __String,
13205+
isRestParam ? CheckFlags.RestParameter : isOptional ? CheckFlags.OptionalParameter : 0,
1320513206
);
1320613207
paramSymbol.links.type = isRestParam ? createArrayType(unionParamType) : unionParamType;
1320713208
params[i] = paramSymbol;
1320813209
}
1320913210
if (needsExtraRestElement) {
13210-
const restParamSymbol = createSymbol(SymbolFlags.FunctionScopedVariable, "args" as __String);
13211+
const restParamSymbol = createSymbol(SymbolFlags.FunctionScopedVariable, "args" as __String, CheckFlags.RestParameter);
1321113212
restParamSymbol.links.type = createArrayType(getTypeAtPosition(shorter, longestCount));
1321213213
if (shorter === right) {
1321313214
restParamSymbol.links.type = instantiateType(restParamSymbol.links.type, mapper);

tests/baselines/reference/completionEntryForUnionMethod.baseline

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,25 @@
66
// | (method) Array<T>.concat(...items: ConcatArray<string | number>[]): (string | number)[] (+1 overload)
77
// | (method) Array<T>.every<S>(predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): this is S[] (+1 overload)
88
// | (method) Array<T>.filter<S>(predicate: (value: string | number, index: number, array: (string | number)[]) => value is S, thisArg?: any): S[] (+1 overload)
9-
// | (method) Array<T>.forEach(callbackfn: ((value: string, index: number, array: string[]) => void) & ((value: number, index: number, array: number[]) => void), thisArg: any): void
10-
// | (method) Array<T>.indexOf(searchElement: never, fromIndex: number): number
9+
// | (method) Array<T>.forEach(callbackfn: ((value: string, index: number, array: string[]) => void) & ((value: number, index: number, array: number[]) => void), thisArg?: any): void
10+
// | (method) Array<T>.indexOf(searchElement: never, fromIndex?: number): number
1111
// | (method) Array<T>.join(separator?: string): string
12-
// | (method) Array<T>.lastIndexOf(searchElement: never, fromIndex: number): number
12+
// | (method) Array<T>.lastIndexOf(searchElement: never, fromIndex?: number): number
1313
// | (property) Array<T>.length: number
14-
// | (method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg: any): unknown[]
14+
// | (method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg?: any): unknown[]
1515
// | (method) Array<T>.pop(): string | number
16-
// | (method) Array<T>.push(items: never[]): number
16+
// | (method) Array<T>.push(...items: never[]): number
1717
// | (method) Array<T>.reduce(callbackfn: (previousValue: string | number, currentValue: string | number, currentIndex: number, array: (string | number)[]) => string | number): string | number (+2 overloads)
1818
// | (method) Array<T>.reduceRight(callbackfn: (previousValue: string | number, currentValue: string | number, currentIndex: number, array: (string | number)[]) => string | number): string | number (+2 overloads)
1919
// | (method) Array<T>.reverse(): string[] | number[]
2020
// | (method) Array<T>.shift(): string | number
2121
// | (method) Array<T>.slice(start?: number, end?: number): string[] | number[]
22-
// | (method) Array<T>.some(predicate: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg: any): boolean
23-
// | (method) Array<T>.sort(compareFn: ((a: string, b: string) => number) & ((a: number, b: number) => number)): string[] | number[]
22+
// | (method) Array<T>.some(predicate: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg?: any): boolean
23+
// | (method) Array<T>.sort(compareFn?: ((a: string, b: string) => number) & ((a: number, b: number) => number)): string[] | number[]
2424
// | (method) Array<T>.splice(start: number, deleteCount?: number): string[] | number[] (+2 overloads)
2525
// | (method) Array<T>.toLocaleString(): string
2626
// | (method) Array<T>.toString(): string
27-
// | (method) Array<T>.unshift(items: never[]): number
27+
// | (method) Array<T>.unshift(...items: never[]): number
2828
// | ----------------------------------------------------------------------
2929

3030
[
@@ -1263,6 +1263,10 @@
12631263
"text": "thisArg",
12641264
"kind": "parameterName"
12651265
},
1266+
{
1267+
"text": "?",
1268+
"kind": "punctuation"
1269+
},
12661270
{
12671271
"text": ":",
12681272
"kind": "punctuation"
@@ -1413,6 +1417,10 @@
14131417
"text": "fromIndex",
14141418
"kind": "parameterName"
14151419
},
1420+
{
1421+
"text": "?",
1422+
"kind": "punctuation"
1423+
},
14161424
{
14171425
"text": ":",
14181426
"kind": "punctuation"
@@ -1676,6 +1684,10 @@
16761684
"text": "fromIndex",
16771685
"kind": "parameterName"
16781686
},
1687+
{
1688+
"text": "?",
1689+
"kind": "punctuation"
1690+
},
16791691
{
16801692
"text": ":",
16811693
"kind": "punctuation"
@@ -2120,6 +2132,10 @@
21202132
"text": "thisArg",
21212133
"kind": "parameterName"
21222134
},
2135+
{
2136+
"text": "?",
2137+
"kind": "punctuation"
2138+
},
21232139
{
21242140
"text": ":",
21252141
"kind": "punctuation"
@@ -2340,6 +2356,10 @@
23402356
"text": "(",
23412357
"kind": "punctuation"
23422358
},
2359+
{
2360+
"text": "...",
2361+
"kind": "punctuation"
2362+
},
23432363
{
23442364
"text": "items",
23452365
"kind": "parameterName"
@@ -3803,6 +3823,10 @@
38033823
"text": "thisArg",
38043824
"kind": "parameterName"
38053825
},
3826+
{
3827+
"text": "?",
3828+
"kind": "punctuation"
3829+
},
38063830
{
38073831
"text": ":",
38083832
"kind": "punctuation"
@@ -3929,6 +3953,10 @@
39293953
"text": "compareFn",
39303954
"kind": "parameterName"
39313955
},
3956+
{
3957+
"text": "?",
3958+
"kind": "punctuation"
3959+
},
39323960
{
39333961
"text": ":",
39343962
"kind": "punctuation"
@@ -4589,6 +4617,10 @@
45894617
"text": "(",
45904618
"kind": "punctuation"
45914619
},
4620+
{
4621+
"text": "...",
4622+
"kind": "punctuation"
4623+
},
45924624
{
45934625
"text": "items",
45944626
"kind": "parameterName"

tests/cases/fourslash/completionEntryForUnionMethod.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
////var y: Array<string>|Array<number>;
44
////y.map/**/(
55

6-
const text = "(method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg: any): unknown[]";
6+
const text = "(method) Array<T>.map<unknown>(callbackfn: ((value: string, index: number, array: string[]) => unknown) & ((value: number, index: number, array: number[]) => unknown), thisArg?: any): unknown[]";
77
const documentation = "Calls a defined callback function on each element of an array, and returns an array that contains the results.";
88

99
verify.quickInfoAt("", text, documentation);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
// https://github.com/microsoft/TypeScript/issues/55574
4+
5+
//// declare const optionals:
6+
//// | ((a?: { a: true }) => unknown)
7+
//// | ((b?: { b: true }) => unknown);
8+
////
9+
//// /**/optionals();
10+
11+
verify.quickInfoAt(
12+
"",
13+
`const optionals: (arg0?: {
14+
a: true;
15+
} & {
16+
b: true;
17+
}) => unknown`,
18+
);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
// based on https://github.com/microsoft/TypeScript/issues/55574
4+
5+
//// declare const rest:
6+
//// | ((v: { a: true }, ...rest: string[]) => unknown)
7+
//// | ((v: { b: true }) => unknown);
8+
////
9+
//// /**/rest({ a: true, b: true }, "foo", "bar");
10+
11+
verify.quickInfoAt(
12+
"",
13+
`const rest: (v: {
14+
a: true;
15+
} & {
16+
b: true;
17+
}, ...rest: string[]) => unknown`,
18+
);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
// https://github.com/microsoft/TypeScript/issues/55574
4+
5+
//// declare const rest:
6+
//// | ((a?: { a: true }, ...rest: string[]) => unknown)
7+
//// | ((b?: { b: true }) => unknown);
8+
////
9+
//// /**/rest({ a: true, b: true }, "foo", "bar");
10+
11+
verify.quickInfoAt(
12+
"",
13+
`const rest: (arg0?: {
14+
a: true;
15+
} & {
16+
b: true;
17+
}, ...rest: string[]) => unknown`,
18+
);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
//// declare const fn:
4+
//// | ((a: { x: number }, b: { x: number }) => number)
5+
//// | ((...a: { y: number }[]) => number);
6+
////
7+
//// /**/fn();
8+
9+
verify.quickInfoAt(
10+
"",
11+
`const fn: (a: {
12+
x: number;
13+
} & {
14+
y: number;
15+
}, b: {
16+
x: number;
17+
} & {
18+
y: number;
19+
}, ...args: {
20+
y: number;
21+
}[]) => number`,
22+
);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
//// declare const fn:
4+
//// | ((a?: { x: number }, b?: { x: number }) => number)
5+
//// | ((...a: { y: number }[]) => number);
6+
////
7+
//// /**/fn();
8+
9+
verify.quickInfoAt(
10+
"",
11+
`const fn: (a?: {
12+
x: number;
13+
} & {
14+
y: number;
15+
}, b?: {
16+
x: number;
17+
} & {
18+
y: number;
19+
}, ...args: {
20+
y: number;
21+
}[]) => number`,
22+
);

0 commit comments

Comments
 (0)