bool ClangToSageTranslator::VisitImplicitParamDecl(clang::ImplicitParamDecl * implicit_param_decl, SgNode ** node) { #if DEBUG_VISIT_DECL std::cerr << "ClangToSageTranslator::VisitImplicitParamDecl" << std::endl; #endif bool res = true; ROSE_ASSERT(FAIL_TODO == 0); // TODO return VisitVarDecl(implicit_param_decl, node) && res; }
SgNode * ClangToSageTranslator::Traverse(clang::Decl * decl) { if (decl == NULL) return NULL; std::map<clang::Decl *, SgNode *>::iterator it = p_decl_translation_map.find(decl); if (it != p_decl_translation_map.end()) { #if DEBUG_TRAVERSE_DECL std::cerr << "Traverse Decl : " << decl << " "; if (clang::NamedDecl::classof(decl)) { std::cerr << ": " << ((clang::NamedDecl *)decl)->getNameAsString() << ") "; } std::cerr << " already visited : node = " << it->second << std::endl; #endif return it->second; } SgNode * result = NULL; bool ret_status = false; switch (decl->getKind()) { case clang::Decl::AccessSpec: ret_status = VisitAccessSpecDecl((clang::AccessSpecDecl *)decl, &result); break; case clang::Decl::Block: ret_status = VisitBlockDecl((clang::BlockDecl *)decl, &result); break; case clang::Decl::FileScopeAsm: ret_status = VisitFileScopeAsmDecl((clang::FileScopeAsmDecl *)decl, &result); break; case clang::Decl::Friend: ret_status = VisitFriendDecl((clang::FriendDecl *)decl, &result); break; case clang::Decl::FriendTemplate: ret_status = VisitFriendTemplateDecl((clang::FriendTemplateDecl *)decl, &result); break; case clang::Decl::Label: ret_status = VisitLabelDecl((clang::LabelDecl *)decl, &result); break; case clang::Decl::Namespace: ret_status = VisitNamespaceDecl((clang::NamespaceDecl *)decl, &result); break; case clang::Decl::ClassTemplate: ret_status = VisitClassTemplateDecl((clang::ClassTemplateDecl *)decl, &result); break; case clang::Decl::FunctionTemplate: ret_status = VisitFunctionTemplateDecl((clang::FunctionTemplateDecl *)decl, &result); break; case clang::Decl::TypeAliasTemplate: ret_status = VisitTypeAliasTemplateDecl((clang::TypeAliasTemplateDecl *)decl, &result); break; case clang::Decl::TemplateTemplateParm: ret_status = VisitTemplateTemplateParmDecl((clang::TemplateTemplateParmDecl *)decl, &result); break; case clang::Decl::Record: ret_status = VisitRecordDecl((clang::RecordDecl *)decl, &result); break; case clang::Decl::CXXRecord: ret_status = VisitCXXRecordDecl((clang::CXXRecordDecl *)decl, &result); break; case clang::Decl::ClassTemplateSpecialization: ret_status = VisitClassTemplateSpecializationDecl((clang::ClassTemplateSpecializationDecl *)decl, &result); break; case clang::Decl::ClassTemplatePartialSpecialization: ret_status = VisitClassTemplatePartialSpecializationDecl((clang::ClassTemplatePartialSpecializationDecl *)decl, &result); break; case clang::Decl::Enum: ret_status = VisitEnumDecl((clang::EnumDecl *)decl, &result); break; case clang::Decl::TemplateTypeParm: ret_status = VisitTemplateTypeParmDecl((clang::TemplateTypeParmDecl *)decl, &result); break; case clang::Decl::Typedef: ret_status = VisitTypedefDecl((clang::TypedefDecl *)decl, &result); break; case clang::Decl::TypeAlias: ret_status = VisitTypeAliasDecl((clang::TypeAliasDecl *)decl, &result); break; case clang::Decl::Field: ret_status = VisitFieldDecl((clang::FieldDecl *)decl, &result); break; case clang::Decl::Function: ret_status = VisitFunctionDecl((clang::FunctionDecl *)decl, &result); break; case clang::Decl::CXXMethod: ret_status = VisitCXXMethodDecl((clang::CXXMethodDecl *)decl, &result); break; case clang::Decl::CXXConstructor: ret_status = VisitCXXConstructorDecl((clang::CXXConstructorDecl *)decl, &result); break; case clang::Decl::CXXConversion: ret_status = VisitCXXConversionDecl((clang::CXXConversionDecl *)decl, &result); break; case clang::Decl::CXXDestructor: ret_status = VisitCXXDestructorDecl((clang::CXXDestructorDecl *)decl, &result); break; case clang::Decl::NonTypeTemplateParm: ret_status = VisitNonTypeTemplateParmDecl((clang::NonTypeTemplateParmDecl *)decl, &result); break; case clang::Decl::Var: ret_status = VisitVarDecl((clang::VarDecl *)decl, &result); break; case clang::Decl::ImplicitParam: ret_status = VisitImplicitParamDecl((clang::ImplicitParamDecl *)decl, &result); break; case clang::Decl::ParmVar: ret_status = VisitParmVarDecl((clang::ParmVarDecl *)decl, &result); break; case clang::Decl::EnumConstant: ret_status = VisitEnumConstantDecl((clang::EnumConstantDecl *)decl, &result); break; case clang::Decl::IndirectField: ret_status = VisitIndirectFieldDecl((clang::IndirectFieldDecl *)decl, &result); break; case clang::Decl::TranslationUnit: ret_status = VisitTranslationUnitDecl((clang::TranslationUnitDecl *)decl, &result); break; default: std::cerr << "Unknown declacaration kind: " << decl->getDeclKindName() << " !" << std::endl; ROSE_ASSERT(false); } ROSE_ASSERT(ret_status == false || result != NULL); p_decl_translation_map.insert(std::pair<clang::Decl *, SgNode *>(decl, result)); #if DEBUG_TRAVERSE_DECL std::cerr << "Traverse(clang::Decl : " << decl << " "; if (clang::NamedDecl::classof(decl)) { std::cerr << ": " << ((clang::NamedDecl *)decl)->getNameAsString() << ") "; } std::cerr << " visit done : node = " << result << std::endl; #endif return ret_status ? result : NULL; }
/// \brief Forward any DeclRefExprs to a check on the referenced variable /// declaration. bool DependencyFinderASTVisitor::VisitDeclRefExpr(DeclRefExpr *DRE) { if (VarDecl *VD = dyn_cast_or_null<VarDecl>(DRE->getDecl())) return VisitVarDecl(VD); return true; }