public void Match1() { var src1 = @" int x = 1; Console.WriteLine(1); x++/*1A*/; Console.WriteLine(2); while (true) { x++/*2A*/; } Console.WriteLine(1); "; var src2 = @" int x = 1; x++/*1B*/; for (int i = 0; i < 10; i++) {} y++; if (x > 1) { while (true) { x++/*2B*/; } Console.WriteLine(1); }"; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "int x = 1;", "int x = 1;" }, { "int x = 1", "int x = 1" }, { "x = 1", "x = 1" }, { "Console.WriteLine(1);", "Console.WriteLine(1);" }, { "x++/*1A*/;", "x++/*1B*/;" }, { "Console.WriteLine(2);", "y++;" }, { "while (true) { x++/*2A*/; }", "while (true) { x++/*2B*/; }" }, { "{ x++/*2A*/; }", "{ x++/*2B*/; }" }, { "x++/*2A*/;", "x++/*2B*/;" } }; expected.AssertEqual(actual); }
public void MatchLambdas3() { var src1 = @" a += async u => u; "; var src2 = @" a += u => u; "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "a += async u => u;", "a += u => u;" }, { "async u => u", "u => u" } }; expected.AssertEqual(actual); }
public void MatchLambdas2b() { var src1 = @" F(delegate { return x; }); "; var src2 = @" F((a) => x, () => x); "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "F(delegate { return x; });", "F((a) => x, () => x);" }, { "delegate { return x; }", "() => x" } }; expected.AssertEqual(actual); }
public void MatchQueries4() { var src1 = "F(from a in await b from x in y select c);"; var src2 = "F(from a in await c from x in y select c);"; var match = GetMethodMatches(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "F(from a in await b from x in y select c);", "F(from a in await c from x in y select c);" }, { "from a in await b", "from a in await c" }, { "await b", "await c" }, { "from x in y select c", "from x in y select c" }, { "from x in y", "from x in y" }, { "select c", "select c" } }; expected.AssertEqual(actual); }
public void KnownMatches() { string src1 = @" Console.WriteLine(1)/*1*/; Console.WriteLine(1)/*2*/; "; string src2 = @" Console.WriteLine(1)/*3*/; Console.WriteLine(1)/*4*/; "; var m1 = MakeMethodBody(src1); var m2 = MakeMethodBody(src2); var knownMatches = new KeyValuePair<SyntaxNode, SyntaxNode>[] { new KeyValuePair<SyntaxNode, SyntaxNode>(m1.Statements[1], m2.Statements[0]) }; // pre-matched: var match = StatementSyntaxComparer.Default.ComputeMatch(m1, m2, knownMatches); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "Console.WriteLine(1)/*1*/;", "Console.WriteLine(1)/*4*/;" }, { "Console.WriteLine(1)/*2*/;", "Console.WriteLine(1)/*3*/;" } }; expected.AssertEqual(actual); // not pre-matched: match = StatementSyntaxComparer.Default.ComputeMatch(m1, m2); actual = ToMatchingPairs(match); expected = new MatchingPairs { { "Console.WriteLine(1)/*1*/;", "Console.WriteLine(1)/*3*/;" }, { "Console.WriteLine(1)/*2*/;", "Console.WriteLine(1)/*4*/;" } }; expected.AssertEqual(actual); }
public void KnownMatches_Root() { string src1 = @" Console.WriteLine(1); "; string src2 = @" Console.WriteLine(2); "; var m1 = MakeMethodBody(src1); var m2 = MakeMethodBody(src2); var knownMatches = new[] { new KeyValuePair<SyntaxNode, SyntaxNode>(m1, m2) }; var match = StatementSyntaxComparer.Default.ComputeMatch(m1, m2, knownMatches); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "Console.WriteLine(1);", "Console.WriteLine(2);" } }; expected.AssertEqual(actual); }
public void MatchQueries2() { var src1 = @" var q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id select ai let bid = (from b in bids orderby b.id descending where b.carID == c.id select b.bidamount).FirstOrDefault() select bid; "; var src2 = @" var q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id2 select ai + 1 let bid = (from b in bids orderby b.id ascending where b.carID == c.id2 select b.bidamount).FirstOrDefault() select bid; "; var match = GetMethodMatches(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "var q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id select ai let bid = (from b in bids orderby b.id descending where b.carID == c.id select b.bidamount).FirstOrDefault() select bid;", "var q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id2 select ai + 1 let bid = (from b in bids orderby b.id ascending where b.carID == c.id2 select b.bidamount).FirstOrDefault() select bid;" }, { "var q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id select ai let bid = (from b in bids orderby b.id descending where b.carID == c.id select b.bidamount).FirstOrDefault() select bid", "var q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id2 select ai + 1 let bid = (from b in bids orderby b.id ascending where b.carID == c.id2 select b.bidamount).FirstOrDefault() select bid" }, { "q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id select ai let bid = (from b in bids orderby b.id descending where b.carID == c.id select b.bidamount).FirstOrDefault() select bid", "q = from c in cars from ud in users_details from bd in bids orderby c.listingOption descending where a.userID == ud.userid let images = from ai in auction_images where ai.belongs_to == c.id2 select ai + 1 let bid = (from b in bids orderby b.id ascending where b.carID == c.id2 select b.bidamount).FirstOrDefault() select bid" }, { "from c in cars", "from c in cars" }, { "from ud in users_details", "from ud in users_details" }, { "from bd in bids", "from bd in bids" }, { "c.listingOption descending", "c.listingOption descending" }, { "where a.userID == ud.userid", "where a.userID == ud.userid" }, { "let images = from ai in auction_images where ai.belongs_to == c.id select ai", "let images = from ai in auction_images where ai.belongs_to == c.id2 select ai + 1" }, { "from ai in auction_images", "from ai in auction_images" }, { "where ai.belongs_to == c.id", "where ai.belongs_to == c.id2" }, { "select ai", "select ai + 1" }, { "let bid = (from b in bids orderby b.id descending where b.carID == c.id select b.bidamount).FirstOrDefault()", "let bid = (from b in bids orderby b.id ascending where b.carID == c.id2 select b.bidamount).FirstOrDefault()" }, { "from b in bids", "from b in bids" }, { "b.id descending", "b.id ascending" }, { "where b.carID == c.id", "where b.carID == c.id2" }, { "select b.bidamount", "select b.bidamount" }, { "select bid", "select bid" } }; expected.AssertEqual(actual); }
public void MatchLambdas7() { var src1 = @" F(a => { F(c => /*1*/d); F((u, v) => { F((w) => c => /*2*/d); F(p => p); }); }); "; var src2 = @" F(a => { F(c => /*1*/d + 1); F((u, v) => { F((w) => c => /*2*/d + 1); F(p => p*2); }); }); "; var matches = GetMethodMatches(src1, src2); var actual = ToMatchingPairs(matches); var expected = new MatchingPairs { { "F(a => { F(c => /*1*/d); F((u, v) => { F((w) => c => /*2*/d); F(p => p); }); });", "F(a => { F(c => /*1*/d + 1); F((u, v) => { F((w) => c => /*2*/d + 1); F(p => p*2); }); });" }, { "a => { F(c => /*1*/d); F((u, v) => { F((w) => c => /*2*/d); F(p => p); }); }", "a => { F(c => /*1*/d + 1); F((u, v) => { F((w) => c => /*2*/d + 1); F(p => p*2); }); }" }, { "{ F(c => /*1*/d); F((u, v) => { F((w) => c => /*2*/d); F(p => p); }); }", "{ F(c => /*1*/d + 1); F((u, v) => { F((w) => c => /*2*/d + 1); F(p => p*2); }); }" }, { "F(c => /*1*/d);", "F(c => /*1*/d + 1);" }, { "c => /*1*/d", "c => /*1*/d + 1" }, { "F((u, v) => { F((w) => c => /*2*/d); F(p => p); });", "F((u, v) => { F((w) => c => /*2*/d + 1); F(p => p*2); });" }, { "(u, v) => { F((w) => c => /*2*/d); F(p => p); }", "(u, v) => { F((w) => c => /*2*/d + 1); F(p => p*2); }" }, { "{ F((w) => c => /*2*/d); F(p => p); }", "{ F((w) => c => /*2*/d + 1); F(p => p*2); }" }, { "F((w) => c => /*2*/d);", "F((w) => c => /*2*/d + 1);" }, { "(w) => c => /*2*/d", "(w) => c => /*2*/d + 1" }, { "c => /*2*/d", "c => /*2*/d + 1" }, { "F(p => p);", "F(p => p*2);" }, { "p => p", "p => p*2" } }; expected.AssertEqual(actual); }
public void IfBlocksWithLocals1() { var src1 = @" if (X) { int a = 1; } if (Y) { int b = 2; } "; var src2 = @" if (Y) { int a = 3; int b = 4; } if (X) { int b = 5; } "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "if (X) { int a = 1; }", "if (Y) { int a = 3; int b = 4; }" }, { "{ int a = 1; }", "{ int a = 3; int b = 4; }" }, { "int a = 1;", "int a = 3;" }, { "int a = 1", "int a = 3" }, { "a = 1", "a = 3" }, { "if (Y) { int b = 2; }", "if (X) { int b = 5; }" }, { "{ int b = 2; }", "{ int b = 5; }" }, { "int b = 2;", "int b = 5;" }, { "int b = 2", "int b = 5" }, { "b = 2", "b = 5" } }; expected.AssertEqual(actual); }
public void ForEach_Swap1() { string src1 = @"foreach (var a in e) { foreach (var b in f) { Foo(); } }"; string src2 = @"foreach (var b in f) { foreach (var a in e) { Foo(); } }"; var edits = GetMethodEdits(src1, src2); edits.VerifyEdits( "Move [foreach (var b in f) { Foo(); }]@25 -> @2", "Move [foreach (var a in e) { foreach (var b in f) { Foo(); } }]@2 -> @25", "Move [Foo();]@48 -> @48"); var actual = ToMatchingPairs(edits.Match); var expected = new MatchingPairs { { "foreach (var a in e) { foreach (var b in f) { Foo(); } }", "foreach (var a in e) { Foo(); }" }, { "{ foreach (var b in f) { Foo(); } }", "{ Foo(); }" }, { "foreach (var b in f) { Foo(); }", "foreach (var b in f) { foreach (var a in e) { Foo(); } }" }, { "{ Foo(); }", "{ foreach (var a in e) { Foo(); } }" }, { "Foo();", "Foo();" } }; expected.AssertEqual(actual); }
public void MatchExceptionHandlers() { var src1 = @" try { throw new InvalidOperationException(1); } catch (IOException e) when (filter(e)) { Console.WriteLine(2); } catch (Exception e) when (filter(e)) { Console.WriteLine(3); } "; var src2 = @" try { throw new InvalidOperationException(10); } catch (IOException e) when (filter(e)) { Console.WriteLine(20); } catch (Exception e) when (filter(e)) { Console.WriteLine(30); } "; var match = GetMethodMatches(src1, src2, kind: MethodKind.Regular); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "try { throw new InvalidOperationException(1); } catch (IOException e) when (filter(e)) { Console.WriteLine(2); } catch (Exception e) when (filter(e)) { Console.WriteLine(3); }", "try { throw new InvalidOperationException(10); } catch (IOException e) when (filter(e)) { Console.WriteLine(20); } catch (Exception e) when (filter(e)) { Console.WriteLine(30); }" }, { "{ throw new InvalidOperationException(1); }", "{ throw new InvalidOperationException(10); }" }, { "throw new InvalidOperationException(1);", "throw new InvalidOperationException(10);" }, { "catch (IOException e) when (filter(e)) { Console.WriteLine(2); }", "catch (IOException e) when (filter(e)) { Console.WriteLine(20); }" }, { "(IOException e)", "(IOException e)" }, { "when (filter(e))", "when (filter(e))" }, { "{ Console.WriteLine(2); }", "{ Console.WriteLine(20); }" }, { "Console.WriteLine(2);", "Console.WriteLine(20);" }, { "catch (Exception e) when (filter(e)) { Console.WriteLine(3); }", "catch (Exception e) when (filter(e)) { Console.WriteLine(30); }" }, { "(Exception e)", "(Exception e)" }, { "when (filter(e))", "when (filter(e))" }, { "{ Console.WriteLine(3); }", "{ Console.WriteLine(30); }" }, { "Console.WriteLine(3);", "Console.WriteLine(30);" } }; expected.AssertEqual(actual); }
public void MatchConstructorWithInitializer2() { var src1 = @" () : base(a => a + 1) { Console.WriteLine(1); } "; var src2 = @" () { Console.WriteLine(1); } "; var match = GetMethodMatches(src1, src2, kind: MethodKind.ConstructorWithParameters); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "{ Console.WriteLine(1); }", "{ Console.WriteLine(1); }" }, { "Console.WriteLine(1);", "Console.WriteLine(1);" } }; expected.AssertEqual(actual); }
public void MatchQueries5() { var src1 = "F(from a in b group a by a.x into g select g);"; var src2 = "F(from a in b group z by z.y into h select h);"; var match = GetMethodMatches(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "F(from a in b group a by a.x into g select g);", "F(from a in b group z by z.y into h select h);" }, { "from a in b", "from a in b" }, { "group a by a.x into g select g", "group z by z.y into h select h" }, { "group a by a.x", "group z by z.y" }, { "into g select g", "into h select h" }, { "select g", "select h" }, { "select g", "select h" } }; expected.AssertEqual(actual); }
public void MatchLambdas4() { var src1 = @" foreach (var a in z) { var e = from q in a.Where(l => l > 10) select q + 1; } "; var src2 = @" foreach (var a in z) { var e = from q in a.Where(l => l < 0) select q + 1; } "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "foreach (var a in z) { var e = from q in a.Where(l => l > 10) select q + 1; }", "foreach (var a in z) { var e = from q in a.Where(l => l < 0) select q + 1; }" }, { "{ var e = from q in a.Where(l => l > 10) select q + 1; }", "{ var e = from q in a.Where(l => l < 0) select q + 1; }" }, { "var e = from q in a.Where(l => l > 10) select q + 1;", "var e = from q in a.Where(l => l < 0) select q + 1;" }, { "var e = from q in a.Where(l => l > 10) select q + 1", "var e = from q in a.Where(l => l < 0) select q + 1" }, { "e = from q in a.Where(l => l > 10) select q + 1", "e = from q in a.Where(l => l < 0) select q + 1" }, { "from q in a.Where(l => l > 10)", "from q in a.Where(l => l < 0)" }, { "select q + 1", "select q + 1" } }; expected.AssertEqual(actual); }
public void BlocksWithLocals2() { var src1 = @" { int a = 1; } { { int b = 2; } } "; var src2 = @" { int b = 1; } { { int a = 2; } } "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "{ int a = 1; }", "{ int a = 2; }" }, { "int a = 1;", "int a = 2;" }, { "int a = 1", "int a = 2" }, { "a = 1", "a = 2" }, { "{ { int b = 2; } }", "{ { int a = 2; } }" }, { "{ int b = 2; }", "{ int b = 1; }" }, { "int b = 2;", "int b = 1;" }, { "int b = 2", "int b = 1" }, { "b = 2", "b = 1" } }; expected.AssertEqual(actual); }
public void MatchLambdas6() { var src1 = @" F(a => b => c => d); "; var src2 = @" F(a => G(b => H(c => I(d)))); "; var matches = GetMethodMatches(src1, src2); var actual = ToMatchingPairs(matches); var expected = new MatchingPairs { { "F(a => b => c => d);", "F(a => G(b => H(c => I(d))));" }, { "a => b => c => d", "a => G(b => H(c => I(d)))" }, { "b => c => d", "b => H(c => I(d))" }, { "c => d", "c => I(d)" } }; expected.AssertEqual(actual); }
public void Queries_OrderBy_Continuation_Reorder() { var src1 = "F(from a in b orderby a.x, a.b descending select a.d into z orderby a.c ascending select z);"; var src2 = "F(from a in b orderby a.x, a.c ascending select a.d into z orderby a.b descending select z);"; var edits = GetMethodEdits(src1, src2); var actual = ToMatchingPairs(edits.Match); var expected = new MatchingPairs { { "F(from a in b orderby a.x, a.b descending select a.d into z orderby a.c ascending select z);", "F(from a in b orderby a.x, a.c ascending select a.d into z orderby a.b descending select z);" }, { "from a in b", "from a in b" }, { "a.x", "a.x" }, { "a.b descending", "a.b descending" }, { "select a.d", "select a.d" }, { "a.c ascending", "a.c ascending" }, { "select z", "select z" } }; expected.AssertEqual(actual); // LCS match: // [From] [order a.x] [order a.b] [select a.d] [order a.c] [select z] // | | \___________________ | // | | \ | // [From] [order a.x] [order a.c] [select a.d] [order a.b] [select z] edits.VerifyEdits( "Reorder [select a.d]@46 -> @45", "Reorder [a.c ascending]@74 -> @30"); }
public void MatchQueries1() { var src1 = @" var q = from c in cars from ud in users_details from bd in bids select 1; "; var src2 = @" var q = from c in cars from bd in bids from ud in users_details select 2; "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "var q = from c in cars from ud in users_details from bd in bids select 1;", "var q = from c in cars from bd in bids from ud in users_details select 2;" }, { "var q = from c in cars from ud in users_details from bd in bids select 1", "var q = from c in cars from bd in bids from ud in users_details select 2" }, { "q = from c in cars from ud in users_details from bd in bids select 1", "q = from c in cars from bd in bids from ud in users_details select 2" }, { "from c in cars", "from c in cars" }, { "from ud in users_details", "from ud in users_details" }, { "from bd in bids", "from bd in bids" }, { "select 1", "select 2" } }; expected.AssertEqual(actual); }
public void BlocksWithLocals3() { var src1 = @" { int a = 1, b = 2, c = 3; Console.WriteLine(a + b + c); } { int c = 4, b = 5, a = 6; Console.WriteLine(a + b + c); } { int a = 7, b = 8; Console.WriteLine(a + b); } "; var src2 = @" { int a = 9, b = 10; Console.WriteLine(a + b); } { int c = 11, b = 12, a = 13; Console.WriteLine(a + b + c); } { int a = 14, b = 15, c = 16; Console.WriteLine(a + b + c); } "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "{ int a = 1, b = 2, c = 3; Console.WriteLine(a + b + c); }", "{ int a = 14, b = 15, c = 16; Console.WriteLine(a + b + c); }" }, { "int a = 1, b = 2, c = 3;", "int a = 14, b = 15, c = 16;" }, { "int a = 1, b = 2, c = 3", "int a = 14, b = 15, c = 16" }, { "a = 1", "a = 14" }, { "b = 2", "b = 15" }, { "c = 3", "c = 16" }, { "Console.WriteLine(a + b + c);", "Console.WriteLine(a + b + c);" }, { "{ int c = 4, b = 5, a = 6; Console.WriteLine(a + b + c); }", "{ int c = 11, b = 12, a = 13; Console.WriteLine(a + b + c); }" }, { "int c = 4, b = 5, a = 6;", "int c = 11, b = 12, a = 13;" }, { "int c = 4, b = 5, a = 6", "int c = 11, b = 12, a = 13" }, { "c = 4", "c = 11" }, { "b = 5", "b = 12" }, { "a = 6", "a = 13" }, { "Console.WriteLine(a + b + c);", "Console.WriteLine(a + b + c);" }, { "{ int a = 7, b = 8; Console.WriteLine(a + b); }", "{ int a = 9, b = 10; Console.WriteLine(a + b); }" }, { "int a = 7, b = 8;", "int a = 9, b = 10;" }, { "int a = 7, b = 8", "int a = 9, b = 10" }, { "a = 7", "a = 9" }, { "b = 8", "b = 10" }, { "Console.WriteLine(a + b);", "Console.WriteLine(a + b);" } }; expected.AssertEqual(actual); }
public void MatchQueries3() { var src1 = @" var q = from a in seq1 join c in seq2 on F(u => u) equals G(s => s) join l in seq3 on F(v => v) equals G(t => t) select a; "; var src2 = @" var q = from a in seq1 join c in seq2 on F(u => u + 1) equals G(s => s + 3) join c in seq2 on F(vv => vv + 2) equals G(tt => tt + 4) select a + 1; "; var match = GetMethodMatches(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "var q = from a in seq1 join c in seq2 on F(u => u) equals G(s => s) join l in seq3 on F(v => v) equals G(t => t) select a;", "var q = from a in seq1 join c in seq2 on F(u => u + 1) equals G(s => s + 3) join c in seq2 on F(vv => vv + 2) equals G(tt => tt + 4) select a + 1;" }, { "var q = from a in seq1 join c in seq2 on F(u => u) equals G(s => s) join l in seq3 on F(v => v) equals G(t => t) select a", "var q = from a in seq1 join c in seq2 on F(u => u + 1) equals G(s => s + 3) join c in seq2 on F(vv => vv + 2) equals G(tt => tt + 4) select a + 1" }, { "q = from a in seq1 join c in seq2 on F(u => u) equals G(s => s) join l in seq3 on F(v => v) equals G(t => t) select a", "q = from a in seq1 join c in seq2 on F(u => u + 1) equals G(s => s + 3) join c in seq2 on F(vv => vv + 2) equals G(tt => tt + 4) select a + 1" }, { "from a in seq1", "from a in seq1" }, { "join c in seq2 on F(u => u) equals G(s => s)", "join c in seq2 on F(u => u + 1) equals G(s => s + 3)" }, { "u => u", "u => u + 1" }, { "s => s", "s => s + 3" }, { "join l in seq3 on F(v => v) equals G(t => t)", "join c in seq2 on F(vv => vv + 2) equals G(tt => tt + 4)" }, { "v => v", "vv => vv + 2" }, { "t => t", "tt => tt + 4" }, { "select a", "select a + 1" } }; expected.AssertEqual(actual); }
public void MatchLambdas1() { var src1 = "Action x = a => a;"; var src2 = "Action x = (a) => a;"; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "Action x = a => a;", "Action x = (a) => a;" }, { "Action x = a => a", "Action x = (a) => a" }, { "x = a => a", "x = (a) => a" }, { "a => a", "(a) => a" } }; expected.AssertEqual(actual); }
public void MatchYields() { var src1 = @" yield return /*1*/ 1; { yield return /*2*/ 2; } foreach (var x in y) { yield return /*3*/ 3; } "; var src2 = @" yield return /*1*/ 1; yield return /*2*/ 3; foreach (var x in y) { yield return /*3*/ 2; } "; var match = GetMethodMatches(src1, src2, stateMachine: StateMachineKind.Iterator); var actual = ToMatchingPairs(match); // note that yield returns are matched in source order, regardless of the yielded expressions: var expected = new MatchingPairs { { "yield return /*1*/ 1;", "yield return /*1*/ 1;" }, { "{ yield return /*2*/ 2; }", "{ yield return /*3*/ 2; }" }, { "yield return /*2*/ 2;", "yield return /*2*/ 3;" }, { "foreach (var x in y) { yield return /*3*/ 3; }", "foreach (var x in y) { yield return /*3*/ 2; }" }, { "yield return /*3*/ 3;", "yield return /*3*/ 2;" }, }; expected.AssertEqual(actual); }
public void MatchLambdas2a() { var src1 = @" F(x => x + 1, 1, y => y + 1, delegate(int x) { return x; }, async u => u); "; var src2 = @" F(y => y + 1, G(), x => x + 1, (int x) => x, u => u, async (u, v) => u + v); "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "F(x => x + 1, 1, y => y + 1, delegate(int x) { return x; }, async u => u);", "F(y => y + 1, G(), x => x + 1, (int x) => x, u => u, async (u, v) => u + v);" }, { "x => x + 1", "x => x + 1" }, { "y => y + 1", "y => y + 1" }, { "delegate(int x) { return x; }", "(int x) => x" }, { "async u => u", "async (u, v) => u + v" }, }; expected.AssertEqual(actual); }
public void Locals_Rename() { var src1 = @" int x = 1; "; var src2 = @" int y = 1; "; var match = GetMethodMatch(src1, src2); var actual = ToMatchingPairs(match); var expected = new MatchingPairs { { "int x = 1;", "int y = 1;" }, { "int x = 1", "int y = 1" }, { "x = 1", "y = 1" } }; expected.AssertEqual(actual); }
public void Queries_OrderBy_Continuation_Update() { var src1 = "F(from a in b orderby a.x, a.b descending select a.d into z orderby a.c ascending select z);"; var src2 = "F(from a in b orderby a.x, a.c ascending select a.d into z orderby a.b descending select z);"; var edits = GetMethodEdits(src1, src2); var actual = ToMatchingPairs(edits.Match); var expected = new MatchingPairs { { "F(from a in b orderby a.x, a.b descending select a.d into z orderby a.c ascending select z);", "F(from a in b orderby a.x, a.c ascending select a.d into z orderby a.b descending select z);" }, { "from a in b", "from a in b" }, { "orderby a.x, a.b descending select a.d into z orderby a.c ascending select z", "orderby a.x, a.c ascending select a.d into z orderby a.b descending select z" }, { "orderby a.x, a.b descending", "orderby a.x, a.c ascending" }, { "a.x", "a.x" }, { "a.b descending", "a.c ascending" }, { "select a.d", "select a.d" }, { "into z orderby a.c ascending select z", "into z orderby a.b descending select z" }, { "orderby a.c ascending select z", "orderby a.b descending select z" }, { "orderby a.c ascending", "orderby a.b descending" }, { "a.c ascending", "a.b descending" }, { "select z", "select z" } }; expected.AssertEqual(actual); edits.VerifyEdits( "Update [a.b descending]@30 -> [a.c ascending]@30", "Update [a.c ascending]@74 -> [a.b descending]@73"); }