trick/trick_source/codegen/Interface_Code_Gen/EnumVisitor.cpp
Alex Lin d875f837f2 ICG produces non-compilable io_* code for this weird example #334
When saving the list of namespaces and classes a particular type is contained in
we have to save the class name and any template args it includes separately.  This
allows us to mangle the names easier.  And we now search for type names to see
if they follow this pattern template_name<template_args>::embedded_class.  If
we are using a template embedded class we need to create attributes for the embedded class.
2016-11-02 13:56:40 -05:00

80 lines
2.5 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <sstream>
#include <algorithm>
#include "llvm/Support/CommandLine.h"
#include "EnumVisitor.hh"
#include "EnumValues.hh"
#include "Utilities.hh"
extern llvm::cl::opt< int > debug_level ;
EnumVisitor::EnumVisitor( clang::CompilerInstance & in_ci , HeaderSearchDirs & in_hsd ) :
ci(in_ci) , hsd(in_hsd) {
//eval = new EnumValues() ;
}
bool EnumVisitor::VisitDecl(clang::Decl *d) {
//std::cout << "\nEnum Decl = " << d->getDeclKindName() << "" << std::endl ;
return true ;
}
bool EnumVisitor::VisitType(clang::Type *t) {
//std::cout << "\nEnum Type = " << t->getTypeClassName() << "" << std::endl ;
return true;
}
bool EnumVisitor::VisitEnumDecl(clang::EnumDecl *ed) {
eval.setFileName(getFileName(ci , ed->getSourceRange().getEnd(), hsd)) ;
return true;
}
bool EnumVisitor::VisitEnumType(clang::EnumType *et) {
clang::TagDecl * td = et->getDecl() ;
eval.setName(td->getName().str()) ;
if ( debug_level >= 3 ) {
std::cout << "EnumVisitor VisitEnumType " << std::endl ;
std::cout << "eval.getName() = " << eval.getName() << std::endl ;
std::cout << "td->getName() = " << td->getName().str() << std::endl ;
}
if ( eval.getName().empty() ) {
std::string enum_type_name = et->desugar().getAsString() ;
size_t pos ;
// If this enumeration is anonymous return an error condition
if ((pos = enum_type_name.find("<anonymous")) != std::string::npos or
(pos = enum_type_name.find("(anonymous")) != std::string::npos) {
eval.setName("") ;
return false ;
}
if ((pos = enum_type_name.find("enum ")) != std::string::npos ) {
enum_type_name.erase(pos , 5) ;
}
// Strip off containing namespace/class names. They will be added back later.
if ((pos = enum_type_name.find_last_of(":")) != std::string::npos ) {
eval.setName(enum_type_name.substr(pos + 1)) ;
} else {
eval.setName(enum_type_name) ;
}
//std::cout << "\nReplaced Enum name = " << eval->getName() << "" << std::endl ;
}
eval.getNamespacesAndClasses(td->getDeclContext()) ;
return true ;
}
bool EnumVisitor::VisitEnumConstantDecl(clang::EnumConstantDecl *ecd) {
//std::cout << ecd->getName().str() << " = " << ecd->getInitVal().getSExtValue() << std::endl ;
eval.addEnum(ecd->getName().str() , ecd->getInitVal().getSExtValue()) ;
return true ;
}
EnumValues * EnumVisitor::get_enum_data() {
return &eval ;
}