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)); }
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)); }
/// <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); }
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)); }
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)); }
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)); }
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))); }
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)); }
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)); }
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)); }
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)); }
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)); }
/// <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;
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }