C++: Use shared model coverage code.

This commit is contained in:
Anders Schack-Mulligen
2025-12-11 10:14:41 +01:00
parent 07252519c8
commit e262438557
2 changed files with 6 additions and 57 deletions

View File

@@ -213,6 +213,8 @@ private module MadInput implements SharedMaD::InputSig {
provenance = "manual" and provenance = "manual" and
model = "" model = ""
} }
string namespaceSegmentSeparator() { result = "::" }
} }
private module MaD = SharedMaD::ModelsAsData<Extensions, MadInput>; private module MaD = SharedMaD::ModelsAsData<Extensions, MadInput>;
@@ -247,62 +249,6 @@ predicate summaryModel(
) )
} }
private predicate relevantNamespace(string namespace) {
sourceModel(namespace, _, _, _, _, _, _, _, _, _) or
sinkModel(namespace, _, _, _, _, _, _, _, _, _) or
summaryModel(namespace, _, _, _, _, _, _, _, _, _, _)
}
private predicate namespaceLink(string shortns, string longns) {
relevantNamespace(shortns) and
relevantNamespace(longns) and
longns.prefix(longns.indexOf("::")) = shortns
}
private predicate canonicalNamespace(string namespace) {
relevantNamespace(namespace) and not namespaceLink(_, namespace)
}
private predicate canonicalNamespaceLink(string namespace, string subns) {
canonicalNamespace(namespace) and
(subns = namespace or namespaceLink(namespace, subns))
}
/**
* Holds if MaD framework coverage of `namespace` is `n` api endpoints of the
* kind `(kind, part)`, and `namespaces` is the number of subnamespaces of
* `namespace` which have MaD framework coverage (including `namespace`
* itself).
*/
predicate modelCoverage(string namespace, int namespaces, string kind, string part, int n) {
namespaces = strictcount(string subns | canonicalNamespaceLink(namespace, subns)) and
(
part = "source" and
n =
strictcount(string subns, string type, boolean subtypes, string name, string signature,
string ext, string output, string provenance, string model |
canonicalNamespaceLink(namespace, subns) and
sourceModel(subns, type, subtypes, name, signature, ext, output, kind, provenance, model)
)
or
part = "sink" and
n =
strictcount(string subns, string type, boolean subtypes, string name, string signature,
string ext, string input, string provenance, string model |
canonicalNamespaceLink(namespace, subns) and
sinkModel(subns, type, subtypes, name, signature, ext, input, kind, provenance, model)
)
or
part = "summary" and
n =
strictcount(string subns, string type, boolean subtypes, string name, string signature,
string ext, string input, string output, string provenance |
canonicalNamespaceLink(namespace, subns) and
summaryModel(subns, type, subtypes, name, signature, ext, input, output, kind, provenance, _)
)
)
}
/** Provides a query predicate to check the CSV data for validation errors. */ /** Provides a query predicate to check the CSV data for validation errors. */
module CsvValidation { module CsvValidation {
private string getInvalidModelInput() { private string getInvalidModelInput() {

View File

@@ -81,6 +81,9 @@ signature module InputSig {
) { ) {
none() none()
} }
/** Get the separator used between namespace segments. */
default string namespaceSegmentSeparator() { result = "." }
} }
module ModelsAsData<ExtensionsSig Extensions, InputSig Input> { module ModelsAsData<ExtensionsSig Extensions, InputSig Input> {
@@ -214,7 +217,7 @@ module ModelsAsData<ExtensionsSig Extensions, InputSig Input> {
private predicate namespaceLink(string shortns, string longns) { private predicate namespaceLink(string shortns, string longns) {
relevantNamespace(shortns) and relevantNamespace(shortns) and
relevantNamespace(longns) and relevantNamespace(longns) and
longns.prefix(longns.indexOf(".")) = shortns longns.prefix(longns.indexOf(Input::namespaceSegmentSeparator())) = shortns
} }
private predicate canonicalNamespace(string namespace) { private predicate canonicalNamespace(string namespace) {