Example #1
0
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;
}
Example #2
0
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;
}