string nodeColor( SgStatement* statement ) { /* color: colorCode:red:on color: colorCode:orange:on color: colorCode:yellow:on color: colorCode:blue:on color: colorCode:green:on color: colorCode:violet:on color: colorCode:brown:on color: colorCode:purple:on color: colorCode:lightblue:on color: colorCode:lightgreen:on color: colorCode:lightred:on color: colorCode:black:on color: colorCode:darkblue:on color: colorCode:grey:on color: colorCode:darkgrey:on color: colorCode:olivegreen:on color: colorCode:darkgreen:on */ string returnString; SgDeclarationStatement* declarationStatement = isSgDeclarationStatement(statement); if (declarationStatement != NULL) { switch (declarationStatement->variantT()) { case V_SgFunctionDeclaration: case V_SgMemberFunctionDeclaration: case V_SgTemplateInstantiationFunctionDecl: case V_SgTemplateInstantiationMemberFunctionDecl: returnString = "orange"; break; case V_SgClassDeclaration: case V_SgTemplateInstantiationDecl: returnString = "yellow"; break; case V_SgAsmStmt: case V_SgCtorInitializerList: case V_SgEnumDeclaration: case V_SgFunctionParameterList: case V_SgNamespaceAliasDeclarationStatement: case V_SgNamespaceDeclarationStatement: case V_SgPragmaDeclaration: case V_SgTemplateDeclaration: case V_SgTemplateInstantiationDirectiveStatement: case V_SgTypedefDeclaration: case V_SgUsingDeclarationStatement: case V_SgUsingDirectiveStatement: case V_SgVariableDeclaration: case V_SgVariableDefinition: returnString = "lightred"; break; // DQ (11/11/2012): Added support for newer IR nodes in edg4x work. case V_SgTemplateMemberFunctionDeclaration: case V_SgTemplateClassDeclaration: case V_SgTemplateFunctionDeclaration: case V_SgTemplateVariableDeclaration: returnString = "red"; break; default: returnString = "ERROR DEFAULT REACHED"; printf ("Default reached in nodeColor() exiting ... (%s) \n",declarationStatement->class_name().c_str()); ROSE_ASSERT(false); break; } } SgScopeStatement* scopeStatement = isSgScopeStatement(statement); if (scopeStatement != NULL) { switch (scopeStatement->variantT()) { case V_SgBasicBlock: returnString = "lightblue"; break; case V_SgClassDefinition: returnString = "lightblue"; break; case V_SgTemplateInstantiationDefn: case V_SgFunctionDefinition: returnString = "lightblue"; break; case V_SgWhileStmt: case V_SgDoWhileStmt: case V_SgForStatement: returnString = "darkblue"; break; case V_SgGlobal: case V_SgIfStmt: case V_SgNamespaceDefinitionStatement: case V_SgSwitchStatement: case V_SgCatchOptionStmt: returnString = "black"; break; // DQ (11/11/2012): Added support for newer IR nodes in edg4x work. case V_SgTemplateClassDefinition: case V_SgTemplateFunctionDefinition: returnString = "red"; break; default: returnString = "ERROR DEFAULT REACHED"; printf ("Default reached in nodeColor() exiting ... (%s) \n",scopeStatement->class_name().c_str()); ROSE_ASSERT(false); break; } } if (scopeStatement == NULL && declarationStatement == NULL) { switch (statement->variantT()) { case V_SgExprStatement: returnString = "violet"; break; case V_SgBreakStmt: case V_SgCaseOptionStmt: case V_SgCatchStatementSeq: case V_SgContinueStmt: case V_SgDefaultOptionStmt: case V_SgClinkageStartStatement: case V_SgForInitStatement: case V_SgFunctionTypeTable: case V_SgGotoStatement: case V_SgLabelStatement: case V_SgNullStatement: case V_SgReturnStmt: case V_SgSpawnStmt: case V_SgTryStmt: case V_SgVariantStatement: returnString = "brown"; break; default: returnString = "ERROR DEFAULT REACHED"; printf ("Default reached in nodeColor() exiting ... (%s) \n",statement->class_name().c_str()); ROSE_ASSERT(false); break; } } return returnString; }
//return name for various named constructs string roseNode::getName() const { string result; ROSE_ASSERT(mNode!=NULL); // only declarations with symbols in ROSE have user-level names // need to double check this if (isSgFile(mNode)) { return isSgFile(mNode)->get_file_info()->get_filenameString (); } else if (isSgProject(mNode)) { // No name field for rose projects return ""; } else if (isSgFunctionDefinition(mNode)) { SgFunctionDefinition* def = isSgFunctionDefinition(mNode); return (def->get_declaration()->search_for_symbol_from_symbol_table()->get_name()).getString(); } SgDeclarationStatement* decl = isSgDeclarationStatement(mNode); if (decl) { switch (decl->variantT()) { case V_SgVariableDeclaration: { SgVariableSymbol * symbol=SageInterface::getFirstVarSym(isSgVariableDeclaration(decl)); result = symbol->get_name(); break; } case V_SgClassDeclaration: case V_SgTypedefDeclaration: case V_SgNamespaceDeclarationStatement: case V_SgFunctionDeclaration: case V_SgTemplateDeclaration: case V_SgMemberFunctionDeclaration: { result = (decl->search_for_symbol_from_symbol_table()->get_name()).getString(); ROSE_ASSERT(result.length()!=0); break; } // No explicit name available case V_SgCtorInitializerList: case V_SgPragmaDeclaration: case V_SgFunctionParameterList: case V_SgUsingDirectiveStatement: case V_SgStmtDeclarationStatement: { break; } default: { cerr<<"error, unhandled declaration type in roseNode::getName(): "<<mNode->class_name()<<endl; ROSE_ASSERT(false); break; } }// end switch } return result ; }
bool isDeclaredVirtualWithinClassAncestry(SgFunctionDeclaration *functionDeclaration, SgClassDefinition *classDefinition) { SgType *functionType = functionDeclaration->get_type(); ROSE_ASSERT(functionType != NULL); // Look in each of the class' parent classes. SgBaseClassPtrList & baseClassList = classDefinition->get_inheritances(); for (SgBaseClassPtrList::iterator i = baseClassList.begin(); i != baseClassList.end(); ++i) { SgBaseClass *baseClass = *i; ROSE_ASSERT(baseClass != NULL); SgClassDeclaration *classDeclaration = baseClass->get_base_class(); ROSE_ASSERT(classDeclaration != NULL); SgDeclarationStatement *definingDecl = classDeclaration->get_definingDeclaration(); if ( definingDecl == NULL ) continue; SgClassDeclaration *definingClassDeclaration = isSgClassDeclaration(definingDecl); ROSE_ASSERT(classDeclaration != NULL); SgClassDefinition *parentClassDefinition = definingClassDeclaration->get_definition(); if ( parentClassDefinition == NULL ) continue; // Visit all methods in the parent class. SgDeclarationStatementPtrList &members = parentClassDefinition->get_members(); bool isDeclaredVirtual = false; for (SgDeclarationStatementPtrList::iterator it = members.begin(); it != members.end(); ++it) { SgDeclarationStatement *declarationStatement = *it; ROSE_ASSERT(declarationStatement != NULL); switch(declarationStatement->variantT()) { case V_SgMemberFunctionDeclaration: { SgMemberFunctionDeclaration *memberFunctionDeclaration = isSgMemberFunctionDeclaration(declarationStatement); if ( isVirtual(memberFunctionDeclaration) ) { SgType *parentMemberFunctionType = memberFunctionDeclaration->get_type(); ROSE_ASSERT(parentMemberFunctionType != NULL); if ( parentMemberFunctionType == functionType ) { return true; } } break; } default: { break; } } } if ( isDeclaredVirtualWithinClassAncestry(functionDeclaration, parentClassDefinition) ) { return true; } } return false; }