Don’t give all instantiated signatures in JS strict arity (#39606)

This commit is contained in:
Andrew Branch 2020-07-14 18:56:50 -07:00 committed by GitHub
parent ef9affe2f6
commit dd2fc86f2b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 161 additions and 1 deletions

View file

@ -5350,7 +5350,7 @@ namespace ts {
// We do not propagate `IsInnerCallChain` to instantiated signatures, as that would result in us
// attempting to add `| undefined` on each recursive call to `getReturnTypeOfSignature` when
// instantiating the return type.
PropagatingFlags = HasRestParameter | HasLiteralTypes,
PropagatingFlags = HasRestParameter | HasLiteralTypes | IsUntypedSignatureInJSFile,
CallChainFlags = IsInnerCallChain | IsOuterCallChain,
}

View file

@ -0,0 +1,62 @@
=== tests/cases/conformance/salsa/test.js ===
function f(x) {}
>f : Symbol(f, Decl(test.js, 0, 0))
>x : Symbol(x, Decl(test.js, 0, 11))
f(); // Always been ok
>f : Symbol(f, Decl(test.js, 0, 0))
class C {
>C : Symbol(C, Decl(test.js, 1, 4))
static m(x) {}
>m : Symbol(C.m, Decl(test.js, 3, 9))
>x : Symbol(x, Decl(test.js, 4, 11))
p = x => {}
>p : Symbol(C.p, Decl(test.js, 4, 16))
>x : Symbol(x, Decl(test.js, 5, 5))
m(x) {}
>m : Symbol(C.m, Decl(test.js, 5, 13))
>x : Symbol(x, Decl(test.js, 6, 4))
}
C.m(); // Always been ok
>C.m : Symbol(C.m, Decl(test.js, 3, 9))
>C : Symbol(C, Decl(test.js, 1, 4))
>m : Symbol(C.m, Decl(test.js, 3, 9))
new C().m(); // Regression #39261
>new C().m : Symbol(C.m, Decl(test.js, 5, 13))
>C : Symbol(C, Decl(test.js, 1, 4))
>m : Symbol(C.m, Decl(test.js, 5, 13))
new C().p(); // Regression #39261
>new C().p : Symbol(C.p, Decl(test.js, 4, 16))
>C : Symbol(C, Decl(test.js, 1, 4))
>p : Symbol(C.p, Decl(test.js, 4, 16))
const obj = {
>obj : Symbol(obj, Decl(test.js, 13, 5))
m(x) {},
>m : Symbol(m, Decl(test.js, 13, 13))
>x : Symbol(x, Decl(test.js, 14, 4))
p: x => {}
>p : Symbol(p, Decl(test.js, 14, 10))
>x : Symbol(x, Decl(test.js, 15, 4))
};
obj.m(); // Always been ok
>obj.m : Symbol(m, Decl(test.js, 13, 13))
>obj : Symbol(obj, Decl(test.js, 13, 5))
>m : Symbol(m, Decl(test.js, 13, 13))
obj.p(); // Always been ok
>obj.p : Symbol(p, Decl(test.js, 14, 10))
>obj : Symbol(obj, Decl(test.js, 13, 5))
>p : Symbol(p, Decl(test.js, 14, 10))

View file

@ -0,0 +1,73 @@
=== tests/cases/conformance/salsa/test.js ===
function f(x) {}
>f : (x: any) => void
>x : any
f(); // Always been ok
>f() : void
>f : (x: any) => void
class C {
>C : C
static m(x) {}
>m : (x: any) => void
>x : any
p = x => {}
>p : (x: any) => void
>x => {} : (x: any) => void
>x : any
m(x) {}
>m : (x: any) => void
>x : any
}
C.m(); // Always been ok
>C.m() : void
>C.m : (x: any) => void
>C : typeof C
>m : (x: any) => void
new C().m(); // Regression #39261
>new C().m() : void
>new C().m : (x: any) => void
>new C() : C
>C : typeof C
>m : (x: any) => void
new C().p(); // Regression #39261
>new C().p() : void
>new C().p : (x: any) => void
>new C() : C
>C : typeof C
>p : (x: any) => void
const obj = {
>obj : { m(x: any): void; p: (x: any) => void; }
>{ m(x) {}, p: x => {}} : { m(x: any): void; p: (x: any) => void; }
m(x) {},
>m : (x: any) => void
>x : any
p: x => {}
>p : (x: any) => void
>x => {} : (x: any) => void
>x : any
};
obj.m(); // Always been ok
>obj.m() : void
>obj.m : (x: any) => void
>obj : { m(x: any): void; p: (x: any) => void; }
>m : (x: any) => void
obj.p(); // Always been ok
>obj.p() : void
>obj.p : (x: any) => void
>obj : { m(x: any): void; p: (x: any) => void; }
>p : (x: any) => void

View file

@ -0,0 +1,25 @@
// @allowJs: true
// @checkJs: true
// @noEmit: true
// @Filename: test.js
function f(x) {}
f(); // Always been ok
class C {
static m(x) {}
p = x => {}
m(x) {}
}
C.m(); // Always been ok
new C().m(); // Regression #39261
new C().p(); // Regression #39261
const obj = {
m(x) {},
p: x => {}
};
obj.m(); // Always been ok
obj.p(); // Always been ok