From ba6e969f6a4b60e06e937fcdd924bc99a3eb7e84 Mon Sep 17 00:00:00 2001 From: Akshita Agarwal Date: Fri, 1 Dec 2017 15:24:59 -0800 Subject: [PATCH 1/7] Added test for failing cases --- .../FormattingFacts.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs index 627057120f..c47de1fda2 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs @@ -128,6 +128,45 @@ await AssertTextChanges(string.Join("\r\n", source), new LinePositionSpanTextChange { StartLine = 2, StartColumn = 30, EndLine = 3, EndColumn = 0, NewText = "\n " }); } + + + + [Fact] + public async Task TextChangesOnSelectingBeforeFirstPositionInLine() + { + var source = new[] + { + "class Program", + "{", + " public static void Main()", + " {", + "[| int foo = 1;|]", + " }", + "}", + }; + + await AssertTextChanges(string.Join("\r\n", source), + new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 0, NewText = "\n " }); + } + + [Fact] + public async Task TextChangesOnSelectingAfterFirstPositionInLine() + { + var source = new[] + { + "class Program", + "{", + " public static void Main()", + " {", + " [|int foo = 1;|]", + " }", + "}", + }; + + await AssertTextChanges(string.Join("\r\n", source), + new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 0, NewText = "\n " }); + } + [Fact] public async Task FormatRespectsIndentationSize() { From 4e16b200e22d99170e606dfab5d03d0e8fbf185f Mon Sep 17 00:00:00 2001 From: Akshita Agarwal Date: Mon, 4 Dec 2017 17:14:26 -0800 Subject: [PATCH 2/7] Using full span of the intersecing token --- .../Services/Formatting/FormatRangeService.cs | 9 +++++++-- tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs b/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs index 33a8ac4405..3b27b77968 100644 --- a/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs +++ b/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs @@ -26,11 +26,16 @@ public async Task Handle(FormatRangeRequest request) { return null; } - + var text = await document.GetTextAsync(); var start = text.Lines.GetPosition(new LinePosition(request.Line, request.Column)); var end = text.Lines.GetPosition(new LinePosition(request.EndLine, request.EndColumn)); - var changes = await FormattingWorker.GetFormattingChanges(document, start, end); + var syntaxTreeRoot = document.GetSyntaxRootAsync().Result; + var StartToken = syntaxTreeRoot.FindToken(start); + var tokenStart = StartToken.FullSpan.Start; + var EndToken = syntaxTreeRoot.FindToken(end); + var tokenEnd = EndToken.FullSpan.End; + var changes = await FormattingWorker.GetFormattingChanges(document, tokenStart, tokenEnd); return new FormatRangeResponse() { diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs index c47de1fda2..ab234c0a27 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs @@ -140,13 +140,13 @@ public async Task TextChangesOnSelectingBeforeFirstPositionInLine() "{", " public static void Main()", " {", - "[| int foo = 1;|]", + "[| int foo = 1;|]", " }", "}", }; await AssertTextChanges(string.Join("\r\n", source), - new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 0, NewText = "\n " }); + new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); } [Fact] @@ -164,7 +164,7 @@ public async Task TextChangesOnSelectingAfterFirstPositionInLine() }; await AssertTextChanges(string.Join("\r\n", source), - new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 0, NewText = "\n " }); + new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); } [Fact] From 41ffcc7606ccf5877f7e41476dce55e1767636bd Mon Sep 17 00:00:00 2001 From: Akshita Agarwal Date: Tue, 5 Dec 2017 11:18:05 -0800 Subject: [PATCH 3/7] Added test for multiple lines --- .../Services/Formatting/FormatRangeService.cs | 8 +--- .../FormattingFacts.cs | 47 +++++++++++++++++-- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs b/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs index 3b27b77968..35941fdefb 100644 --- a/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs +++ b/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs @@ -30,12 +30,8 @@ public async Task Handle(FormatRangeRequest request) var text = await document.GetTextAsync(); var start = text.Lines.GetPosition(new LinePosition(request.Line, request.Column)); var end = text.Lines.GetPosition(new LinePosition(request.EndLine, request.EndColumn)); - var syntaxTreeRoot = document.GetSyntaxRootAsync().Result; - var StartToken = syntaxTreeRoot.FindToken(start); - var tokenStart = StartToken.FullSpan.Start; - var EndToken = syntaxTreeRoot.FindToken(end); - var tokenEnd = EndToken.FullSpan.End; - var changes = await FormattingWorker.GetFormattingChanges(document, tokenStart, tokenEnd); + var tokenStart = document.GetSyntaxRootAsync().Result.FindToken(start).FullSpan.Start; + var changes = await FormattingWorker.GetFormattingChanges(document, tokenStart, end); return new FormatRangeResponse() { diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs index ab234c0a27..39231d1d8b 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs @@ -128,11 +128,44 @@ await AssertTextChanges(string.Join("\r\n", source), new LinePositionSpanTextChange { StartLine = 2, StartColumn = 30, EndLine = 3, EndColumn = 0, NewText = "\n " }); } + [Fact] + public async Task TextChangesOnStaringSpanBeforeFirstCharacterInLine() + { + var source = new[] + { + "class Program", + "{", + " public static void Main()", + " {", + "[| int foo = 1;|]", + " }", + "}", + }; + + await AssertTextChanges(string.Join("\r\n", source), + new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); + } + [Fact] + public async Task TextChangesOnStartingSpanAtFirstCharacterInLine() + { + var source = new[] + { + "class Program", + "{", + " public static void Main()", + " {", + " [|int foo = 1;|]", + " }", + "}", + }; + await AssertTextChanges(string.Join("\r\n", source), + new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); + } [Fact] - public async Task TextChangesOnSelectingBeforeFirstPositionInLine() + public async Task TextChangesOnStartingSpanAfterFirstCharacterInLine() { var source = new[] { @@ -140,7 +173,7 @@ public async Task TextChangesOnSelectingBeforeFirstPositionInLine() "{", " public static void Main()", " {", - "[| int foo = 1;|]", + " i[|nt foo = 1;|]", " }", "}", }; @@ -150,7 +183,7 @@ await AssertTextChanges(string.Join("\r\n", source), } [Fact] - public async Task TextChangesOnSelectingAfterFirstPositionInLine() + public async Task TextChangesOnStartingSpanAfterFirstCharacterInLineWithMultipleLines() { var source = new[] { @@ -158,15 +191,19 @@ public async Task TextChangesOnSelectingAfterFirstPositionInLine() "{", " public static void Main()", " {", - " [|int foo = 1;|]", + " i[|nt foo = 1;", + " bool b = false;", + " Console.WriteLine(foo);|] ", " }", "}", }; await AssertTextChanges(string.Join("\r\n", source), + new LinePositionSpanTextChange { StartLine = 5, StartColumn = 30, EndLine = 6, EndColumn = 7, NewText = "\n" }, + new LinePositionSpanTextChange { StartLine = 4, StartColumn = 27, EndLine = 5, EndColumn = 7, NewText = "\n" }, new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); } - + [Fact] public async Task FormatRespectsIndentationSize() { From e5383ee5dee88ef17ab35c6df9b9f92422091870 Mon Sep 17 00:00:00 2001 From: Akshita Agarwal Date: Tue, 5 Dec 2017 15:17:54 -0800 Subject: [PATCH 4/7] Added text instead of array of changes in the tests --- .../Services/Formatting/FormatRangeService.cs | 5 +- .../FormattingFacts.cs | 105 ++++++++++++++++-- 2 files changed, 97 insertions(+), 13 deletions(-) diff --git a/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs b/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs index 35941fdefb..4532577746 100644 --- a/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs +++ b/src/OmniSharp.Roslyn.CSharp/Services/Formatting/FormatRangeService.cs @@ -26,11 +26,12 @@ public async Task Handle(FormatRangeRequest request) { return null; } - + var text = await document.GetTextAsync(); var start = text.Lines.GetPosition(new LinePosition(request.Line, request.Column)); var end = text.Lines.GetPosition(new LinePosition(request.EndLine, request.EndColumn)); - var tokenStart = document.GetSyntaxRootAsync().Result.FindToken(start).FullSpan.Start; + var syntaxTree = await document.GetSyntaxRootAsync(); + var tokenStart = syntaxTree.FindToken(start).FullSpan.Start; var changes = await FormattingWorker.GetFormattingChanges(document, tokenStart, end); return new FormatRangeResponse() diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs index 39231d1d8b..cb9e252223 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs @@ -1,6 +1,8 @@ +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Text; using OmniSharp.Models; using OmniSharp.Models.CodeFormat; using OmniSharp.Models.Format; @@ -142,8 +144,16 @@ public async Task TextChangesOnStaringSpanBeforeFirstCharacterInLine() "}", }; - await AssertTextChanges(string.Join("\r\n", source), - new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); + var expected = +@"class Program +{ + public static void Main() + { + int foo = 1; + } +}"; + + await AssertTextChanges(string.Join("\r\n", source), expected); } [Fact] @@ -160,8 +170,16 @@ public async Task TextChangesOnStartingSpanAtFirstCharacterInLine() "}", }; - await AssertTextChanges(string.Join("\r\n", source), - new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); + var expected = +@"class Program +{ + public static void Main() + { + int foo = 1; + } +}"; + + await AssertTextChanges(string.Join("\r\n", source), expected); } [Fact] @@ -178,8 +196,16 @@ public async Task TextChangesOnStartingSpanAfterFirstCharacterInLine() "}", }; - await AssertTextChanges(string.Join("\r\n", source), - new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); + var expected = +@"class Program +{ + public static void Main() + { + int foo = 1; + } +}"; + + await AssertTextChanges(string.Join("\r\n", source), expected); } [Fact] @@ -193,17 +219,27 @@ public async Task TextChangesOnStartingSpanAfterFirstCharacterInLineWithMultiple " {", " i[|nt foo = 1;", " bool b = false;", - " Console.WriteLine(foo);|] ", + " Console.WriteLine(foo);|]", " }", "}", }; - await AssertTextChanges(string.Join("\r\n", source), - new LinePositionSpanTextChange { StartLine = 5, StartColumn = 30, EndLine = 6, EndColumn = 7, NewText = "\n" }, - new LinePositionSpanTextChange { StartLine = 4, StartColumn = 27, EndLine = 5, EndColumn = 7, NewText = "\n" }, - new LinePositionSpanTextChange { StartLine = 3, StartColumn = 5, EndLine = 4, EndColumn = 7, NewText = "\n" }); + var expected = +@"class Program +{ + public static void Main() + { + int foo = 1; + bool b = false; + Console.WriteLine(foo); + } +}"; + + await AssertTextChanges(string.Join("\r\n", source), expected); } + + [Fact] public async Task FormatRespectsIndentationSize() { @@ -276,5 +312,52 @@ private async Task AssertTextChanges(string source, params LinePositionSpanTextC } } } + + private async Task AssertTextChanges(string source, string expected) + { + var testFile = new TestFile("dummy.cs", source); + + using (var host = CreateOmniSharpHost(testFile)) + { + var span = testFile.Content.GetSpans().Single(); + var range = testFile.Content.GetRangeFromSpan(span); + + var request = new FormatRangeRequest() + { + Buffer = testFile.Content.Code, + FileName = testFile.FileName, + Line = range.Start.Line, + Column = range.Start.Offset, + EndLine = range.End.Line, + EndColumn = range.End.Offset + }; + + var requestHandler = host.GetRequestHandler(OmniSharpEndpoints.FormatRange); + + var response = await requestHandler.Handle(request); + var actual = response.Changes.ToArray(); + + var oldText = testFile.Content.Text; + var textChanges = GetTextChanges(oldText, response.Changes); + var actualText = oldText.WithChanges(textChanges).ToString(); + Assert.Equal(expected.Replace("\r\n","\n"), actualText.Replace("\r\n","\n")); + + } + } + + public static IEnumerable GetTextChanges(SourceText oldText, IEnumerable changes) + { + var textChanges = new List(); + foreach( var change in changes) + { + var startPosition = new LinePosition(change.StartLine, change.StartColumn); + var endPosition = new LinePosition(change.EndLine, change.EndColumn); + var span = oldText.Lines.GetTextSpan(new LinePositionSpan(startPosition, endPosition)); + var newText = change.NewText; + textChanges.Add(new TextChange(span, newText)); + } + + return textChanges.OrderBy(change => change.Span); + } } } From 40098eed60b60a0077351a24d8460a3a15678952 Mon Sep 17 00:00:00 2001 From: Akshita Agarwal Date: Tue, 5 Dec 2017 15:49:17 -0800 Subject: [PATCH 5/7] Removed unnecessary line --- tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs index cb9e252223..5fd9b59c78 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs @@ -341,7 +341,6 @@ private async Task AssertTextChanges(string source, string expected) var textChanges = GetTextChanges(oldText, response.Changes); var actualText = oldText.WithChanges(textChanges).ToString(); Assert.Equal(expected.Replace("\r\n","\n"), actualText.Replace("\r\n","\n")); - } } From 18955cfbe47059d71562194c8081eb14cc333a95 Mon Sep 17 00:00:00 2001 From: Akshita Agarwal Date: Tue, 5 Dec 2017 16:59:29 -0800 Subject: [PATCH 6/7] Using string literals --- .../FormattingFacts.cs | 89 ++++++++----------- 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs index 5fd9b59c78..fde2c25e83 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs @@ -133,16 +133,14 @@ await AssertTextChanges(string.Join("\r\n", source), [Fact] public async Task TextChangesOnStaringSpanBeforeFirstCharacterInLine() { - var source = new[] - { - "class Program", - "{", - " public static void Main()", - " {", - "[| int foo = 1;|]", - " }", - "}", - }; + var source = + @"class Program +{ + public static void Main() + { + [| int foo = 1;|] + } +}"; var expected = @"class Program @@ -153,23 +151,20 @@ public static void Main() } }"; - await AssertTextChanges(string.Join("\r\n", source), expected); + await AssertTextChanges(source, expected); } [Fact] public async Task TextChangesOnStartingSpanAtFirstCharacterInLine() { - var source = new[] - { - "class Program", - "{", - " public static void Main()", - " {", - " [|int foo = 1;|]", - " }", - "}", - }; - + var source = + @"class Program +{ + public static void Main() + { + [|int foo = 1;|] + } +}"; var expected = @"class Program { @@ -179,22 +174,20 @@ public static void Main() } }"; - await AssertTextChanges(string.Join("\r\n", source), expected); + await AssertTextChanges(source, expected); } [Fact] public async Task TextChangesOnStartingSpanAfterFirstCharacterInLine() { - var source = new[] - { - "class Program", - "{", - " public static void Main()", - " {", - " i[|nt foo = 1;|]", - " }", - "}", - }; + var source = + @"class Program +{ + public static void Main() + { + i[|nt foo = 1;|] + } +}"; var expected = @"class Program @@ -205,24 +198,22 @@ public static void Main() } }"; - await AssertTextChanges(string.Join("\r\n", source), expected); + await AssertTextChanges(source, expected); } [Fact] public async Task TextChangesOnStartingSpanAfterFirstCharacterInLineWithMultipleLines() { - var source = new[] - { - "class Program", - "{", - " public static void Main()", - " {", - " i[|nt foo = 1;", - " bool b = false;", - " Console.WriteLine(foo);|]", - " }", - "}", - }; + var source = +@"class Program +{ + public static void Main() + { + i[|nt foo = 1; + bool b = false; + Console.WriteLine(foo);|] + } +}"; var expected = @"class Program @@ -235,11 +226,9 @@ public static void Main() } }"; - await AssertTextChanges(string.Join("\r\n", source), expected); + await AssertTextChanges(source, expected); } - - [Fact] public async Task FormatRespectsIndentationSize() { @@ -347,7 +336,7 @@ private async Task AssertTextChanges(string source, string expected) public static IEnumerable GetTextChanges(SourceText oldText, IEnumerable changes) { var textChanges = new List(); - foreach( var change in changes) + foreach(var change in changes) { var startPosition = new LinePosition(change.StartLine, change.StartColumn); var endPosition = new LinePosition(change.EndLine, change.EndColumn); From 35117b1ef77042f6d03a31c9fdbb6ba2c779eb68 Mon Sep 17 00:00:00 2001 From: Akshita Agarwal Date: Wed, 6 Dec 2017 16:15:58 -0800 Subject: [PATCH 7/7] Added Space --- tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs index fde2c25e83..54ab13d265 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/FormattingFacts.cs @@ -336,7 +336,7 @@ private async Task AssertTextChanges(string source, string expected) public static IEnumerable GetTextChanges(SourceText oldText, IEnumerable changes) { var textChanges = new List(); - foreach(var change in changes) + foreach (var change in changes) { var startPosition = new LinePosition(change.StartLine, change.StartColumn); var endPosition = new LinePosition(change.EndLine, change.EndColumn);