@@ -1066,20 +1066,45 @@ class ClassNode extends DataFlow::SourceNode instanceof ClassNode::Range {
1066
1066
result = this .getAnInstanceReference ( DataFlow:: TypeTracker:: end ( ) )
1067
1067
}
1068
1068
1069
+ pragma [ nomagic]
1070
+ private DataFlow:: PropRead getAnOwnInstanceMemberAccess ( string name , DataFlow:: TypeTracker t ) {
1071
+ result = this .getAnInstanceReference ( t .continue ( ) ) .getAPropertyRead ( name )
1072
+ }
1073
+
1074
+ pragma [ nomagic]
1075
+ private DataFlow:: PropRead getAnInstanceMemberAccessOnSubClass (
1076
+ string name , DataFlow:: TypeTracker t
1077
+ ) {
1078
+ exists ( DataFlow:: ClassNode subclass |
1079
+ subclass = this .getADirectSubClass ( ) and
1080
+ not exists ( subclass .getInstanceMember ( name , _) )
1081
+ |
1082
+ result = subclass .getAnOwnInstanceMemberAccess ( name , t )
1083
+ or
1084
+ result = subclass .getAnInstanceMemberAccessOnSubClass ( name , t )
1085
+ )
1086
+ }
1087
+
1088
+ pragma [ nomagic]
1089
+ private DataFlow:: PropRead getAnInstanceMemberAccessOnSuperClass ( string name ) {
1090
+ result = this .getADirectSuperClass ( ) .getAReceiverNode ( ) .getAPropertyRead ( name )
1091
+ or
1092
+ result = this .getADirectSuperClass ( ) .getAnInstanceMemberAccessOnSuperClass ( name )
1093
+ }
1094
+
1069
1095
/**
1070
1096
* Gets a property read that accesses the property `name` on an instance of this class.
1071
1097
*
1072
1098
* Concretely, this holds when the base is an instance of this class or a subclass thereof.
1073
1099
*/
1074
1100
pragma [ nomagic]
1075
1101
DataFlow:: PropRead getAnInstanceMemberAccess ( string name , DataFlow:: TypeTracker t ) {
1076
- result = this .getAnInstanceReference ( t . continue ( ) ) . getAPropertyRead ( name )
1102
+ result = this .getAnOwnInstanceMemberAccess ( name , t )
1077
1103
or
1078
- exists ( DataFlow:: ClassNode subclass |
1079
- result = subclass .getAnInstanceMemberAccess ( name , t ) and
1080
- not exists ( subclass .getInstanceMember ( name , _) ) and
1081
- this = subclass .getADirectSuperClass ( )
1082
- )
1104
+ result = this .getAnInstanceMemberAccessOnSubClass ( name , t )
1105
+ or
1106
+ t .start ( ) and
1107
+ result = this .getAnInstanceMemberAccessOnSuperClass ( name )
1083
1108
}
1084
1109
1085
1110
/**
0 commit comments