public static MethodDeclarationSyntax Trivia(this MethodDeclarationSyntax node, MethodDeclarationSyntax that) { return node.WithLeadingTrivia(that.GetLeadingTrivia()).WithTrailingTrivia(that.GetTrailingTrivia()); }
//private object TransverseClassTypes(object classType) //{ // object retObj; // if (classType is ClassDeclarationSyntax) // { // retObj = new Class(); // classType = classType as ClassDeclarationSyntax; // } // else if (classType is StructDeclarationSyntax) // { // retObj = new Struct(); // classType = classType as StructDeclarationSyntax; // } // //Class retObj = new Class(); // //Name // (retObj is Class ? retObj as Class : retObj as Struct).Name = (classType is ClassDeclarationSyntax ? (ClassDeclarationSyntax)classType : (StructDeclarationSyntax)classType).Identifier.ValueText; // //encapsulation // foreach (SyntaxToken st in classType.Modifiers) // { // string modifier = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(st.ValueText); // retObj.Encapsulation.Add((Encapsulation)System.Enum.Parse(typeof(Encapsulation), modifier)); // } // var enums = from aEnu in classType.ChildNodes().OfType<EnumDeclarationSyntax>() select aEnu; // foreach (EnumDeclarationSyntax eds in enums) // { // retObj.Enums.Add(TraverseEnums(eds)); // } // var structs = from aStruct in classType.ChildNodes().OfType<StructDeclarationSyntax>() select aStruct; // foreach (StructDeclarationSyntax sds in structs) // { // retObj.Structs.Add(TransverseStructs(sds)); // } // var methods = from aMethod in classType.ChildNodes().OfType<MethodDeclarationSyntax>() select aMethod; // foreach (MethodDeclarationSyntax mds in methods) // { // retObj.Methods.Add(TransverseMethods(mds)); // } // var fields = from aField in classType.ChildNodes().OfType<FieldDeclarationSyntax>() select aField; // foreach (FieldDeclarationSyntax fds in fields) // { // retObj.Attributes.Add(TransverseVariables(fds)); // } // //var properties = from aProperty in classType.ChildNodes().OfType<PropertyDeclarationSyntax>() select aProperty; // //foreach (PropertyDeclarationSyntax pds in properties) // //{ // // //traverse attributes // //} // var constructors = from aConstructor in classType.ChildNodes().OfType<ConstructorDeclarationSyntax>() select aConstructor; // foreach (ConstructorDeclarationSyntax cods in constructors) // { // retObj.Constructors.Add(TransverseConstructors(cods)); // } // var destructors = from aDestructor in classType.ChildNodes().OfType<DestructorDeclarationSyntax>() select aDestructor; // foreach (DestructorDeclarationSyntax dds in destructors) // { // retObj.Destructors.Add(TransverseDestructors(dds)); // } // var classes = from aClass in classType.ChildNodes().OfType<ClassDeclarationSyntax>() select aClass; // foreach (ClassDeclarationSyntax classType2 in classes) // { // retObj.Classes.Add(TraverseClass(classType2)); // } // return retObj; //} private Method TransverseMethods(MethodDeclarationSyntax mds) { Method retMethod = new Method(); //public int DecisionsCount { get; } //public int ExitPoints { get; set; } //public bool IsFriend { get; } //public bool IsPolymophic { get; } //public bool IsPublic { get; } //public bool IsStatic { get; } //public List<Preprocessor> Preprocessors { get; set; } retMethod.Name = mds.Identifier.ValueText; if (mds.HasLeadingTrivia) { SetOuterComments(retMethod, mds.GetLeadingTrivia().ToFullString()); } if (mds.HasTrailingTrivia) { SetInnerComments(retMethod, mds.GetTrailingTrivia().ToFullString()); } foreach (SyntaxToken st in mds.Modifiers) { string modifier = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(st.ValueText); Encapsulation encap; Qualifiers qual; if (System.Enum.TryParse<Encapsulation>(modifier, out encap)) { retMethod.Encapsulation.Add(encap); } else if (System.Enum.TryParse<Qualifiers>(modifier, out qual)) { retMethod.Qualifiers.Add(qual); } } TypeSyntax ts = mds.ReturnType; Model.Type retType = new Model.Type(); retType.Name = ts.ToString(); retType.IsKnownType = SyntaxFacts.IsKeywordKind(ts.CSharpKind()); retType.IsNotUserDefined = SyntaxFacts.IsKeywordKind(ts.CSharpKind()); //TODO //rettype.generictype retMethod.ReturnType = retType; ParameterListSyntax pls = mds.ParameterList; foreach (ParameterSyntax ps in pls.Parameters) { retMethod.Parameters.Add(TraverseParamaters(ps)); } BlockSyntax bs = mds.Body; if (bs != null) { var labelStatements = from aLabelStatement in bs.ChildNodes().OfType<LabeledStatementSyntax>() select aLabelStatement; foreach (LabeledStatementSyntax lss in labelStatements) { retMethod.LabelStatements.Add(TraverseLabelStatements(lss)); } var goToStatements = from aGoToStatement in bs.ChildNodes().OfType<GotoStatementSyntax>() select aGoToStatement; foreach (GotoStatementSyntax gtss in goToStatements) { GoTo gt = TraverseGoToStatements(gtss); retMethod.GoToStatements.Add(gt); } //Preprocessors = new List<Preprocessor>(); //Base = new List<InvokedMethod>(); //Decisions = new Decisions(); var accessVarsDecl = from aAccessVarsDecl in bs.ChildNodes().OfType<LocalDeclarationStatementSyntax>() select aAccessVarsDecl; foreach (LocalDeclarationStatementSyntax ldss in accessVarsDecl) { Method tempMethod = TransverseAccessVars(ldss); retMethod.AccessedVariables.AddRange(tempMethod.AccessedVariables); retMethod.InvokedMethods.AddRange(tempMethod.InvokedMethods); } var ifStatements = from aIfStatement in bs.ChildNodes().OfType<IfStatementSyntax>() select aIfStatement; foreach (IfStatementSyntax iss in ifStatements) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = AllDecisions(TraverseIfStatements(iss, ref exitPoints)); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var elseStatements = from aElseStatements in bs.ChildNodes().OfType<ElseClauseSyntax>() select aElseStatements; foreach (ElseClauseSyntax ecs in elseStatements) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = TraverseElseClauses(ecs, ref exitPoints); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var whileLoops = from aWhileLoop in bs.ChildNodes().OfType<WhileStatementSyntax>() select aWhileLoop; foreach (WhileStatementSyntax wss in whileLoops) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = TraverseWhileLoops(wss, ref exitPoints); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var doWhileLoops = from aDoWhileLoop in bs.ChildNodes().OfType<DoStatementSyntax>() select aDoWhileLoop; foreach (DoStatementSyntax dss in doWhileLoops) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = TraverseDoStatements(dss, ref exitPoints); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var forLoops = from aForLoop in bs.ChildNodes().OfType<ForStatementSyntax>() select aForLoop; foreach (ForStatementSyntax fss in forLoops) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = TraverseForStatements(fss, ref exitPoints); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var foreachLoops = from aForeachLoop in bs.ChildNodes().OfType<ForEachStatementSyntax>() select aForeachLoop; foreach (ForEachStatementSyntax fess in foreachLoops) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = TraverseForEachStatements(fess, ref exitPoints); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var switches = from aSwitch in bs.ChildNodes().OfType<SwitchStatementSyntax>() select aSwitch; foreach (SwitchStatementSyntax sss in switches) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = TraverseSwitchStatements(sss, ref exitPoints); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var catches = from aCatch in bs.ChildNodes().OfType<CatchClauseSyntax>() select aCatch; foreach (CatchClauseSyntax ccs in catches) { int exitPoints = retMethod.ExitPoints; Decisions tempDecision = TraverseCatchClauses(ccs, ref exitPoints); retMethod.Decisions.IfStatements.AddRange(tempDecision.IfStatements); retMethod.Decisions.ElseStatements.AddRange(tempDecision.ElseStatements); retMethod.Decisions.ForEachStatements.AddRange(tempDecision.ForEachStatements); retMethod.Decisions.ForStatements.AddRange(tempDecision.ForStatements); retMethod.Decisions.WhileLoops.AddRange(tempDecision.WhileLoops); retMethod.Decisions.DoWhileLoops.AddRange(tempDecision.DoWhileLoops); retMethod.Decisions.Catches.AddRange(tempDecision.Catches); retMethod.Decisions.SwitchStatements.AddRange(tempDecision.SwitchStatements); retMethod.ExitPoints = exitPoints; } var breaks = from aBreak in bs.ChildNodes().OfType<BreakStatementSyntax>() select aBreak; foreach (BreakStatementSyntax bss in breaks) { //TODO get breaks //note that breaks are NOT in retMethod.Decisions } var checks = from aCheck in bs.ChildNodes().OfType<CheckedStatementSyntax>() select aCheck; foreach (CheckedStatementSyntax css in checks) { //TODO get checks //note that checks are NOT in retMethod.Decisions } var continues = from aContinue in bs.ChildNodes().OfType<ContinueStatementSyntax>() select aContinue; foreach (ContinueStatementSyntax css in continues) { //TODO get continues //note that continues are NOT in retMethod.Decisions } var emptys = from aEmpty in bs.ChildNodes().OfType<EmptyStatementSyntax>() select aEmpty; foreach (EmptyStatementSyntax ess in emptys) { //TODO get emptys //note that emptys are NOT in retMethod.Decisions } var exprs = from aExpr in bs.ChildNodes().OfType<ExpressionStatementSyntax>() select aExpr; foreach (ExpressionStatementSyntax ess in exprs) { //TODO get expressions //note that expressions are NOT in retMethod.Decisions } var fixeds = from aFixed in bs.ChildNodes().OfType<FixedStatementSyntax>() select aFixed; foreach (FixedStatementSyntax fss in fixeds) { //TODO get fixed //note that these are NOT in retMethod.Decisions } var locks = from aLock in bs.ChildNodes().OfType<LockStatementSyntax>() select aLock; foreach (LockStatementSyntax lss in locks) { //TODO get lock //note that these are NOT in retMethod.Decisions } var returns = from aReturn in bs.ChildNodes().OfType<ReturnStatementSyntax>() select aReturn; foreach (ReturnStatementSyntax rss in returns) { retMethod.ExitPoints++; } var throws = from aThrow in bs.ChildNodes().OfType<ThrowStatementSyntax>() select aThrow; foreach (ThrowStatementSyntax tss in throws) { //TODO get throws //note that these are NOT in retMethod.Decisions } var trys = from aTry in bs.ChildNodes().OfType<TryStatementSyntax>() select aTry; foreach (TryStatementSyntax tss in trys) { //TODO get trys //note that these are NOT in retMethod.Decisions } var unsafes = from aUnsafe in bs.ChildNodes().OfType<UnsafeStatementSyntax>() select aUnsafe; foreach (UnsafeStatementSyntax uss in unsafes) { //TODO get unsafes //note that these are NOT in retMethod.Decisions } var usings = from aUsing in bs.ChildNodes().OfType<UsingStatementSyntax>() select aUsing; foreach (UsingStatementSyntax uss in usings) { //TODO get usings //note that these are NOT in retMethod.Decisions } var yields = from aYield in bs.ChildNodes().OfType<YieldStatementSyntax>() select aYield; foreach (YieldStatementSyntax yss in yields) { //TODO get yields //note that these are NOT in retMethod.Decisions } var invokedMethods = from aInvokedMethod in bs.ChildNodes().OfType<InvocationExpressionSyntax>() select aInvokedMethod; foreach (InvocationExpressionSyntax ies in invokedMethods) { Method tempMethod = TraverseInvocationExpression(ies); retMethod.InvokedMethods.AddRange(tempMethod.InvokedMethods); retMethod.AccessedVariables.AddRange(tempMethod.AccessedVariables); } //InvokedMethods = new List<InvokedMethod>(); } return retMethod; }