示例#1
0
            public void SwitchPattern(string firstStatement, string otherStatement, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    internal class Foo
    {
        internal Foo(int i)
        {
            int temp = 1;
            switch (i)
            {
                case int n when n == 0:
                    temp = 2;
                    break;
                case int n when n == 1:
                    temp = 3;
                    break;
                default:
                    temp = 4;
                    break;
            }

            temp = 5;
        }
    }
}");
                var first      = syntaxTree.FindStatement(firstStatement);
                var other      = syntaxTree.FindStatement(otherStatement);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#2
0
        public static void Switch(string firstStatement, string otherStatement, ExecutedBefore expected)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace N
{
    internal class C
    {
        internal C(int i)
        {
            int temp = 1;
            switch (i)
            {
                case 0:
                    temp = 2;
                    break;
                case 1:
                    temp = 3;
                    break;
                default:
                    temp = 4;
                    break;
            }

            temp = 5;
        }
    }
}");
            var first      = syntaxTree.FindStatement(firstStatement);
            var other      = syntaxTree.FindStatement(otherStatement);

            Assert.AreEqual(expected, first.IsExecutedBefore(other));
        }
示例#3
0
        /// <summary>
        /// Check if <paramref name="node"/> is in lambda.
        /// </summary>
        /// <param name="node">The <see cref="SyntaxNode"/>.</param>
        /// <param name="other">The other <see cref="SyntaxNode"/>.</param>
        /// <param name="executedBefore">The execution order.</param>
        /// <returns>True if any or both nodes are in lambda.</returns>
        internal static bool IsInLambda(SyntaxNode node, SyntaxNode other, out ExecutedBefore executedBefore)
        {
            if (node.TryFirstAncestor(out AnonymousFunctionExpressionSyntax? nodeLambda))
            {
                if (other.TryFirstAncestor(out AnonymousFunctionExpressionSyntax? otherLambda))
                {
                    if (ReferenceEquals(nodeLambda, otherLambda))
                    {
                        // in the same lambda we handle it like normal execution.
                        executedBefore = ExecutedBefore.Unknown;
                        return(false);
                    }

                    executedBefore = ExecutedBefore.Maybe;
                    return(true);
                }

                executedBefore = node.SpanStart > other.SpanStart ? ExecutedBefore.No : ExecutedBefore.Maybe;
                return(true);
            }

            if (other.TryFirstAncestor <AnonymousFunctionExpressionSyntax>(out _))
            {
                executedBefore = node.SpanStart < other.SpanStart ? ExecutedBefore.Yes : ExecutedBefore.Maybe;
                return(true);
            }

            executedBefore = ExecutedBefore.Unknown;
            return(false);
        }
示例#4
0
            public void LambdaParameterClosure(string firstInt, string otherInt, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    using System;

    public class Foo
    {
        public Foo(int a)
        {
            a = 1;
            this.E += (_, __) => a = 3;
            this.E += (_, __) =>
            {
                a = 4;
                a = 5;
            };
            a = 2;
        }

        public event EventHandler E;
    }
}");
                var first      = syntaxTree.FindLiteralExpression(firstInt);
                var other      = syntaxTree.FindLiteralExpression(otherInt);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#5
0
        public static void LambdaParameterClosure(string firstInt, string otherInt, ExecutedBefore expected)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace N
{
    using System;

    public class C
    {
        public C(int a)
        {
            a = 1;
            this.E += (_, __) => 
            {
                a = 3;
            };
            this.E += (_, __) =>
            {
                a = 4;
                a = 5;
            };
            a = 2;
        }

        public event EventHandler E;
    }
}");
            var first      = syntaxTree.FindStatement(firstInt);
            var other      = syntaxTree.FindStatement(otherInt);

            Assert.AreEqual(expected, first.IsExecutedBefore(other));
        }
示例#6
0
            public void IfThrowBlock(string firstStatement, string otherStatement, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    using System;
	
    internal class Foo
    {
        internal void Bar(bool condition)
        {
            var temp = 1;
            if (condition)
            {
                temp = 2;
                throw new Exception();
            }
            else
            {
                temp = 3;
                throw new Exception();
            }

            temp = 4;
        }
    }
}");
                var first      = syntaxTree.FindStatement(firstStatement);
                var other      = syntaxTree.FindStatement(otherStatement);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#7
0
            public void LambdaLocal(string firstInt, string otherInt, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    using System;

    public class Foo
    {
        public Foo()
        {
            this.E += (_, __) =>
            {
                var a = 1;
                a = 2;
            };
        }

        public event EventHandler E;
    }
}");
                var first      = syntaxTree.FindLiteralExpression(firstInt);

                Assert.AreEqual(expected, first.IsExecutedBefore(syntaxTree.FindLiteralExpression(otherInt)));
                Assert.AreEqual(expected, first.IsExecutedBefore(syntaxTree.FindStatement(otherInt)));
            }
示例#8
0
            public void Or(string firstInt, string otherInt, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    using System;

    public class Foo
    {
        public static bool Get(int a, int b) => a == 1 || b == 2;
    }
}");
                var first      = syntaxTree.FindLiteralExpression(firstInt);
                var other      = syntaxTree.FindLiteralExpression(otherInt);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#9
0
            public void SameBlock(string firstStatement, string otherStatement, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    internal class Foo
    {
        internal Foo()
        {
            var temp = 1;
            temp = 2;
        }
    }
}");
                var first      = syntaxTree.FindStatement(firstStatement);
                var other      = syntaxTree.FindStatement(otherStatement);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#10
