mirror of
https://github.com/github/codeql.git
synced 2026-06-19 03:41:07 +02:00
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:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user