Example #1
0
        /// <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);
        }
Example #2
0
        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;
        }