Skip to content

Commit a9d2f43

Browse files
author
Stephan Brandauer
committed
Java: use a newtype for framework mode candidates
1 parent 8ed773b commit a9d2f43

File tree

1 file changed

+39
-9
lines changed

1 file changed

+39
-9
lines changed

java/ql/src/Telemetry/AutomodelFrameworkModeCharacteristics.qll

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@ newtype JavaRelatedLocationType =
2323
MethodDoc() or
2424
ClassDoc()
2525

26+
newtype TFrameworkModeEndpoint =
27+
TExplicitParameter(Parameter p) or
28+
TQualifier(Callable c)
29+
2630
/**
2731
* A framework mode endpoint.
2832
*/
29-
abstract class FrameworkModeEndpoint extends Top {
33+
abstract class FrameworkModeEndpoint extends TFrameworkModeEndpoint {
3034
/**
3135
* Returns the parameter index of the endpoint.
3236
*/
@@ -41,22 +45,48 @@ abstract class FrameworkModeEndpoint extends Top {
4145
* Returns the callable that contains the endpoint.
4246
*/
4347
abstract Callable getEnclosingCallable();
48+
49+
abstract Top asTop();
50+
51+
string toString() {
52+
result = this.asTop().toString()
53+
}
54+
55+
Location getLocation() {
56+
result = this.asTop().getLocation()
57+
}
4458
}
4559

46-
class ParameterEndpoint extends FrameworkModeEndpoint instanceof Parameter {
47-
override int getIndex() { result = this.(Parameter).getPosition() }
60+
class ExplicitParameterEndpoint extends FrameworkModeEndpoint, TExplicitParameter {
61+
Parameter param;
62+
63+
ExplicitParameterEndpoint() { this = TExplicitParameter(param) }
4864

49-
override string getParamName() { result = this.(Parameter).getName() }
65+
override int getIndex() { result = param.getPosition() }
5066

51-
override Callable getEnclosingCallable() { result = this.(Parameter).getCallable() }
67+
override string getParamName() { result = param.getName() }
68+
69+
override Callable getEnclosingCallable() { result = param.getCallable() }
70+
71+
override Top asTop() {
72+
result = param
73+
}
5274
}
5375

54-
class QualifierEndpoint extends FrameworkModeEndpoint instanceof Callable {
76+
class QualifierEndpoint extends FrameworkModeEndpoint, TQualifier {
77+
Callable callable;
78+
79+
QualifierEndpoint() { this = TQualifier(callable) }
80+
5581
override int getIndex() { result = -1 }
5682

5783
override string getParamName() { result = "this" }
5884

59-
override Callable getEnclosingCallable() { result = this }
85+
override Callable getEnclosingCallable() { result = callable }
86+
87+
override Top asTop() {
88+
result = callable
89+
}
6090
}
6191

6292
/**
@@ -82,7 +112,7 @@ module FrameworkCandidatesImpl implements SharedCharacteristics::CandidateSig {
82112
// Sanitizers are currently not modeled in MaD. TODO: check if this has large negative impact.
83113
predicate isSanitizer(Endpoint e, EndpointType t) { none() }
84114

85-
RelatedLocation asLocation(Endpoint e) { result = e }
115+
RelatedLocation asLocation(Endpoint e) { result = e.asTop() }
86116

87117
predicate isKnownKind = AutomodelJavaUtil::isKnownKind/2;
88118

@@ -232,7 +262,7 @@ private class NotAModelApiParameter extends CharacteristicsImpl::UninterestingTo
232262
NotAModelApiParameter() { this = "not a model API parameter" }
233263

234264
override predicate appliesToEndpoint(Endpoint e) {
235-
not exists(ModelExclusions::ModelApi api | api.getAParameter() = e)
265+
not exists(ModelExclusions::ModelApi api | api.getAParameter() = e.asTop())
236266
}
237267
}
238268

0 commit comments

Comments
 (0)