13#include "clang/AST/ASTConsumer.h" 
   14#include "clang/Basic/SourceLocation.h" 
   15#include "clang/Basic/SourceManager.h" 
   16#include "llvm/ADT/SmallSet.h" 
   17#include "clang/Sema/Sema.h" 
   18#include "clang/Frontend/CompilerInstance.h" 
   20#include "cling/Interpreter/Interpreter.h" 
   21#include "llvm/Support/Path.h" 
   27#include "llvm/ADT/StringExtras.h" 
   33   class RPredicateIsSameNamespace
 
   36      clang::NamespaceDecl *fTarget;
 
   38      RPredicateIsSameNamespace(clang::NamespaceDecl *
target) : fTarget(
target) {}
 
   48   return std::find(
v.begin(),
v.end(),
el) != 
v.end();
 
   53   return std::find(
v.begin(),
v.end(),
el) != 
v.end();
 
   61extern cling::Interpreter *
gInterp;
 
   81                    unsigned int verbose ) :
 
   82  fVerboseLevel(verbose),
 
   83  fSourceManager(nullptr),
 
   85  fRecordDeclCallback(nullptr),
 
   87  fSelectionRules(
rules),
 
 
  124   if (
auto M = D->getOwningModule()) {
 
 
  142   return *num.getRawData();
 
 
  149   return *num.getRawData();
 
 
  156   return llvm::toString(num, 10, 
true);
 
 
  163   std::string 
txt = 
"";
 
 
  172   std::ostringstream stream;
 
 
  179inline std::string 
Message(
const std::string &
msg, 
const std::string &location)
 
  181   std::string 
loc = location;
 
 
  193   const std::string message = 
Message(
msg, location);
 
  194   std::cout << message << std::endl;
 
 
  201   const std::string message = 
Message(
msg, location);
 
  202   std::cout << message << std::endl;
 
 
  209   const std::string message = 
Message(
msg, location);
 
  210   std::cout << message << std::endl;
 
 
  217   std::string 
loc = location;
 
 
  227   std::string location = 
"";
 
  228   llvm::raw_string_ostream stream(location);
 
 
  243      std::string location = 
"";
 
  244      llvm::raw_string_ostream stream(location);
 
 
  254   std::string 
name = 
"";
 
  258      name = 
ND->getQualifiedNameAsString();
 
 
  279   std::string kind = D->getDeclKindName();
 
  281   ShowInfo(
"Scan: " + kind + 
" declaration " + 
name, location);
 
 
  290   std::string kind = D->getDeclKindName();
 
 
  301   std::string kind = D->getDeclKindName();
 
 
  312   std::string kind = D->getDeclKindName();
 
 
  329   clang::Decl::Kind k = D->getKind();
 
  342      std::string kind = D->getDeclKindName();
 
  344      std::string 
msg = 
"Unimplemented ";
 
  346         msg +=  
"declaration";
 
 
  363   std::string kind = 
qual_type.getTypePtr()->getTypeClassName();
 
 
  372   std::string kind = 
qual_type.getTypePtr()->getTypeClassName();
 
 
  380   std::string 
enum_name = D->getQualifiedNameAsString();
 
  382   if (! D->getDeclName ()) {
 
 
  407   std::string 
text = 
"";
 
  408   llvm::raw_string_ostream stream(
text);
 
 
  422   std::string 
text = 
"";
 
  423   llvm::raw_string_ostream stream(
text);
 
 
  436   for (clang::FunctionDecl::param_iterator 
I = D->param_begin(), E = D->param_end(); 
I != E; ++
I) {
 
  437      clang::ParmVarDecl* P = *
I;
 
  442      std::string 
type = P->getType().getAsString();
 
  443      std::string 
name = P->getNameAsString();
 
 
  463   for (clang::FunctionDecl::param_iterator 
I = D->param_begin(), E = D->param_end(); 
I != E; ++
I) {
 
  464      clang::ParmVarDecl* P = *
I;
 
  469      std::string 
type = P->getType().getAsString();
 
  473   return "(" + 
result + 
")";
 
 
  490   if((
N && 
N->isImplicit()) || !
N){
 
  510            std::cout<<
"\tSelected namespace -> " << 
qual_name << 
"\n";
 
 
  552      ROOT::TMetaUtils::Error(
nullptr,
"Union %s has been selected for I/O. This is not supported. Interactive usage of unions is supported, as all C++ entities, without the need of dictionaries.\n",
normName.c_str());
 
  567                                    selected->RequestedRNTupleSerializationMode(),
 
  578                                    selected->RequestedRNTupleSerializationMode(),
 
  599      std::cout << 
"Selected class " 
 
  636       "Could not cast typeDecl either to RecordDecl or could not get RecordDecl underneath typedef.\n");
 
  671   const clang::CXXRecordDecl *
cxxdecl = llvm::dyn_cast<clang::CXXRecordDecl>(
recordDecl);
 
  710                              "Typedef is selected %s.\n", 
typedefNameDecl->getNameAsString().c_str());
 
  719      const clang::NamespaceDecl *
nsDecl = llvm::dyn_cast<clang::NamespaceDecl>(
recordDecl->getDeclContext());
 
  722                                 "Cannot convert context of RecordDecl called pair into a namespace.\n");
 
  727         if (
selected->HasAttributeFileName() || 
selected->HasAttributeFilePattern()) {
 
  754            std::stringstream message;
 
  757            message << 
"Attempt to select a class "<< 
normName << 
" with two rules which have incompatible attributes. " 
  758                  << 
"The attributes such as transiency might not be correctly propagated to the typesystem of ROOT.\n";
 
  760            message << 
"Conflicting rule already matched:\n";
 
  780                           "*" == 
selected->GetAttributePattern();
 
  787         auto msg = 
"Class or struct %s was selected but its dictionary cannot be generated: " 
  788                  "this is a private or protected class and this is not supported. No direct " 
  789                  "I/O operation of %s instances will be possible.\n";
 
  808   if (
auto CTSD = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(
recordDecl)) {
 
 
  818      const clang::Type *
thisType = 
info.fSelected->GetRequestedType();
 
 
  857   const clang::DeclContext *ctx = D->getDeclContext();
 
  861      const clang::NamedDecl *parent = llvm::dyn_cast<clang::NamedDecl> (ctx);
 
  862      isInStd = parent && 0 == parent->getQualifiedNameAsString().compare(0,5,
"std::");
 
 
  895   if (!D->hasGlobalStorage() ||
 
 
  942   if(clang::FunctionDecl::TemplatedKind::TK_FunctionTemplate == D->getTemplatedKind())
 
 
  963   if (D && D->isImplicit()){
 
  968      const clang::NamespaceDecl *parent = llvm::dyn_cast<clang::NamespaceDecl> (
DC);
 
  969      if (parent && 0 == parent->getQualifiedNameAsString().compare(0,5,
"std::"))
 
  973   for (DeclContext::decl_iterator 
Child = 
DC->decls_begin(), 
ChildEnd = 
DC->decls_end();
 
 
  989      name = 
N->getNameAsString();
 
 
 1005      llvm::raw_string_ostream stream(
qual_name);
 
 1006      N->getNameForDiagnostic(stream,D->getASTContext().getPrintingPolicy(),
true); 
 
 
 1026      for (clang::FunctionDecl::param_iterator 
I = F->param_begin(), E = F->param_end(); 
I != E; ++
I) {
 
 1027         clang::ParmVarDecl* P = *
I;
 
 1033         std::string 
type = P->getType().getAsString();
 
 1034         if (
type.at(
type.length()-1) == 
'*') {
 
 1045      ShowWarning(
"can't convert Decl to FunctionDecl",
"");
 
 
 1059      std::cout<<
"File name detected"<<std::endl;
 
 
std::string IntToStr(int num)
long APIntToLong(const llvm::APInt &num)
cling::Interpreter * gInterp
std::string AddSpace(const std::string &txt)
size_t APIntToSize(const llvm::APInt &num)
void * ToDeclProp(clang::Decl *item)
std::string APIntToStr(const llvm::APInt &num)
std::string IntToStd(int num)
std::string Message(const std::string &msg, const std::string &location)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h req_type
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Option_t Option_t TPoint TPoint const char text
TRObject operator()(const T1 &t1) const
const_iterator end() const
std::string GetLocation(clang::Decl *D) const
void Scan(const clang::ASTContext &C)
void UnknownDecl(clang::Decl *D, const std::string &txt="") const
unknown - this kind of declaration was not known to programmer
RScanner(SelectionRules &rules, EScanType stype, const cling::Interpreter &interpret, ROOT::TMetaUtils::TNormalizedCtxt &normCtxt, unsigned int verbose=0)
Regular constructor setting up the scanner to search for entities matching the 'rules'.
ROOT::TMetaUtils::TNormalizedCtxt & fNormCtxt
DeclCallback fRecordDeclCallback
void UnsupportedDecl(clang::Decl *D, const std::string &txt="") const
unsupported - this kind of declaration is probably not used (in current version of C++)
static std::map< clang::Decl *, std::string > fgAnonymousEnumMap
void UnimportantDecl(clang::Decl *D, const std::string &txt="") const
unimportant - this kind of declaration is not stored into reflex
void AddDelayedAnnotatedRecordDecls()
const clang::SourceManager * fSourceManager
static const int fgDeclLast
FunctionColl_t fSelectedFunctions
bool VisitFieldDecl(clang::FieldDecl *D)
Nothing to be done here.
void ShowInfo(const std::string &msg, const std::string &location="") const
bool TreatRecordDeclOrTypedefNameDecl(clang::TypeDecl *typeDecl)
static int fgAnonymousClassCounter
std::string FuncParameters(clang::FunctionDecl *D) const
bool fTypeTable[fgTypeLast+1]
void ShowTemplateInfo(const std::string &msg, const std::string &location="") const
std::string GetEnumName(clang::EnumDecl *D) const
NamespaceColl_t fSelectedNamespaces
bool GetFunctionPrototype(clang::Decl *D, std::string &prototype) const
std::set< clang::RecordDecl * > fselectedRecordDecls
std::string ConvTemplateName(clang::TemplateName &N) const
static int fgBadClassCounter
void UnimplementedDecl(clang::Decl *D, const std::string &txt="")
information about item, that should be implemented
bool VisitVarDecl(clang::VarDecl *D)
TypedefColl_t fSelectedTypedefs
std::string GetSrcLocation(clang::SourceLocation L) const
void(* DeclCallback)(const clang::RecordDecl *)
void UnsupportedType(clang::QualType qual_type) const
const cling::Interpreter & fInterpreter
DeclCallback SetRecordDeclCallback(DeclCallback callback)
Set the callback to the RecordDecl and return the previous one.
bool VisitNamespaceDecl(clang::NamespaceDecl *D)
This method visits a namespace node.
void ShowWarning(const std::string &msg, const std::string &location="") const
std::string GetName(clang::Decl *D) const
static int fgAnonymousEnumCounter
static const char * fgClangFuncKey
void ShowError(const std::string &msg, const std::string &location="") const
void UnexpectedDecl(clang::Decl *D, const std::string &txt="") const
unexpected - this kind of declaration is unexpected (in concrete place)
EnumColl_t fSelectedEnums
int AddAnnotatedRecordDecl(const ClassSelectionRule *, const clang::Type *, const clang::RecordDecl *, const std::string &, const clang::TypedefNameDecl *, unsigned int indexOffset=0)
std::vector< DelayedAnnotatedRecordDeclInfo > fDelayedAnnotatedRecordDecls
bool VisitEnumDecl(clang::EnumDecl *D)
static std::map< clang::Decl *, std::string > fgAnonymousClassMap
std::string FuncParameterList(clang::FunctionDecl *D) const
static bool GetDeclQualName(const clang::Decl *D, std::string &qual_name)
std::string ExprToStr(clang::Expr *expr) const
static const int fgTypeLast
SelectionRules & fSelectionRules
static const char * fgClangDeclKey
bool VisitRecordDecl(clang::RecordDecl *D)
void UnknownType(clang::QualType qual_type) const
bool fDeclTable[fgDeclLast+1]
VariableColl_t fSelectedVariables
bool VisitFunctionDecl(clang::FunctionDecl *D)
DeclsSelRulesMap_t fDeclSelRuleMap
unsigned int fVerboseLevel
bool GetDeclName(clang::Decl *D, std::string &name) const
bool TraverseDeclContextHelper(clang::DeclContext *DC)
ClassColl_t fSelectedClasses
void DeclInfo(clang::Decl *D) const
bool shouldVisitDecl(clang::NamedDecl *D)
Whether we can actually visit this declaration, i.e.
bool VisitTypedefNameDecl(clang::TypedefNameDecl *D)
Visitor for every TypedefNameDecl, i.e.
The class representing the collection of selection rules.
bool GetHasFileNameRule() const
const ClassSelectionRule * IsDeclSelected(const clang::RecordDecl *D, bool includeTypedefRule) const
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
bool areEqual< ClassSelectionRule >(const ClassSelectionRule *r1, const ClassSelectionRule *r2, bool moduloNameOrPattern)