string Doxygen::getQualifiedPrototype(SgNode *node) { SgClassDeclaration *cd = dynamic_cast<SgClassDeclaration *>(node); if (cd) return getProtoName(cd); SgUnparse_Info info; info.set_SkipSemiColon(); info.set_SkipFunctionDefinition(); info.set_forceQualifiedNames(); info.set_skipCheckAccess(); info.set_SkipClassSpecifier(); info.set_SkipInitializer(); info.set_current_scope(TransformationSupport::getGlobalScope(node)); string proto = node->unparseToString(&info); while (proto[proto.size()-1] == '\n') { /* sometimes the prototype will be unparsed with a newline at the end */ proto.resize(proto.size()-1); } return proto; }
void POETAstInterface::unparse(POETCode_ext* n, std::ostream& out, int align) { static SgUnparse_Info info; static Unparser* roseUnparser = 0; static POETCode* linebreak=ASTFactory::inst()->new_string("\n"); static POETCode* comma=ASTFactory::inst()->new_string(","); static bool template_only=false; static POETCode* left_over = 0; SgNode * input = (SgNode*)n->get_content(); POETCode* res = POETAstInterface::find_Ast2POET(input); if (res == n) { if (template_only && input->variantT() == V_SgFunctionDeclaration) { left_over = LIST(n,left_over); } else { std::string res = input->unparseToCompleteString(); out << res; } } else { if (roseUnparser == 0) { /* QY/2013: copied from the global unparseFile to use a different ostream and delegate*/ bool UseAutoKeyword = false; bool generateLineDirectives = true; bool useOverloadedOperators = false; bool num = false; bool _this = true; bool caststring = false; bool _debug = false; bool _class = false; bool _forced_transformation_format = false; bool _unparse_includes = false; Unparser_Opt roseOptions( UseAutoKeyword, generateLineDirectives, useOverloadedOperators, num, _this, caststring, _debug, _class, _forced_transformation_format, _unparse_includes ); roseUnparser = new Unparser(&out, "", roseOptions); } switch (input->variantT()) { case V_SgSourceFile: { SgSourceFile* f = isSgSourceFile(input); info.set_current_scope(f->get_globalScope()); template_only = true; code_gen(out, n->get_children(), 0, 0, align); template_only = false; if (left_over != 0) { code_gen(out, left_over, 0, 0, align); left_over = 0; } break; } case V_SgFunctionDeclaration: if (template_only) { left_over = LIST(n, left_over); break; } case V_SgTemplateInstantiationFunctionDecl: { SgFunctionDeclaration* d = isSgFunctionDeclaration(input); roseUnparser->u_exprStmt->unparseAttachedPreprocessingInfo(d,info,PreprocessingInfo::before); POETCode_ext_delegate repl(n, out); roseUnparser->repl = &repl; roseUnparser->u_exprStmt->unparseFuncDeclStmt(d, info); break; } case V_SgFunctionDefinition: { SgStatement* d = isSgStatement(input); POETCode_ext_delegate repl(n, out); roseUnparser->repl = &repl; roseUnparser->u_exprStmt->unparseStatement(d, info); assert(n->get_children() != n); out << "{"; code_gen(out, linebreak, 0, 0, align + 2); code_gen(out, n->get_children(), 0, linebreak, align+2); code_gen(out, linebreak, 0, 0, align); out << "}"; break; } case V_SgPragmaDeclaration: { out << "#pragma "; POETTuple* c = dynamic_cast<POETTuple*>(n->get_children()); assert(c != 0); code_gen(out, c->get_entry(0)); roseUnparser->cur << " "; roseUnparser->cur.insert_newline(1,align); code_gen(out, c->get_entry(1), 0, 0, align); break; } case V_SgForStatement: { out << "for (" ; POETTuple* c = dynamic_cast<POETTuple*>(n->get_children()); assert(c != 0); code_gen(out, c->get_entry(0)); code_gen(out, c->get_entry(1)); out << ";"; code_gen(out, c->get_entry(2)); out << ")"; break; } case V_SgExprStatement: code_gen(out, n->get_children(), 0, 0, align); out << ";"; break; case V_SgTemplateInstantiationMemberFunctionDecl: break; default: std::cerr << "Unsupported unparsing for : " << input->class_name() << input->unparseToString() << "\n"; //assert(0); } } }
void generateModFile(SgFile *sfile) { ROSE_ASSERT(sfile != NULL); // file name, with full path. string originalModuleFilenameWithPath = sfile->get_file_info()->get_filenameString(); #if 0 // DQ (10/24/2010): This is overly restrictive...we still want to generate the rmod file. // It does not matter is we compile or not compile any generated file. This premature // exit will cause F03 code to fail to be processed by ROSE since any mod file required // will not generated. // FMZ (10/28/2009): don't generate the .rmod for the readin .rmod file if (sfile->get_skipfinalCompileStep() == true) { if (SgProject::get_verbose() > 0) printf ("Skipping generation of rmod file: %s \n",originalModuleFilenameWithPath.c_str()); return; } #endif // Cause the output of a message with verbose level is turned on. if (SgProject::get_verbose() > 0) { printf ("In generateModFile(): Generating a Fortran 90 specific module (*.rmod file) for file = %s \n",originalModuleFilenameWithPath.c_str()); } // Get the list of SgModuleStatement objects for the current AST. Rose_STL_Container<SgNode*> moduleDeclarationList = NodeQuery::querySubTree (sfile,V_SgModuleStatement); #if 0 // DQ: I think this case is not required since the loop (below) would be empty. if (moduleDeclarationList.empty()) { // no module in the file return; } #endif for (Rose_STL_Container<SgNode*>::iterator i = moduleDeclarationList.begin(); i != moduleDeclarationList.end(); i++) { // For a module named "xx" generate a file "xx.rose_mod" which contains // all the variable definitions and function declarations SgModuleStatement* module_stmt = isSgModuleStatement(*i); ROSE_ASSERT(module_stmt != NULL); string outputDir = get_rmod_dir(sfile); string outputFilename; if (outputDir !="") outputFilename =outputDir + module_stmt->get_name() + MOD_FILE_SUFFIX; else outputFilename = module_stmt->get_name() + MOD_FILE_SUFFIX; string lowerCaseOutputFilename = StringUtility::convertToLowerCase(outputFilename); // Cause the output of a message with verbose level is turned on. if (SgProject::get_verbose() > 0) { printf ("In generateModFile() (loop over module declarations): Generating a Fortran 90 specific module file %s for module = %s \n",lowerCaseOutputFilename.c_str(),outputFilename.c_str()); } // Use a lower case generate filename for the generated ROSE mod (or rmod) file. // fstream Module_OutputFile(outputFilename.c_str(),ios::out); fstream Module_OutputFile(lowerCaseOutputFilename.c_str(),ios::out); if (!Module_OutputFile) { cout << "Error detected in opening file " << lowerCaseOutputFilename.c_str() << "for output" << endl; ROSE_ASSERT(false); } // Output header at the top of the generate *.rmod file. Module_OutputFile << endl << "! =================================================================================== \n" << "! <<Automatically generated for Rose Fortran Separate Compilation, DO NOT MODIFY IT>> \n" << "! =================================================================================== \n" << endl; SgUnparse_Info ninfo; ninfo.set_current_scope((SgScopeStatement*)module_stmt); ninfo.set_SkipFormatting(); // set the flag bit "outputFortranModFile" ninfo.set_outputFortranModFile(); ostringstream outputString; Unparser_Opt options(false, false,false,false,true,false,false,false,false,false); // This is a confusing use of originalModuleFilename vs. outputFilename (Oh, the first one has the full path!). // The originalModuleFilename will be used to build a FortranCodeGeneration_locatedNode using // the originalModuleFilename as a basis. // printf ("originalModuleFilenameWithPath = %s outputFilename = %s \n",originalModuleFilenameWithPath.c_str(),outputFilename.c_str()); Unparser unp(&Module_OutputFile, originalModuleFilenameWithPath,options,NULL,NULL); unp.currentFile = sfile; // The outputFilename is the name that will be matched against in the selection of statements to unparse. // However, that its suffix is ".rmod" will cause UnparseLanguageIndependentConstructs::statementFromFile() // to always return true. So use of outputFilename should map to the file from the file constructed. FortranCodeGeneration_locatedNode myunp(&unp, outputFilename); // This calls the unparser for just the module declaration. myunp.unparseClassDeclStmt_module((SgStatement*)module_stmt,(SgUnparse_Info&)ninfo); Module_OutputFile.flush(); Module_OutputFile.close(); } }