12 #ifndef R__SELECTIONRULES_H
13 #define R__SELECTIONRULES_H
19 #include "clang/AST/Decl.h"
21 #include "TClingUtils.h"
28 namespace TMetaUtils {
29 class TNormalizedCtxt;
33 namespace SelectionRulesUtils {
35 template<
class ASSOCIATIVECONTAINER>
36 inline bool areEqualAttributes(
const ASSOCIATIVECONTAINER& c1,
const ASSOCIATIVECONTAINER& c2,
bool moduloNameOrPattern){
37 if (c1.size() != c2.size())
return false;
38 if (moduloNameOrPattern) {
39 for (
auto&& keyValPairC1 : c1){
40 auto keyC1 = keyValPairC1.first;
41 if (
"pattern" == keyC1 ||
"name" == keyC1)
continue;
42 auto valC1 = keyValPairC1.second;
43 auto C2It = c2.find(keyC1);
44 if (C2It == c2.end() || valC1 != C2It->second)
return false;
54 inline bool areEqual(
const RULE* r1,
const RULE* r2,
bool moduloNameOrPattern =
false){
55 return areEqualAttributes(r1->GetAttributes(), r2->GetAttributes(), moduloNameOrPattern);
58 template<
class RULESCOLLECTION>
59 inline bool areEqualColl(
const RULESCOLLECTION& r1,
60 const RULESCOLLECTION& r2,
61 bool moduloNameOrPattern =
false){
62 if (r1.size() != r2.size())
return false;
63 auto rIt1 = r1.begin();
64 auto rIt2 = r2.begin();
65 for (;rIt1!=r1.cend();++rIt1,++rIt2){
66 if (!areEqual(&(*rIt1),&(*rIt2), moduloNameOrPattern))
return false;
71 inline bool areEqual<ClassSelectionRule>(
const ClassSelectionRule* r1,
72 const ClassSelectionRule* r2,
73 bool moduloNameOrPattern){
74 if (!areEqualAttributes(r1->GetAttributes(), r2->GetAttributes(),moduloNameOrPattern))
return false;
76 if (!areEqualColl(r1->GetFieldSelectionRules(),
77 r2->GetFieldSelectionRules(),
80 if (!areEqualColl(r1->GetMethodSelectionRules(),
81 r2->GetMethodSelectionRules(),
88 class SelectionRules {
92 enum ESelectionFileTypes {
95 kNumSelectionFileTypes
98 SelectionRules(cling::Interpreter &interp,
99 ROOT::TMetaUtils::TNormalizedCtxt& normCtxt,
100 const std::vector<std::pair<std::string,std::string>>& namesForExclusion):
101 fSelectionFileType(kNumSelectionFileTypes),
102 fHasFileNameRule(false),
107 for (
auto& attrValPair : namesForExclusion){
108 ClassSelectionRule csr(counter++, fInterp);
109 csr.SetAttributeValue(attrValPair.first, attrValPair.second);
110 csr.SetSelected(BaseSelectionRule::kNo);
111 AddClassSelectionRule(csr);
115 void AddClassSelectionRule(
const ClassSelectionRule& classSel);
116 bool HasClassSelectionRules()
const {
return !fClassSelectionRules.empty(); }
117 const std::list<ClassSelectionRule>& GetClassSelectionRules()
const {
118 return fClassSelectionRules;
121 void AddFunctionSelectionRule(
const FunctionSelectionRule& funcSel);
122 bool HasFunctionSelectionRules()
const {
123 return !fFunctionSelectionRules.empty();
125 const std::list<FunctionSelectionRule>& GetFunctionSelectionRules()
const {
126 return fFunctionSelectionRules;
129 void AddVariableSelectionRule(
const VariableSelectionRule& varSel);
131 bool HasVariableSelectionRules()
const {
132 return !fVariableSelectionRules.empty();
134 const std::list<VariableSelectionRule>& GetVariableSelectionRules()
const {
135 return fVariableSelectionRules;
138 void AddEnumSelectionRule(
const EnumSelectionRule& enumSel);
139 bool HasEnumSelectionRules()
const {
return !fEnumSelectionRules.empty(); }
140 const std::list<EnumSelectionRule>& GetEnumSelectionRules()
const {
141 return fEnumSelectionRules;
144 void PrintSelectionRules()
const;
146 void ClearSelectionRules();
148 void SetHasFileNameRule(
bool file_rule) { fHasFileNameRule = file_rule; }
149 bool GetHasFileNameRule()
const {
return fHasFileNameRule; }
151 int CheckDuplicates();
156 const ClassSelectionRule *IsDeclSelected(
const clang::RecordDecl* D)
const;
157 const ClassSelectionRule *IsDeclSelected(
const clang::TypedefNameDecl* D)
const;
158 const ClassSelectionRule *IsDeclSelected(
const clang::NamespaceDecl* D)
const;
159 const BaseSelectionRule *IsDeclSelected(
const clang::EnumDecl* D)
const;
160 const BaseSelectionRule *IsDeclSelected(
const clang::VarDecl* D)
const;
161 const BaseSelectionRule *IsDeclSelected(
const clang::FieldDecl* D)
const;
162 const BaseSelectionRule *IsDeclSelected(
const clang::FunctionDecl* D)
const;
163 const BaseSelectionRule *IsDeclSelected(
const clang::Decl* D)
const;
165 const ClassSelectionRule *IsClassSelected(
const clang::Decl* D,
const std::string& qual_name)
const;
166 const ClassSelectionRule *IsNamespaceSelected(
const clang::Decl* D,
const std::string& qual_name)
const;
170 const BaseSelectionRule *IsVarSelected(
const clang::VarDecl* D,
const std::string& qual_name)
const;
171 const BaseSelectionRule *IsFunSelected(
const clang::FunctionDecl* D,
const std::string& qual_name)
const;
172 const BaseSelectionRule *IsEnumSelected(
const clang::EnumDecl* D,
const std::string& qual_name)
const;
173 const BaseSelectionRule *IsLinkdefVarSelected(
const clang::VarDecl* D,
const std::string& qual_name)
const;
174 const BaseSelectionRule *IsLinkdefFunSelected(
const clang::FunctionDecl* D,
const std::string& qual_name)
const;
175 const BaseSelectionRule *IsLinkdefEnumSelected(
const clang::EnumDecl* D,
const std::string& qual_name)
const;
178 const BaseSelectionRule *IsMemberSelected(
const clang::Decl* D,
const std::string& str_name)
const;
179 const BaseSelectionRule *IsLinkdefMethodSelected(
const clang::Decl* D,
const std::string& qual_name)
const;
182 unsigned int Size()
const{
return fClassSelectionRules.size()+
183 fFunctionSelectionRules.size()+
184 fVariableSelectionRules.size()+
185 fEnumSelectionRules.size();};
188 bool IsParentClass(
const clang::Decl* D)
const;
191 bool IsParentClass(
const clang::Decl* D, std::string& parent_name, std::string& parent_qual_name)
const;
194 bool GetParentName(
const clang::Decl* D, std::string& parent_name, std::string& parent_qual_name)
const;
201 bool GetDeclName(
const clang::Decl* D, std::string& name, std::string& qual_name)
const;
204 void GetDeclQualName(
const clang::Decl* D, std::string& qual_name)
const;
207 bool GetFunctionPrototype(
const clang::FunctionDecl* F, std::string& prototype)
const;
209 bool IsSelectionXMLFile()
const {
210 return fSelectionFileType == kSelectionXMLFile;
212 bool IsLinkdefFile()
const {
213 return fSelectionFileType == kLinkdefFile;
215 void SetSelectionFileType(ESelectionFileTypes fileType) {
216 fSelectionFileType = fileType;
220 bool AreAllSelectionRulesUsed()
const;
224 bool SearchNames(cling::Interpreter &interp);
229 std::list<ClassSelectionRule> fClassSelectionRules;
230 std::list<FunctionSelectionRule> fFunctionSelectionRules;
231 std::list<VariableSelectionRule> fVariableSelectionRules;
232 std::list<EnumSelectionRule> fEnumSelectionRules;
234 ESelectionFileTypes fSelectionFileType;
236 bool fHasFileNameRule;
237 long int fRulesCounter;
239 ROOT::TMetaUtils::TNormalizedCtxt& fNormCtxt;
240 cling::Interpreter &fInterp;