Skip to content

Commit 2c91932

Browse files
authored
Fix addUndefinedForParameter check location (#1606)
1 parent 5d54ac8 commit 2c91932

9 files changed

+30
-96
lines changed

internal/checker/nodebuilderimpl.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2004,11 +2004,12 @@ func (b *nodeBuilderImpl) serializeTypeForDeclaration(declaration *ast.Declarati
20042004
t = b.ch.errorType
20052005
}
20062006
}
2007-
// !!! TODO: JSDoc, getEmitResolver call is unfortunate layering for the helper - hoist it into checker
2008-
addUndefinedForParameter := declaration != nil && (ast.IsParameter(declaration) /*|| ast.IsJSDocParameterTag(declaration)*/) && b.ch.GetEmitResolver().requiresAddingImplicitUndefined(declaration, symbol, b.ctx.enclosingDeclaration)
2009-
if addUndefinedForParameter {
2010-
t = b.ch.getOptionalType(t, false)
2011-
}
2007+
}
2008+
2009+
// !!! TODO: JSDoc, getEmitResolver call is unfortunate layering for the helper - hoist it into checker
2010+
addUndefinedForParameter := declaration != nil && (ast.IsParameter(declaration) /*|| ast.IsJSDocParameterTag(declaration)*/) && b.ch.GetEmitResolver().requiresAddingImplicitUndefined(declaration, symbol, b.ctx.enclosingDeclaration)
2011+
if addUndefinedForParameter {
2012+
t = b.ch.getOptionalType(t, false)
20122013
}
20132014

20142015
restoreFlags := b.saveRestoreFlags()

