Fixed a regression in serializing setters with non-function declarations in JS files (#55492)

This commit is contained in:
Mateusz Burzyński 2023-08-24 18:45:58 +02:00 committed by GitHub
parent f07077c7ff
commit fecbae5d2e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 521 additions and 2 deletions

View File

@ -9803,8 +9803,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
});
Debug.assert(setter && isFunctionLikeDeclaration(setter));
const paramSymbol: Symbol | undefined = getSignatureFromDeclaration(setter).parameters[0];
Debug.assert(!!setter);
const paramSymbol = isFunctionLikeDeclaration(setter) ? getSignatureFromDeclaration(setter).parameters[0] : undefined;
result.push(setTextRange(
factory.createSetAccessorDeclaration(

View File

@ -61,6 +61,63 @@ export class H {}
Object.defineProperty(H.prototype, "x", {
set() {}
});
export class I {}
Object.defineProperty(I.prototype, "x", {
/**
* @param {number} v
*/
set: (v) => {}
});
/**
* @param {number} v
*/
const jSetter = (v) => {}
export class J {}
Object.defineProperty(J.prototype, "x", {
set: jSetter
});
/**
* @param {number} v
*/
const kSetter1 = (v) => {}
/**
* @param {number} v
*/
const kSetter2 = (v) => {}
export class K {}
Object.defineProperty(K.prototype, "x", {
set: Math.random() ? kSetter1 : kSetter2
});
/**
* @param {number} v
*/
const lSetter1 = (v) => {}
/**
* @param {string} v
*/
const lSetter2 = (v) => {}
export class L {}
Object.defineProperty(L.prototype, "x", {
set: Math.random() ? lSetter1 : lSetter2
});
/**
* @param {number | boolean} v
*/
const mSetter1 = (v) => {}
/**
* @param {string | boolean} v
*/
const mSetter2 = (v) => {}
export class M {}
Object.defineProperty(M.prototype, "x", {
set: Math.random() ? mSetter1 : mSetter2
});
//// [index.js]
@ -122,6 +179,62 @@ export class H {
Object.defineProperty(H.prototype, "x", {
set() { }
});
export class I {
}
Object.defineProperty(I.prototype, "x", {
/**
* @param {number} v
*/
set: (v) => { }
});
/**
* @param {number} v
*/
const jSetter = (v) => { };
export class J {
}
Object.defineProperty(J.prototype, "x", {
set: jSetter
});
/**
* @param {number} v
*/
const kSetter1 = (v) => { };
/**
* @param {number} v
*/
const kSetter2 = (v) => { };
export class K {
}
Object.defineProperty(K.prototype, "x", {
set: Math.random() ? kSetter1 : kSetter2
});
/**
* @param {number} v
*/
const lSetter1 = (v) => { };
/**
* @param {string} v
*/
const lSetter2 = (v) => { };
export class L {
}
Object.defineProperty(L.prototype, "x", {
set: Math.random() ? lSetter1 : lSetter2
});
/**
* @param {number | boolean} v
*/
const mSetter1 = (v) => { };
/**
* @param {string | boolean} v
*/
const mSetter2 = (v) => { };
export class M {
}
Object.defineProperty(M.prototype, "x", {
set: Math.random() ? mSetter1 : mSetter2
});
//// [index.d.ts]
@ -154,3 +267,18 @@ export class G {
export class H {
set x(value: any);
}
export class I {
set x(value: number);
}
export class J {
set x(value: number);
}
export class K {
set x(value: number);
}
export class L {
set x(value: any);
}
export class M {
set x(value: any);
}

View File

@ -141,3 +141,158 @@ Object.defineProperty(H.prototype, "x", {
});
export class I {}
>I : Symbol(I, Decl(index.js, 59, 3))
Object.defineProperty(I.prototype, "x", {
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>I.prototype : Symbol(I.prototype)
>I : Symbol(I, Decl(index.js, 59, 3))
>prototype : Symbol(I.prototype)
>"x" : Symbol(I.x, Decl(index.js, 62, 17))
/**
* @param {number} v
*/
set: (v) => {}
>set : Symbol(set, Decl(index.js, 63, 41))
>v : Symbol(v, Decl(index.js, 67, 10))
});
/**
* @param {number} v
*/
const jSetter = (v) => {}
>jSetter : Symbol(jSetter, Decl(index.js, 73, 5))
>v : Symbol(v, Decl(index.js, 73, 17))
export class J {}
>J : Symbol(J, Decl(index.js, 73, 25))
Object.defineProperty(J.prototype, "x", {
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>J.prototype : Symbol(J.prototype)
>J : Symbol(J, Decl(index.js, 73, 25))
>prototype : Symbol(J.prototype)
>"x" : Symbol(J.x, Decl(index.js, 74, 17))
set: jSetter
>set : Symbol(set, Decl(index.js, 75, 41))
>jSetter : Symbol(jSetter, Decl(index.js, 73, 5))
});
/**
* @param {number} v
*/
const kSetter1 = (v) => {}
>kSetter1 : Symbol(kSetter1, Decl(index.js, 82, 5))
>v : Symbol(v, Decl(index.js, 82, 18))
/**
* @param {number} v
*/
const kSetter2 = (v) => {}
>kSetter2 : Symbol(kSetter2, Decl(index.js, 86, 5))
>v : Symbol(v, Decl(index.js, 86, 18))
export class K {}
>K : Symbol(K, Decl(index.js, 86, 26))
Object.defineProperty(K.prototype, "x", {
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>K.prototype : Symbol(K.prototype)
>K : Symbol(K, Decl(index.js, 86, 26))
>prototype : Symbol(K.prototype)
>"x" : Symbol(K.x, Decl(index.js, 87, 17))
set: Math.random() ? kSetter1 : kSetter2
>set : Symbol(set, Decl(index.js, 88, 41))
>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
>kSetter1 : Symbol(kSetter1, Decl(index.js, 82, 5))
>kSetter2 : Symbol(kSetter2, Decl(index.js, 86, 5))
});
/**
* @param {number} v
*/
const lSetter1 = (v) => {}
>lSetter1 : Symbol(lSetter1, Decl(index.js, 95, 5))
>v : Symbol(v, Decl(index.js, 95, 18))
/**
* @param {string} v
*/
const lSetter2 = (v) => {}
>lSetter2 : Symbol(lSetter2, Decl(index.js, 99, 5))
>v : Symbol(v, Decl(index.js, 99, 18))
export class L {}
>L : Symbol(L, Decl(index.js, 99, 26))
Object.defineProperty(L.prototype, "x", {
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>L.prototype : Symbol(L.prototype)
>L : Symbol(L, Decl(index.js, 99, 26))
>prototype : Symbol(L.prototype)
>"x" : Symbol(L.x, Decl(index.js, 100, 17))
set: Math.random() ? lSetter1 : lSetter2
>set : Symbol(set, Decl(index.js, 101, 41))
>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
>lSetter1 : Symbol(lSetter1, Decl(index.js, 95, 5))
>lSetter2 : Symbol(lSetter2, Decl(index.js, 99, 5))
});
/**
* @param {number | boolean} v
*/
const mSetter1 = (v) => {}
>mSetter1 : Symbol(mSetter1, Decl(index.js, 108, 5))
>v : Symbol(v, Decl(index.js, 108, 18))
/**
* @param {string | boolean} v
*/
const mSetter2 = (v) => {}
>mSetter2 : Symbol(mSetter2, Decl(index.js, 112, 5))
>v : Symbol(v, Decl(index.js, 112, 18))
export class M {}
>M : Symbol(M, Decl(index.js, 112, 26))
Object.defineProperty(M.prototype, "x", {
>Object.defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
>defineProperty : Symbol(ObjectConstructor.defineProperty, Decl(lib.es5.d.ts, --, --))
>M.prototype : Symbol(M.prototype)
>M : Symbol(M, Decl(index.js, 112, 26))
>prototype : Symbol(M.prototype)
>"x" : Symbol(M.x, Decl(index.js, 113, 17))
set: Math.random() ? mSetter1 : mSetter2
>set : Symbol(set, Decl(index.js, 114, 41))
>Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --))
>random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --))
>mSetter1 : Symbol(mSetter1, Decl(index.js, 108, 5))
>mSetter2 : Symbol(mSetter2, Decl(index.js, 112, 5))
});

View File

@ -156,3 +156,182 @@ Object.defineProperty(H.prototype, "x", {
});
export class I {}
>I : I
Object.defineProperty(I.prototype, "x", {
>Object.defineProperty(I.prototype, "x", { /** * @param {number} v */ set: (v) => {}}) : I
>Object.defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>Object : ObjectConstructor
>defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>I.prototype : I
>I : typeof I
>prototype : I
>"x" : "x"
>{ /** * @param {number} v */ set: (v) => {}} : { set: (v: number) => void; }
/**
* @param {number} v
*/
set: (v) => {}
>set : (v: number) => void
>(v) => {} : (v: number) => void
>v : number
});
/**
* @param {number} v
*/
const jSetter = (v) => {}
>jSetter : (v: number) => void
>(v) => {} : (v: number) => void
>v : number
export class J {}
>J : J
Object.defineProperty(J.prototype, "x", {
>Object.defineProperty(J.prototype, "x", { set: jSetter}) : J
>Object.defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>Object : ObjectConstructor
>defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>J.prototype : J
>J : typeof J
>prototype : J
>"x" : "x"
>{ set: jSetter} : { set: (v: number) => void; }
set: jSetter
>set : (v: number) => void
>jSetter : (v: number) => void
});
/**
* @param {number} v
*/
const kSetter1 = (v) => {}
>kSetter1 : (v: number) => void
>(v) => {} : (v: number) => void
>v : number
/**
* @param {number} v
*/
const kSetter2 = (v) => {}
>kSetter2 : (v: number) => void
>(v) => {} : (v: number) => void
>v : number
export class K {}
>K : K
Object.defineProperty(K.prototype, "x", {
>Object.defineProperty(K.prototype, "x", { set: Math.random() ? kSetter1 : kSetter2}) : K
>Object.defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>Object : ObjectConstructor
>defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>K.prototype : K
>K : typeof K
>prototype : K
>"x" : "x"
>{ set: Math.random() ? kSetter1 : kSetter2} : { set: (v: number) => void; }
set: Math.random() ? kSetter1 : kSetter2
>set : (v: number) => void
>Math.random() ? kSetter1 : kSetter2 : (v: number) => void
>Math.random() : number
>Math.random : () => number
>Math : Math
>random : () => number
>kSetter1 : (v: number) => void
>kSetter2 : (v: number) => void
});
/**
* @param {number} v
*/
const lSetter1 = (v) => {}
>lSetter1 : (v: number) => void
>(v) => {} : (v: number) => void
>v : number
/**
* @param {string} v
*/
const lSetter2 = (v) => {}
>lSetter2 : (v: string) => void
>(v) => {} : (v: string) => void
>v : string
export class L {}
>L : L
Object.defineProperty(L.prototype, "x", {
>Object.defineProperty(L.prototype, "x", { set: Math.random() ? lSetter1 : lSetter2}) : L
>Object.defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>Object : ObjectConstructor
>defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>L.prototype : L
>L : typeof L
>prototype : L
>"x" : "x"
>{ set: Math.random() ? lSetter1 : lSetter2} : { set: ((v: number) => void) | ((v: string) => void); }
set: Math.random() ? lSetter1 : lSetter2
>set : ((v: number) => void) | ((v: string) => void)
>Math.random() ? lSetter1 : lSetter2 : ((v: number) => void) | ((v: string) => void)
>Math.random() : number
>Math.random : () => number
>Math : Math
>random : () => number
>lSetter1 : (v: number) => void
>lSetter2 : (v: string) => void
});
/**
* @param {number | boolean} v
*/
const mSetter1 = (v) => {}
>mSetter1 : (v: number | boolean) => void
>(v) => {} : (v: number | boolean) => void
>v : number | boolean
/**
* @param {string | boolean} v
*/
const mSetter2 = (v) => {}
>mSetter2 : (v: string | boolean) => void
>(v) => {} : (v: string | boolean) => void
>v : string | boolean
export class M {}
>M : M
Object.defineProperty(M.prototype, "x", {
>Object.defineProperty(M.prototype, "x", { set: Math.random() ? mSetter1 : mSetter2}) : M
>Object.defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>Object : ObjectConstructor
>defineProperty : <T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>) => T
>M.prototype : M
>M : typeof M
>prototype : M
>"x" : "x"
>{ set: Math.random() ? mSetter1 : mSetter2} : { set: ((v: number | boolean) => void) | ((v: string | boolean) => void); }
set: Math.random() ? mSetter1 : mSetter2
>set : ((v: number | boolean) => void) | ((v: string | boolean) => void)
>Math.random() ? mSetter1 : mSetter2 : ((v: number | boolean) => void) | ((v: string | boolean) => void)
>Math.random() : number
>Math.random : () => number
>Math : Math
>random : () => number
>mSetter1 : (v: number | boolean) => void
>mSetter2 : (v: string | boolean) => void
});

View File

@ -64,3 +64,60 @@ export class H {}
Object.defineProperty(H.prototype, "x", {
set() {}
});
export class I {}
Object.defineProperty(I.prototype, "x", {
/**
* @param {number} v
*/
set: (v) => {}
});
/**
* @param {number} v
*/
const jSetter = (v) => {}
export class J {}
Object.defineProperty(J.prototype, "x", {
set: jSetter
});
/**
* @param {number} v
*/
const kSetter1 = (v) => {}
/**
* @param {number} v
*/
const kSetter2 = (v) => {}
export class K {}
Object.defineProperty(K.prototype, "x", {
set: Math.random() ? kSetter1 : kSetter2
});
/**
* @param {number} v
*/
const lSetter1 = (v) => {}
/**
* @param {string} v
*/
const lSetter2 = (v) => {}
export class L {}
Object.defineProperty(L.prototype, "x", {
set: Math.random() ? lSetter1 : lSetter2
});
/**
* @param {number | boolean} v
*/
const mSetter1 = (v) => {}
/**
* @param {string | boolean} v
*/
const mSetter2 = (v) => {}
export class M {}
Object.defineProperty(M.prototype, "x", {
set: Math.random() ? mSetter1 : mSetter2
});