Logo ROOT   6.18/05
Reference Guide
SelectionRules.h
Go to the documentation of this file.
1// @(#)root/core/utils:$Id: SelectionRules.h 28529 2009-05-11 16:43:35Z pcanal $
2// Author: Velislava Spasova September 2010
3
4/*************************************************************************
5 * Copyright (C) 1995-2011, Rene Brun, Fons Rademakers and al. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef R__SELECTIONRULES_H
13#define R__SELECTIONRULES_H
14
15#include <list>
16#include "BaseSelectionRule.h"
17#include "ClassSelectionRule.h"
19#include "clang/AST/Decl.h"
20
21#include "TClingUtils.h"
22
23namespace cling {
24 class Interpreter;
25}
26
27namespace ROOT{
28 namespace TMetaUtils {
29 class TNormalizedCtxt;
30 }
31}
32#include <iostream>
34
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;
45 }
46 }
47 else {
48 return !(c1 != c2);
49 }
50 return true;
51 }
52
53 template<class RULE>
54 inline bool areEqual(const RULE* r1, const RULE* r2, bool moduloNameOrPattern = false){
55 return areEqualAttributes(r1->GetAttributes(), r2->GetAttributes(), moduloNameOrPattern);
56 }
57
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;
67 }
68 return true;
69 }
70 template<>
72 const ClassSelectionRule* r2,
73 bool moduloNameOrPattern){
74 if (!areEqualAttributes(r1->GetAttributes(), r2->GetAttributes(),moduloNameOrPattern)) return false;
75 // Now check fields
78 true)) return false;
79 // On the same footing, now check methods
82 true)) return false;
83 return true;
84 }
85}
86
87
89
90public:
91 /// Type of selection file
96 };
97
98 SelectionRules(cling::Interpreter &interp,
99 ROOT::TMetaUtils::TNormalizedCtxt& normCtxt,
100 const std::vector<std::pair<std::string,std::string>>& namesForExclusion):
102 fIsDeep(false),
103 fHasFileNameRule(false),
104 fRulesCounter(0),
105 fNormCtxt(normCtxt),
106 fInterp(interp) {
107 long counter=1;
108 for (auto& attrValPair : namesForExclusion){
109 ClassSelectionRule csr(counter++, fInterp);
110 csr.SetAttributeValue(attrValPair.first, attrValPair.second);
113 }
114 }
115
116 void AddClassSelectionRule(const ClassSelectionRule& classSel);
117 bool HasClassSelectionRules() const { return !fClassSelectionRules.empty(); }
118 const std::list<ClassSelectionRule>& GetClassSelectionRules() const {
120 }
121
124 return !fFunctionSelectionRules.empty();
125 }
126 const std::list<FunctionSelectionRule>& GetFunctionSelectionRules() const {
128 }
129
131
133 return !fVariableSelectionRules.empty();
134 }
135 const std::list<VariableSelectionRule>& GetVariableSelectionRules() const {
137 }
138
139 void AddEnumSelectionRule(const EnumSelectionRule& enumSel);
140 bool HasEnumSelectionRules() const { return !fEnumSelectionRules.empty(); }
141 const std::list<EnumSelectionRule>& GetEnumSelectionRules() const {
142 return fEnumSelectionRules;
143 }
144
145 void PrintSelectionRules() const; // print all selection rules
146
147 void ClearSelectionRules(); // clear all selection rules
148
149 void SetHasFileNameRule(bool file_rule) { fHasFileNameRule = file_rule; }
150 bool GetHasFileNameRule() const { return fHasFileNameRule; }
151
152 int CheckDuplicates();
153 void Optimize();
154
155 void SetDeep(bool deep);
156 bool GetDeep() const { return fIsDeep; }
157
158 // These method are called from clr-scan and return true if the Decl selected, false otherwise
159 //const BaseSelectionRule *IsDeclSelected(clang::Decl* D) const;
160 const ClassSelectionRule *IsDeclSelected(const clang::RecordDecl* D) const;
161 const ClassSelectionRule *IsDeclSelected(const clang::TypedefNameDecl* D) const;
162 const ClassSelectionRule *IsDeclSelected(const clang::NamespaceDecl* D) const;
163 const BaseSelectionRule *IsDeclSelected(const clang::EnumDecl* D) const;
164 const BaseSelectionRule *IsDeclSelected(const clang::VarDecl* D) const;
165 const BaseSelectionRule *IsDeclSelected(const clang::FieldDecl* D) const;
166 const BaseSelectionRule *IsDeclSelected(const clang::FunctionDecl* D) const;
167 const BaseSelectionRule *IsDeclSelected(const clang::Decl* D) const;
168
169 const ClassSelectionRule *IsClassSelected(const clang::Decl* D, const std::string& qual_name) const; // is the class selected
170 const ClassSelectionRule *IsNamespaceSelected(const clang::Decl* D, const std::string& qual_name) const; // is the class selected
171
172 // is the global function, variable, enum selected - the behavior is different for linkdef.h and selection.xml - that's why
173 // we have two functions
174 const BaseSelectionRule *IsVarSelected(const clang::VarDecl* D, const std::string& qual_name) const;
175 const BaseSelectionRule *IsFunSelected(const clang::FunctionDecl* D, const std::string& qual_name) const;
176 const BaseSelectionRule *IsEnumSelected(const clang::EnumDecl* D, const std::string& qual_name) const;
177 const BaseSelectionRule *IsLinkdefVarSelected(const clang::VarDecl* D, const std::string& qual_name) const;
178 const BaseSelectionRule *IsLinkdefFunSelected(const clang::FunctionDecl* D, const std::string& qual_name) const;
179 const BaseSelectionRule *IsLinkdefEnumSelected(const clang::EnumDecl* D, const std::string& qual_name) const;
180
181 // is member (field, method, enum) selected; the behavior for linkdef.h methods is different
182 const BaseSelectionRule *IsMemberSelected(const clang::Decl* D, const std::string& str_name) const;
183 const BaseSelectionRule *IsLinkdefMethodSelected(const clang::Decl* D, const std::string& qual_name) const;
184
185 // Return the number of rules
186 unsigned int Size() const{return fClassSelectionRules.size()+
189 fEnumSelectionRules.size();};
190
191 // returns true if the parent is class or struct
192 bool IsParentClass(const clang::Decl* D) const;
193
194 // the same but returns also the parent name and qualified name
195 bool IsParentClass(const clang::Decl* D, std::string& parent_name, std::string& parent_qual_name) const;
196
197 // returns the parent name and qualified name
198 bool GetParentName(const clang::Decl* D, std::string& parent_name, std::string& parent_qual_name) const;
199
200
201 //bool getParent(clang::Decl* D, clang::Decl* parent); - this method would have saved a lot of efforts but it crashes
202 // and I didn't understand why
203
204 // gets the name and qualified name of the Decl
205 bool GetDeclName(const clang::Decl* D, std::string& name, std::string& qual_name) const;
206
207 // gets the qualname of the decl, no checks performed
208 void GetDeclQualName(const clang::Decl* D, std::string& qual_name) const;
209
210 // gets the function prototype if the Decl (if it is global function or method)
211 bool GetFunctionPrototype(const clang::FunctionDecl* F, std::string& prototype) const;
212
213 bool IsSelectionXMLFile() const {
215 }
216 bool IsLinkdefFile() const {
218 }
220 fSelectionFileType = fileType;
221 }
222
223 // returns true if all selection rules are used at least once
224 bool AreAllSelectionRulesUsed() const;
225
226 // Go through all the selections rules and lookup the name if any in the AST.
227 // and force the instantiation of template if any are used in the rules.
228 bool SearchNames(cling::Interpreter &interp);
229
230 void FillCache(); // Fill the cache of all selection rules
231
232private:
233 std::list<ClassSelectionRule> fClassSelectionRules; ///< List of the class selection rules
234 std::list<FunctionSelectionRule> fFunctionSelectionRules; ///< List of the global functions selection rules
235 std::list<VariableSelectionRule> fVariableSelectionRules; ///< List of the global variables selection rules
236 std::list<EnumSelectionRule> fEnumSelectionRules; ///< List of the enums selection rules
237
239
240 bool fIsDeep; ///< if --deep option passed from command line, this should be set to true
241 bool fHasFileNameRule; ///< if we have a file name rule, this should be set to true
243
244 ROOT::TMetaUtils::TNormalizedCtxt& fNormCtxt;
245 cling::Interpreter &fInterp;
246
247};
248
249#endif
char name[80]
Definition: TGX11.cxx:109
void SetAttributeValue(const std::string &attributeName, const std::string &attributeValue)
void SetSelected(ESelect sel)
const AttributesMap_t & GetAttributes() const
const std::list< FunctionSelectionRule > & GetMethodSelectionRules() const
const std::list< VariableSelectionRule > & GetFieldSelectionRules() const
The class representing the collection of selection rules.
bool fIsDeep
if –deep option passed from command line, this should be set to true
const ClassSelectionRule * IsDeclSelected(const clang::RecordDecl *D) const
SelectionRules(cling::Interpreter &interp, ROOT::TMetaUtils::TNormalizedCtxt &normCtxt, const std::vector< std::pair< std::string, std::string > > &namesForExclusion)
bool HasFunctionSelectionRules() const
const BaseSelectionRule * IsLinkdefVarSelected(const clang::VarDecl *D, const std::string &qual_name) const
const std::list< ClassSelectionRule > & GetClassSelectionRules() const
void GetDeclQualName(const clang::Decl *D, std::string &qual_name) const
const BaseSelectionRule * IsVarSelected(const clang::VarDecl *D, const std::string &qual_name) const
const BaseSelectionRule * IsFunSelected(const clang::FunctionDecl *D, const std::string &qual_name) const
void AddVariableSelectionRule(const VariableSelectionRule &varSel)
bool HasEnumSelectionRules() const
void AddClassSelectionRule(const ClassSelectionRule &classSel)
std::list< VariableSelectionRule > fVariableSelectionRules
List of the global variables selection rules.
bool AreAllSelectionRulesUsed() const
ESelectionFileTypes fSelectionFileType
long int fRulesCounter
void SetDeep(bool deep)
bool GetFunctionPrototype(const clang::FunctionDecl *F, std::string &prototype) const
bool SearchNames(cling::Interpreter &interp)
bool GetParentName(const clang::Decl *D, std::string &parent_name, std::string &parent_qual_name) const
std::list< FunctionSelectionRule > fFunctionSelectionRules
List of the global functions selection rules.
const BaseSelectionRule * IsLinkdefFunSelected(const clang::FunctionDecl *D, const std::string &qual_name) const
std::list< EnumSelectionRule > fEnumSelectionRules
List of the enums selection rules.
void PrintSelectionRules() const
bool GetHasFileNameRule() const
bool GetDeep() const
ROOT::TMetaUtils::TNormalizedCtxt & fNormCtxt
bool HasClassSelectionRules() const
bool IsLinkdefFile() const
bool GetDeclName(const clang::Decl *D, std::string &name, std::string &qual_name) const
const std::list< FunctionSelectionRule > & GetFunctionSelectionRules() const
unsigned int Size() const
bool fHasFileNameRule
if we have a file name rule, this should be set to true
ESelectionFileTypes
Type of selection file.
void AddEnumSelectionRule(const EnumSelectionRule &enumSel)
const std::list< EnumSelectionRule > & GetEnumSelectionRules() const
const BaseSelectionRule * IsMemberSelected(const clang::Decl *D, const std::string &str_name) const
bool IsSelectionXMLFile() const
const std::list< VariableSelectionRule > & GetVariableSelectionRules() const
void ClearSelectionRules()
bool IsParentClass(const clang::Decl *D) const
const BaseSelectionRule * IsLinkdefEnumSelected(const clang::EnumDecl *D, const std::string &qual_name) const
void AddFunctionSelectionRule(const FunctionSelectionRule &funcSel)
const ClassSelectionRule * IsClassSelected(const clang::Decl *D, const std::string &qual_name) const
bool HasVariableSelectionRules() const
const BaseSelectionRule * IsEnumSelected(const clang::EnumDecl *D, const std::string &qual_name) const
const ClassSelectionRule * IsNamespaceSelected(const clang::Decl *D, const std::string &qual_name) const
std::list< ClassSelectionRule > fClassSelectionRules
List of the class selection rules.
cling::Interpreter & fInterp
void SetHasFileNameRule(bool file_rule)
void SetSelectionFileType(ESelectionFileTypes fileType)
const BaseSelectionRule * IsLinkdefMethodSelected(const clang::Decl *D, const std::string &qual_name) const
return c1
Definition: legend1.C:41
return c2
Definition: legend2.C:14
#define F(x, y, z)
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
bool areEqualColl(const RULESCOLLECTION &r1, const RULESCOLLECTION &r2, bool moduloNameOrPattern=false)
bool areEqual(const RULE *r1, const RULE *r2, bool moduloNameOrPattern=false)
bool areEqualAttributes(const ASSOCIATIVECONTAINER &c1, const ASSOCIATIVECONTAINER &c2, bool moduloNameOrPattern)
bool areEqual< ClassSelectionRule >(const ClassSelectionRule *r1, const ClassSelectionRule *r2, bool moduloNameOrPattern)