testdata/baselines/reference/submodule/compiler/defaultParameterAddsUndefinedWithStrictNullChecks.types

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function f(addUndefined1 = "J", addUndefined2?: number) {
1818
>0 : 0
1919
}
2020
function g(addUndefined = "J", addDefined: number) {
21-
>g : (addUndefined: string, addDefined: number) => number
21+
>g : (addUndefined: string | undefined, addDefined: number) => number
2222
>addUndefined : string
2323
>"J" : "J"
2424
>addDefined : number
@@ -54,16 +54,16 @@ total = g('c', 3) + g(undefined, 4);
5454
>total : number
5555
>g('c', 3) + g(undefined, 4) : number
5656
>g('c', 3) : number
57-
>g : (addUndefined: string, addDefined: number) => number
57+
>g : (addUndefined: string | undefined, addDefined: number) => number
5858
>'c' : "c"
5959
>3 : 3
6060
>g(undefined, 4) : number
61-
>g : (addUndefined: string, addDefined: number) => number
61+
>g : (addUndefined: string | undefined, addDefined: number) => number
6262
>undefined : undefined
6363
>4 : 4
6464

6565
function foo1(x: string = "string", b: number) {
66-
>foo1 : (x: string, b: number) => void
66+
>foo1 : (x: string | undefined, b: number) => void
6767
>x : string
6868
>"string" : "string"
6969
>b : number
@@ -75,7 +75,7 @@ function foo1(x: string = "string", b: number) {
7575
}
7676

7777
function foo2(x = "string", b: number) {
78-
>foo2 : (x: string, b: number) => void
78+
>foo2 : (x: string | undefined, b: number) => void
7979
>x : string
8080
>"string" : "string"
8181
>b : number
@@ -144,13 +144,13 @@ allowsNull(null); // still allows passing null
144144
// .d.ts should have `string | undefined` for foo1, foo2, foo3 and foo4
145145
foo1(undefined, 1);
146146
>foo1(undefined, 1) : void
147-
>foo1 : (x: string, b: number) => void
147+
>foo1 : (x: string | undefined, b: number) => void
148148
>undefined : undefined
149149
>1 : 1
150150

151151
foo2(undefined, 1);
152152
>foo2(undefined, 1) : void
153-
>foo2 : (x: string, b: number) => void
153+
>foo2 : (x: string | undefined, b: number) => void
154154
>undefined : undefined
155155
>1 : 1
156156

testdata/baselines/reference/submodule/compiler/defaultParameterAddsUndefinedWithStrictNullChecks.types.diff

Lines changed: 1 addition & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,7 @@
99
>addUndefined1 : string
1010
>"J" : "J"
1111
>addUndefined2 : number | undefined
12-
@@= skipped -16, +16 lines =@@
13-
>0 : 0
14-
}
15-
function g(addUndefined = "J", addDefined: number) {
16-
->g : (addUndefined: string | undefined, addDefined: number) => number
17-
+>g : (addUndefined: string, addDefined: number) => number
18-
>addUndefined : string
19-
>"J" : "J"
20-
>addDefined : number
21-
@@= skipped -18, +18 lines =@@
12+
@@= skipped -34, +34 lines =@@
2213
>f() + f('a', 1) + f('b') : number
2314
>f() + f('a', 1) : number
2415
>f() : number
@@ -38,48 +29,3 @@
3829
+>f : (addUndefined1?: string, addUndefined2?: number | undefined) => number
3930
>undefined : undefined
4031
>2 : 2
41-
42-
@@= skipped -18, +18 lines =@@
43-
>total : number
44-
>g('c', 3) + g(undefined, 4) : number
45-
>g('c', 3) : number
46-
->g : (addUndefined: string | undefined, addDefined: number) => number
47-
+>g : (addUndefined: string, addDefined: number) => number
48-
>'c' : "c"
49-
>3 : 3
50-
>g(undefined, 4) : number
51-
->g : (addUndefined: string | undefined, addDefined: number) => number
52-
+>g : (addUndefined: string, addDefined: number) => number
53-
>undefined : undefined
54-
>4 : 4
55-
56-
function foo1(x: string = "string", b: number) {
57-
->foo1 : (x: string | undefined, b: number) => void
58-
+>foo1 : (x: string, b: number) => void
59-
>x : string
60-
>"string" : "string"
61-
>b : number
62-
@@= skipped -21, +21 lines =@@
63-
}
64-
65-
function foo2(x = "string", b: number) {
66-
->foo2 : (x: string | undefined, b: number) => void
67-
+>foo2 : (x: string, b: number) => void
68-
>x : string
69-
>"string" : "string"
70-
>b : number
71-
@@= skipped -69, +69 lines =@@
72-
// .d.ts should have `string | undefined` for foo1, foo2, foo3 and foo4
73-
foo1(undefined, 1);
74-
>foo1(undefined, 1) : void
75-
->foo1 : (x: string | undefined, b: number) => void
76-
+>foo1 : (x: string, b: number) => void
77-
>undefined : undefined
78-
>1 : 1
79-
80-
foo2(undefined, 1);
81-
>foo2(undefined, 1) : void
82-
->foo2 : (x: string | undefined, b: number) => void
83-
+>foo2 : (x: string, b: number) => void
84-
>undefined : undefined
85-
>1 : 1

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ export declare class Bar {
5454
f: number;
5555
}
5656
//// [file2.d.ts]
57-
export declare function foo(p?: (ip: number, v: number) => void): void;
58-
export declare function foo2(p?: (ip: number, v: number) => void): void;
57+
export declare function foo(p?: (ip: number | undefined, v: number) => void): void;
58+
export declare function foo2(p?: (ip: number | undefined, v: number) => void): void;
5959
export declare class Bar2 {
6060
readonly r: number;
6161
f: number;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@
4545
+ f: number;
4646
+}
4747
+//// [file2.d.ts]
48-
+export declare function foo(p?: (ip: number, v: number) => void): void;
49-
+export declare function foo2(p?: (ip: number, v: number) => void): void;
48+
+export declare function foo(p?: (ip: number | undefined, v: number) => void): void;
49+
+export declare function foo2(p?: (ip: number | undefined, v: number) => void): void;
5050
+export declare class Bar2 {
5151
+ readonly r: number;
5252
+ f: number;

testdata/baselines/reference/submodule/compiler/isolatedDeclarationsAddUndefined.types

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ export class Bar {
3030

3131
=== file2.ts ===
3232
export function foo(p = (ip = 10, v: number): void => {}): void{
33-
>foo : (p?: (ip: number, v: number) => void) => void
34-
>p : (ip: number, v: number) => void
35-
>(ip = 10, v: number): void => {} : (ip: number, v: number) => void
33+
>foo : (p?: (ip: number | undefined, v: number) => void) => void
34+
>p : (ip: number | undefined, v: number) => void
35+
>(ip = 10, v: number): void => {} : (ip: number | undefined, v: number) => void
3636
>ip : number
3737
>10 : 10
3838
>v : number
@@ -41,9 +41,9 @@ type T = number
4141
>T : number
4242

4343
export function foo2(p = (ip = 10 as T, v: number): void => {}): void{}
44-
>foo2 : (p?: (ip: number, v: number) => void) => void
45-
>p : (ip: number, v: number) => void
46-
>(ip = 10 as T, v: number): void => {} : (ip: number, v: number) => void
44+
>foo2 : (p?: (ip: number | undefined, v: number) => void) => void
45+
>p : (ip: number | undefined, v: number) => void
46+
>(ip = 10 as T, v: number): void => {} : (ip: number | undefined, v: number) => void
4747
>ip : number
4848
>10 as T : number
4949
>10 : 10
Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,15 @@
11
--- old.isolatedDeclarationsAddUndefined.types
22
+++ new.isolatedDeclarationsAddUndefined.types
3-
@@= skipped -29, +29 lines =@@
4-
5-
=== file2.ts ===
6-
export function foo(p = (ip = 10, v: number): void => {}): void{
7-
->foo : (p?: (ip: number | undefined, v: number) => void) => void
8-
->p : (ip: number | undefined, v: number) => void
9-
->(ip = 10, v: number): void => {} : (ip: number | undefined, v: number) => void
10-
+>foo : (p?: (ip: number, v: number) => void) => void
11-
+>p : (ip: number, v: number) => void
12-
+>(ip = 10, v: number): void => {} : (ip: number, v: number) => void
13-
>ip : number
14-
>10 : 10
15-
>v : number
16-
@@= skipped -11, +11 lines =@@
3+
@@= skipped -40, +40 lines =@@
174
>T : number
185

196
export function foo2(p = (ip = 10 as T, v: number): void => {}): void{}
207
->foo2 : (p?: (ip: T | undefined, v: number) => void) => void
218
->p : (ip: T | undefined, v: number) => void
229
->(ip = 10 as T, v: number): void => {} : (ip: T | undefined, v: number) => void
23-
+>foo2 : (p?: (ip: number, v: number) => void) => void
24-
+>p : (ip: number, v: number) => void
25-
+>(ip = 10 as T, v: number): void => {} : (ip: number, v: number) => void
10+
+>foo2 : (p?: (ip: number | undefined, v: number) => void) => void
11+
+>p : (ip: number | undefined, v: number) => void
12+
+>(ip = 10 as T, v: number): void => {} : (ip: number | undefined, v: number) => void
2613
>ip : number
2714
>10 as T : number
2815
>10 : 10

testdata/baselines/reference/submodule/compiler/verbatim-declarations-parameters.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class Foo {
2626
}
2727

2828
export function foo1(
29-
>foo1 : (reuseTypeNode: { [x: string]: any; } | undefined, reuseTypeNode2: { [x: string]: any; } | undefined, resolveType: { [x: string]: any; }, requiredParam: number) => void
29+
>foo1 : (reuseTypeNode: { [x: string]: any; } | undefined, reuseTypeNode2: { [x: string]: any; } | undefined, resolveType: { [x: string]: any; } | undefined, requiredParam: number) => void
3030

3131
// Type node is accurate, preserve
3232
reuseTypeNode: Map | undefined = {},

testdata/baselines/reference/submodule/compiler/verbatim-declarations-parameters.types.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
export function foo1(
77
->foo1 : (reuseTypeNode: Map | undefined, reuseTypeNode2: Exclude<MapOrUndefined, "dummy">, resolveType: Map | undefined, requiredParam: number) => void
8-
+>foo1 : (reuseTypeNode: { [x: string]: any; } | undefined, reuseTypeNode2: { [x: string]: any; } | undefined, resolveType: { [x: string]: any; }, requiredParam: number) => void
8+
+>foo1 : (reuseTypeNode: { [x: string]: any; } | undefined, reuseTypeNode2: { [x: string]: any; } | undefined, resolveType: { [x: string]: any; } | undefined, requiredParam: number) => void
99

1010
// Type node is accurate, preserve
1111
reuseTypeNode: Map | undefined = {},

0 commit comments

Comments
 (0)