diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index fd479090c53..bc09440dd7e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -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( diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.js b/tests/baselines/reference/jsDeclarationsGetterSetter.js index 31941471c03..90a1a35f8a8 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.js +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.js @@ -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); +} diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.symbols b/tests/baselines/reference/jsDeclarationsGetterSetter.symbols index d0d98a8158c..90a1d37bbbb 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.symbols +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.symbols @@ -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)) + +}); + diff --git a/tests/baselines/reference/jsDeclarationsGetterSetter.types b/tests/baselines/reference/jsDeclarationsGetterSetter.types index 3b4ce594885..d0746a23a3e 100644 --- a/tests/baselines/reference/jsDeclarationsGetterSetter.types +++ b/tests/baselines/reference/jsDeclarationsGetterSetter.types @@ -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 : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>Object : ObjectConstructor +>defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => 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 : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>Object : ObjectConstructor +>defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => 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 : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>Object : ObjectConstructor +>defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => 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 : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>Object : ObjectConstructor +>defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => 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 : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => T +>Object : ObjectConstructor +>defineProperty : (o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType) => 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 + +}); + diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts index f42dcf64573..aacd4997074 100644 --- a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsGetterSetter.ts @@ -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 +});