C++: Extend the dbscheme with concept templates

This commit is contained in:
Jeroen Ketema
2024-12-23 21:51:05 +01:00
parent 8e660190a9
commit a2d66ee155
3 changed files with 53 additions and 1 deletions

View File

@@ -159,3 +159,32 @@ class ConceptIdExpr extends RequirementExpr, @concept_id {
override string getAPrimaryQlClass() { result = "ConceptIdExpr" }
}
/**
* A C++ concept.
*
* For example:
* ```cpp
* template<class T>
* concept C = std::is_same<T, int>::value;
* ```
*/
class Concept extends Declaration, @concept_template {
override string getAPrimaryQlClass() { result = "Concept" }
override Location getLocation() { concept_templates(underlyingElement(this), _, result) }
override string getName() { concept_templates(underlyingElement(this), result, _) }
/**
* Gets the constraint expression of the concept.
*
* For example, in
* ```cpp
* template<class T>
* concept C = std::is_same<T, int>::value;
* ```
* the constraint expression is `std::is_same<T, int>::value`.
*/
Expr getExpr() { result.getParent() = this }
}

View File

@@ -279,6 +279,8 @@ class Declaration extends Locatable, @declaration {
variable_template_argument(underlyingElement(this), index, unresolveElement(result))
or
template_template_argument(underlyingElement(this), index, unresolveElement(result))
or
concept_template_argument(underlyingElement(this), index, unresolveElement(result))
}
private Expr getTemplateArgumentValue(int index) {
@@ -289,6 +291,8 @@ class Declaration extends Locatable, @declaration {
variable_template_argument_value(underlyingElement(this), index, unresolveElement(result))
or
template_template_argument_value(underlyingElement(this), index, unresolveElement(result))
or
concept_template_argument_value(underlyingElement(this), index, unresolveElement(result))
}
}

View File

@@ -876,6 +876,24 @@ template_template_argument_value(
int arg_value: @expr ref
);
@concept = @concept_template | @concept_id;
concept_templates(
unique int concept_id: @concept_template,
string name: string ref,
int location: @location_default ref
);
concept_template_argument(
int concept_id: @concept ref,
int index: int ref,
int arg_type: @type ref
);
concept_template_argument_value(
int concept_id: @concept ref,
int index: int ref,
int arg_value: @expr ref
);
routinetypes(
unique int id: @routinetype,
int return_type: @type ref
@@ -1106,7 +1124,8 @@ frienddecls(
| @declaredtype
| @variable
| @enumconstant
| @frienddecl;
| @frienddecl
| @concept_template;
@member = @membervariable
| @function