From b1e7fc5206e979b35d91a5e44495d0efc79029b5 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Wed, 15 Nov 2023 22:54:01 +0800 Subject: [PATCH 1/3] fix: diagnose when accessing setter only property --- src/resolver.ts | 10 +++++++++- tests/compiler/getter-setter-errors.json | 7 +++++++ tests/compiler/getter-setter-errors.ts | 5 +++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tests/compiler/getter-setter-errors.json create mode 100644 tests/compiler/getter-setter-errors.ts diff --git a/src/resolver.ts b/src/resolver.ts index ca05a3424b..22c54c71ef 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1363,7 +1363,15 @@ export class Resolver extends DiagnosticEmitter { } case ElementKind.Property: { // someInstance.prop let propertyInstance = target; - let getterInstance = assert(propertyInstance.getterInstance); // must have a getter + let getterInstance = propertyInstance.getterInstance; + if (!getterInstance) { + let setterInstance = propertyInstance.setterInstance!; + this.errorRelated( + DiagnosticCode.Property_0_only_has_a_setter_and_is_missing_a_getter, + targetNode.range, setterInstance.declaration.range, propertyInstance.name + ); + return null; + } let type = getterInstance.signature.returnType; let classReference = type.getClassOrWrapper(this.program); if (!classReference) { diff --git a/tests/compiler/getter-setter-errors.json b/tests/compiler/getter-setter-errors.json new file mode 100644 index 0000000000..118764fe5c --- /dev/null +++ b/tests/compiler/getter-setter-errors.json @@ -0,0 +1,7 @@ +{ + "asc_flags": [ + ], + "stderr": [ + "AS229: Property 'm' only has a setter and is missing a getter." + ] +} diff --git a/tests/compiler/getter-setter-errors.ts b/tests/compiler/getter-setter-errors.ts new file mode 100644 index 0000000000..e37f5c643e --- /dev/null +++ b/tests/compiler/getter-setter-errors.ts @@ -0,0 +1,5 @@ +class A { + set m(v: string) {} +} + +changetype(0).m.toString(); From df69c185de6a4a776787dde1a56fd36fe51946ae Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Mon, 20 Nov 2023 13:20:00 +0800 Subject: [PATCH 2/3] add comments --- src/resolver.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/resolver.ts b/src/resolver.ts index 0c49720169..668a157ae7 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1365,7 +1365,9 @@ export class Resolver extends DiagnosticEmitter { let propertyInstance = target; let getterInstance = propertyInstance.getterInstance; if (!getterInstance) { - let setterInstance = propertyInstance.setterInstance!; + // It should compile as (undefined) for compatibility with ts. + // Since AS don't have undefined, diagnose it in compile time would be better although it does cause compatibility issues + let setterInstance = assert(propertyInstance.setterInstance); this.errorRelated( DiagnosticCode.Property_0_only_has_a_setter_and_is_missing_a_getter, targetNode.range, setterInstance.declaration.range, propertyInstance.name From 8443bdc2c93dfe1fefe49496c28c1c687a41eb08 Mon Sep 17 00:00:00 2001 From: Congcong Cai Date: Mon, 20 Nov 2023 14:46:19 +0800 Subject: [PATCH 3/3] Update src/resolver.ts Co-authored-by: CountBleck --- src/resolver.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index 668a157ae7..349cd47d5e 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1365,8 +1365,9 @@ export class Resolver extends DiagnosticEmitter { let propertyInstance = target; let getterInstance = propertyInstance.getterInstance; if (!getterInstance) { - // It should compile as (undefined) for compatibility with ts. - // Since AS don't have undefined, diagnose it in compile time would be better although it does cause compatibility issues + // In TS, getters without setters return `undefined`. Since AS doesn't have + // undefined, we instead diagnose it at compile time, but this isn't + // compatible with TS. let setterInstance = assert(propertyInstance.setterInstance); this.errorRelated( DiagnosticCode.Property_0_only_has_a_setter_and_is_missing_a_getter,