-int main(int argc, char *argv[])
-{
- llvm::cl::ParseCommandLineOptions(argc, argv);
- std::cout<<"Input file: "<<inputFilename<<"\n";
- DiagnosticOptions diagnosticOptions;
- TextDiagnosticPrinter *tdp = new TextDiagnosticPrinter(llvm::nulls(), diagnosticOptions);
- llvm::IntrusiveRefCntPtr<DiagnosticIDs> dis(new DiagnosticIDs());
- Diagnostic diag(dis,tdp);
- FileSystemOptions fileSysOpt;
- LangOptions lang;
- lang.BCPLComment=1;
- lang.CPlusPlus=1;
- FileManager fm (fileSysOpt);
+ void find_return_stmt(Stmt *statemt,string event) /** Traverse all statements in function for finding all return Statements.*/
+ {
+ if(statemt->getStmtClass() == 99) test_stmt(dyn_cast<CaseStmt>(statemt)->getSubStmt(), event);
+ else
+ {
+ for (Stmt::child_range range = statemt->children(); range; ++range)
+ {
+ test_stmt(*range, event);
+ }
+ }
+ }
+
+ void test_stmt(Stmt *stmt, string event) /** test statement for its kind Using number as identifier for all Statement Classes.*/
+ {
+ const SourceManager &sman = fsloc->getManager();
+ int type;
+ string line, param;
+ type = stmt->getStmtClass();
+ switch(type)
+ {
+ case 8 : find_return_stmt(dyn_cast<DoStmt>(stmt)->getBody(), event); // do
+ break;
+ case 86 : find_return_stmt(dyn_cast<ForStmt>(stmt)->getBody(), event); // for
+ break;
+ case 88 : find_return_stmt(dyn_cast<IfStmt>(stmt)->getThen(), event); //if then
+ find_return_stmt(dyn_cast<IfStmt>(stmt)->getElse(), event); //if else
+ break;
+ case 90 : find_return_stmt(dyn_cast<LabelStmt>(stmt)->getSubStmt(), event); //label
+ break;
+ case 98 : line = sman.getCharacterData(dyn_cast<ReturnStmt>(stmt)->getReturnLoc());
+ line = get_line_of_code(line).substr(6);
+ line = line.substr(0,line.find("("));
+ if(test_model(line,"transit"))
+ {
+ param = get_params(line);
+ transitions.push_back(event.append(",").append(param));
+ }
+ break;
+ case 99 : find_return_stmt(stmt, event);
+ break;
+ case 101 : find_return_stmt(dyn_cast<SwitchStmt>(stmt)->getBody(), event); // switch
+ break;
+ case 102 : find_return_stmt(dyn_cast<WhileStmt>(stmt)->getBody(), event); // while
+ break;
+ }
+ }