0
        public static void IfBlock(string firstStatement, string otherStatement, ExecutedBefore expected)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace N
{
    internal class C
    {
        internal C(bool condition)
        {
            var temp = 1;
            if (condition)
            {
                temp = 2;
            }

            temp = 3;
        }
    }
}");
            var first      = syntaxTree.FindStatement(firstStatement);
            var other      = syntaxTree.FindStatement(otherStatement);

            Assert.AreEqual(expected, first.IsExecutedBefore(other));
        }
示例#11
0
        public static void IfThrowBlockWhenGoto(string firstStatement, string otherStatement, ExecutedBefore expected)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace N
{
    using System;
	
    internal class C
    {
        internal void M(bool condition)
        {
            var temp = 1;
            meh:
            if (condition)
            {
                temp = 2;
                goto meh;
                throw new Exception();
            }
            else
            {
                temp = 3;
                goto meh;
                throw new Exception();
            }

            temp = 4;
        }
    }
}");
            var first      = syntaxTree.FindStatement(firstStatement);
            var other      = syntaxTree.FindStatement(otherStatement);

            Assert.AreEqual(expected, first.IsExecutedBefore(other));
        }
示例#12
0
            public void IfElseStatements(string firstStatement, string otherStatement, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    internal class Foo
    {
        internal Foo(bool condition)
        {
            var temp = 1;
            if (condition)
                temp = 2;
            else
                temp = 3;

            temp = 4;
        }
    }
}");
                var first      = syntaxTree.FindStatement(firstStatement);
                var other      = syntaxTree.FindStatement(otherStatement);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#13
0
 /// <summary>
 /// Check if <paramref name="candidate"/> is either of <paramref name="x"/> or <paramref name="y"/>.
 /// </summary>
 /// <param name="candidate">The <see cref="ExecutedBefore"/>.</param>
 /// <param name="x">The first kind.</param>
 /// <param name="y">The other kind.</param>
 /// <returns>True if <paramref name="candidate"/> is either of <paramref name="x"/> or <paramref name="y"/>. </returns>
 public static bool IsEither(this ExecutedBefore candidate, ExecutedBefore x, ExecutedBefore y) => candidate == x || candidate == y;
示例#14
0
        public static void DeclaredBeforeWhileLoop(string firstStatement, string otherStatement, ExecutedBefore expected)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace N
{
    internal class C
    {
        internal C()
        {
            var temp = 0;
            while (true)
            {
                temp = 1;
                temp = 2;
            }

            temp = 3;
        }
    }
}");
            var first      = syntaxTree.FindStatement(firstStatement);
            var other      = syntaxTree.FindStatement(otherStatement);

            Assert.AreEqual(expected, first.IsExecutedBefore(other));
        }
示例#15
0
        public static void DeclaredInForeachLoop(string firstStatement, string otherStatement, ExecutedBefore expected)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace N
{
    internal class C
    {
        internal C(int[] ints)
        {
            foreach (var i in ints)
            {
                var temp = 1;
                temp = 2;
            }
        }
    }
}");
            var first      = syntaxTree.FindStatement(firstStatement);
            var other      = syntaxTree.FindStatement(otherStatement);

            Assert.AreEqual(expected, first.IsExecutedBefore(other));
        }
示例#16
0
            public void DeclaredInForLoop(string firstStatement, string otherStatement, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    internal class Foo
    {
        internal Foo(int[] ints)
        {
            for (var index = 0; index < ints.Length; index++)
            {
                var i = ints[index];
                var temp = 1;
                temp = 2;
            }
        }
    }
}");
                var first      = syntaxTree.FindStatement(firstStatement);
                var other      = syntaxTree.FindStatement(otherStatement);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#17
0
            public void TryCatchCatchFinally(string firstStatement, string otherStatement, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    internal class Foo
    {
        internal Foo()
        {
            int temp = 1;
            try
            {
                temp = 2;
            }
            catch (FileNotFoundException e)
            {
                temp = 3;
            }
            catch (FileFormatException e)
            {
                temp = 4;
            }
            finally
            {
                temp = 5;
            }

            temp = 6;
        }
    }
}");
                var first      = syntaxTree.FindStatement(firstStatement);
                var other      = syntaxTree.FindStatement(otherStatement);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }
示例#18
0
        public static void InsideIfSingleStatement(string firstStatement, string otherStatement, ExecutedBefore expected)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace N
{
    internal class C
    {
        internal C()
        {
            var temp = 1;
            if (true)
                temp = 2;
            else
                temp = 3;
            temp = 4;
        }
    }
}");
            var first      = syntaxTree.FindStatement(firstStatement);
            var other      = syntaxTree.FindStatement(otherStatement);

            Assert.AreEqual(expected, first.IsExecutedBefore(other));
        }
示例#19
0
            public void IfReturnBlockWhenGoto(string firstStatement, string otherStatement, ExecutedBefore expected)
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(@"
namespace RoslynSandbox
{
    internal class Foo
    {
        internal void Bar(bool condition)
        {
            var temp = 1;
            meh:
            if (condition)
            {
                temp = 2;
                goto meh;
                return;
            }
            else
            {
                temp = 3;
                goto meh;
                return;
            }

            temp = 4;
        }
    }
}");
                var first      = syntaxTree.FindStatement(firstStatement);
                var other      = syntaxTree.FindStatement(otherStatement);

                Assert.AreEqual(expected, first.IsExecutedBefore(other));
            }