use newtype for related location type

This commit is contained in:
Stephan Brandauer
2023-05-10 10:26:02 +02:00
parent 5dab1b2a3b
commit 170e895593
5 changed files with 28 additions and 17 deletions

View File

@@ -39,8 +39,7 @@ where
)
select endpoint,
message + "\nrelated locations: $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@.", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, "Callable-JavaDoc"),
"Callable-JavaDoc", CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, "Class-JavaDoc"),
"Class-JavaDoc", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", //
package, "package", type, "type", subtypes.toString(), "subtypes", name, "name", signature,
"signature", input.toString(), "input" //

View File

@@ -36,8 +36,7 @@ where
message = characteristic
select endpoint,
message + "\nrelated locations: $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@.", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, "Callable-JavaDoc"),
"Callable-JavaDoc", CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, "Class-JavaDoc"),
"Class-JavaDoc", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", //
package, "package", type, "type", subtypes.toString(), "subtypes", name, "name", signature,
"signature", input.toString(), "input" //

View File

@@ -23,8 +23,7 @@ where
CharacteristicsImpl::isKnownSink(endpoint, sinkType)
select endpoint,
sinkType + "\nrelated locations: $@, $@." + "\nmetadata: $@, $@, $@, $@, $@, $@.", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, "Callable-JavaDoc"),
"Callable-JavaDoc", CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, "Class-JavaDoc"),
"Class-JavaDoc", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, MethodDoc()), "MethodDoc", //
CharacteristicsImpl::getRelatedLocationOrCandidate(endpoint, ClassDoc()), "ClassDoc", //
package, "package", type, "type", subtypes.toString(), "subtypes", name, "name", signature,
"signature", input.toString(), "input" //

View File

@@ -31,6 +31,10 @@ abstract class MetadataExtractor extends string {
);
}
newtype JavaRelatedLocationType =
MethodDoc() or
ClassDoc()
// for documentation of the implementations here, see the QLDoc in the CandidateSig signature module.
module FrameworkCandidatesImpl implements SharedCharacteristics::CandidateSig {
class Endpoint = DataFlow::ParameterNode;
@@ -41,6 +45,8 @@ module FrameworkCandidatesImpl implements SharedCharacteristics::CandidateSig {
class RelatedLocation = Location::Top;
class RelatedLocationType = JavaRelatedLocationType;
// Sanitizers are currently not modeled in MaD. TODO: check if this has large negative impact.
predicate isSanitizer(Endpoint e, EndpointType t) { none() }
@@ -107,11 +113,11 @@ module FrameworkCandidatesImpl implements SharedCharacteristics::CandidateSig {
*
* Related locations can be JavaDoc comments of the class or the method.
*/
RelatedLocation getRelatedLocation(Endpoint e, string name) {
name = "Callable-JavaDoc" and
RelatedLocation getRelatedLocation(Endpoint e, RelatedLocationType type) {
type = MethodDoc() and
result = FrameworkCandidatesImpl::getCallable(e).(Documentable).getJavadoc()
or
name = "Class-JavaDoc" and
type = ClassDoc() and
result = FrameworkCandidatesImpl::getCallable(e).getDeclaringType().(Documentable).getJavadoc()
}

View File

@@ -23,6 +23,13 @@ signature module CandidateSig {
*/
class RelatedLocation;
/**
* A label for a related location.
*
* Eg., method-doc, class-doc, etc.
*/
class RelatedLocationType;
/**
* A class kind for an endpoint.
*/
@@ -68,7 +75,7 @@ signature module CandidateSig {
*
* For example, a related location for a method call may be the documentation comment of a method.
*/
RelatedLocation getRelatedLocation(Endpoint e, string name);
RelatedLocation getRelatedLocation(Endpoint e, RelatedLocationType name);
}
/**
@@ -111,10 +118,11 @@ module SharedCharacteristics<CandidateSig Candidate> {
* Gets the related location of `e` with name `name`, if it exists.
* Otherwise, gets the candidate itself.
*/
bindingset[name]
Candidate::RelatedLocation getRelatedLocationOrCandidate(Candidate::Endpoint e, string name) {
if exists(Candidate::getRelatedLocation(e, name))
then result = Candidate::getRelatedLocation(e, name)
Candidate::RelatedLocation getRelatedLocationOrCandidate(
Candidate::Endpoint e, Candidate::RelatedLocationType type
) {
if exists(Candidate::getRelatedLocation(e, type))
then result = Candidate::getRelatedLocation(e, type)
else result = Candidate::asLocation(e)
}