C#: Use the first getter/setter when calling a property (override can apply to only a getter or a setter).

This commit is contained in:
Michael Nebel
2026-05-21 16:18:20 +02:00
parent d8e10b8c21
commit b280dd51f2
2 changed files with 32 additions and 20 deletions

View File

@@ -57,6 +57,34 @@ class DeclarationWithGetSetAccessors extends DeclarationWithAccessors, TopLevelE
/** Gets the `set` accessor of this declaration, if any. */
Setter getSetter() { result = this.getAnAccessor() }
/** Gets the target `get` accessor of this declaration, if any. */
private Getter getFirstGetter() {
if exists(this.getGetter())
then result = this.getGetter()
else result = this.getOverridee().getFirstGetter()
}
/** Gets the target accessor of this declaration when used in a read context, if any. */
Accessor getReadTarget() { result = this.getFirstGetter() }
/** Gets the target `set` accessor of this declaration, if any. */
private Setter getFirstSetter() {
if exists(this.getSetter())
then result = this.getSetter()
else result = this.getOverridee().getFirstSetter()
}
/** Gets the target accessor of this declaration when used in a write context, if any. */
Accessor getWriteTarget() {
result = this.getFirstSetter()
or
result =
any(Getter g |
g = this.getFirstGetter() and
g.getAnnotatedReturnType().isRef()
)
}
override DeclarationWithGetSetAccessors getOverridee() {
result = DeclarationWithAccessors.super.getOverridee()
}

View File

@@ -762,20 +762,12 @@ class AccessorCall extends Call, QualifiableExpr, @call_access_expr {
*/
class PropertyCall extends AccessorCall, PropertyAccessExpr {
override Accessor getReadTarget() {
this instanceof AssignableRead and result = this.getProperty().getGetter()
this instanceof AssignableRead and result = this.getProperty().getReadTarget()
}
override Accessor getWriteTarget() {
this instanceof AssignableWrite and
exists(Property p | p = this.getProperty() |
result = p.getSetter()
or
result =
any(Getter g |
g = p.getGetter() and
g.getAnnotatedReturnType().isRef()
)
)
result = this.getProperty().getWriteTarget()
}
override Expr getArgument(int i) {
@@ -806,20 +798,12 @@ class PropertyCall extends AccessorCall, PropertyAccessExpr {
*/
class IndexerCall extends AccessorCall, IndexerAccessExpr {
override Accessor getReadTarget() {
this instanceof AssignableRead and result = this.getIndexer().getGetter()
this instanceof AssignableRead and result = this.getIndexer().getReadTarget()
}
override Accessor getWriteTarget() {
this instanceof AssignableWrite and
exists(Indexer i | i = this.getIndexer() |
result = i.getSetter()
or
result =
any(Getter g |
g = i.getGetter() and
g.getAnnotatedReturnType().isRef()
)
)
result = this.getIndexer().getWriteTarget()
}
override Expr getArgument(int i) {