/// <inheritdoc/> public override AstStatement CloneAstStatement(Dictionary <object, object> context) { if (context.ContainsKey(this)) { return((AstStatement)context[this]); } var result = new AstTryStatement(); context[this] = result; result.TryStatements = TryStatements?.Select(p => p.CloneAstStatement(context)).ToList(); result.CatchStatements = CatchStatements?.Select(p => p.Clone(context)).ToList(); result.ElseStatements = ElseStatements?.Select(p => p.CloneAstStatement(context)).ToList(); result.EnsureStatements = EnsureStatements?.Select(p => p.CloneAstStatement(context)).ToList(); result.AppendAnnotations(this, context); return(result); }
private CatchStatements TraverseCatchStatement(CatchPartSyntax cps, ref int returnCnt, bool nested = false) { CatchStatements catchStm = new CatchStatements(); catchStm.IsNested = nested; CatchStatementSyntax css = cps.Begin; foreach (SyntaxNode sn in css.DescendantNodesAndSelf()) { if (sn is IdentifierNameSyntax) { Variables variable = new Variables(); variable.IsReferenced = true; variable.Name = (sn as IdentifierNameSyntax).Identifier.ValueText; catchStm.AccessedVars.Add(variable); } } foreach (StatementSyntax ss in cps.Statements) { if (ss is AssignmentStatementSyntax) { //TODO: need to look at more than just then name! Method tempMethod = TraverseAccessVars(ss as AssignmentStatementSyntax); catchStm.AccessedVars.AddRange(tempMethod.AccessedVariables); catchStm.InvokedMethods.AddRange(tempMethod.InvokedMethods); } else if (ss is LocalDeclarationStatementSyntax) { Method tempMethod = TraverseVarDecls(ss as LocalDeclarationStatementSyntax); catchStm.AccessedVars.AddRange(tempMethod.AccessedVariables); catchStm.InvokedMethods.AddRange(tempMethod.InvokedMethods); } else if (ss is SingleLineIfStatementSyntax) { Decisions decision = TraverseIfStatement(ss as SingleLineIfStatementSyntax, ref returnCnt, true); catchStm.Nested.AddRange(decision.IfStatements); catchStm.Nested.AddRange(decision.ElseStatements); } else if (ss is MultiLineIfBlockSyntax) { Decisions decisions = TraverseMultiIfStatement(ss as MultiLineIfBlockSyntax, ref returnCnt, true); catchStm.Nested.AddRange(decisions.IfStatements); catchStm.Nested.AddRange(decisions.ElseStatements); } else if (ss is ElseStatementSyntax) { catchStm.Nested.Add(TravsereElseStatement(ss as ElseStatementSyntax, ref returnCnt, true)); } else if (ss is ForBlockSyntax) { Decisions tempDecision = TraverseForStatement(ss as ForBlockSyntax, ref returnCnt, true); catchStm.Nested.AddRange(tempDecision.IfStatements); catchStm.Nested.AddRange(tempDecision.ElseStatements); catchStm.Nested.AddRange(tempDecision.ForEachStatements); catchStm.Nested.AddRange(tempDecision.ForStatements); catchStm.Nested.AddRange(tempDecision.WhileLoops); catchStm.Nested.AddRange(tempDecision.DoWhileLoops); catchStm.Nested.AddRange(tempDecision.Catches); catchStm.Nested.AddRange(tempDecision.SwitchStatements); } else if (ss is SelectBlockSyntax) { catchStm.Nested.Add(TraverseSwitchStatement(ss as SelectBlockSyntax, ref returnCnt, true)); } else if (ss is DoLoopBlockSyntax) { catchStm.Nested.Add(TraverseDoWhileLoop(ss as DoLoopBlockSyntax, ref returnCnt, true)); } else if (ss is WhileBlockSyntax) { catchStm.Nested.Add(TraverseWhileLoop(ss as WhileBlockSyntax, ref returnCnt, true)); } else if (ss is CallStatementSyntax) { catchStm.InvokedMethods.Add(TraverseInvokedMethod(ss as CallStatementSyntax)); } else if (ss is ReturnStatementSyntax) { Method tempMethod = TraverseReturnStatement(ss as ReturnStatementSyntax); catchStm.InvokedMethods.AddRange(tempMethod.InvokedMethods); catchStm.AccessedVars.AddRange(tempMethod.AccessedVariables); returnCnt++; } } return catchStm; }
private Decisions TraverseCatchClauses(CatchClauseSyntax ccs, ref int exitPoints, bool nested = false) { Decisions retDecision = new Decisions(); CatchStatements retCatch = new CatchStatements(); if (ccs.HasLeadingTrivia) { SetOuterComments(retCatch, ccs.GetLeadingTrivia().ToFullString()); } if (ccs.HasTrailingTrivia) { SetInnerComments(retCatch, ccs.GetTrailingTrivia().ToFullString()); } retCatch.IsNested = nested; var binaryExpressions = from aBinaryExpression in ccs.ChildNodes().OfType<BinaryExpressionSyntax>() select aBinaryExpression; foreach (BinaryExpressionSyntax bes in binaryExpressions) { Method tempMethod = TraverseBinaryExpression(bes); retCatch.AccessedVars.AddRange(tempMethod.AccessedVariables); retCatch.InvokedMethods.AddRange(tempMethod.InvokedMethods); } var catches = from aCatch in ccs.ChildNodes().OfType<CatchClauseSyntax>() select aCatch; foreach (CatchClauseSyntax ccs2 in catches) { Decisions tempCatch = TraverseCatchClauses(ccs2, ref exitPoints, true); retCatch.Nested.AddRange(tempCatch.Catches); } var elses = from aElse in ccs.ChildNodes().OfType<ElseClauseSyntax>() select aElse; foreach (ElseClauseSyntax ecs2 in elses) { Decisions tempElse = TraverseElseClauses(ecs2, ref exitPoints, true); retCatch.Nested.AddRange(tempElse.ElseStatements); } #region nested stuff var statements = from aStatement in ccs.ChildNodes().OfType<StatementSyntax>() select aStatement; foreach (StatementSyntax ss in statements) { if (ss is DoStatementSyntax) { Decisions dwl = TraverseDoStatements(ss as DoStatementSyntax, ref exitPoints, true); retCatch.Nested.AddRange(dwl.DoWhileLoops); } else if (ss is ExpressionStatementSyntax) { Method tempMethod = TraverseExpressionStatementSyntax(ss as ExpressionStatementSyntax); retCatch.AccessedVars.AddRange(tempMethod.AccessedVariables); retCatch.InvokedMethods.AddRange(tempMethod.InvokedMethods); } else if (ss is ForEachStatementSyntax) { Decisions fes = TraverseForEachStatements(ss as ForEachStatementSyntax, ref exitPoints, true); retCatch.Nested.AddRange(fes.ForEachStatements); } else if (ss is ForStatementSyntax) { Decisions fs = TraverseForStatements(ss as ForStatementSyntax, ref exitPoints, true); retCatch.Nested.AddRange(fs.ForStatements); } else if (ss is IfStatementSyntax) { Decisions decision = TraverseIfStatements(ss as IfStatementSyntax, ref exitPoints, true); retCatch.Nested.AddRange(decision.IfStatements); } else if (ss is LocalDeclarationStatementSyntax) { Model.Type tempType = new Model.Type(); LocalDeclarationStatementSyntax ldss = ss as LocalDeclarationStatementSyntax; if (ldss.Declaration != null) { VariableDeclarationSyntax vds = ldss.Declaration; tempType.Name = vds.Type.ToString(); tempType.IsKnownType = true; tempType.IsNotUserDefined = true; } Method tempMethod = TransverseAccessVars(ss as LocalDeclarationStatementSyntax); //NOT SURE if this will work but here goes tempMethod.AccessedVariables[0].Type = tempType; retCatch.AccessedVars.AddRange(tempMethod.AccessedVariables); retCatch.InvokedMethods.AddRange(tempMethod.InvokedMethods); } else if (ss is ReturnStatementSyntax) { exitPoints++; } else if (ss is SwitchStatementSyntax) { Decisions switchStm = TraverseSwitchStatements(ss as SwitchStatementSyntax, ref exitPoints, true); retCatch.Nested.AddRange(switchStm.SwitchStatements); } else if (ss is WhileStatementSyntax) { Decisions wl = TraverseWhileLoops(ss as WhileStatementSyntax, ref exitPoints, true); retCatch.Nested.AddRange(wl.WhileLoops); } } #endregion retDecision.Catches.Add(retCatch); return retDecision; }