diff --git a/src/OmniSharp.Roslyn.CSharp/Services/Structure/BlockStructureService.cs b/src/OmniSharp.Roslyn.CSharp/Services/Structure/BlockStructureService.cs index ee48b34f46..7a1d6ebcaf 100644 --- a/src/OmniSharp.Roslyn.CSharp/Services/Structure/BlockStructureService.cs +++ b/src/OmniSharp.Roslyn.CSharp/Services/Structure/BlockStructureService.cs @@ -56,7 +56,7 @@ public async Task Handle(BlockStructureRequest request) var document = await _workspace.GetDocumentFromFullProjectModelAsync(request.FileName); if (document == null) { - return null; + return new BlockStructureResponse { Spans = Array.Empty() }; } var text = await document.GetTextAsync(); diff --git a/src/OmniSharp.Roslyn.CSharp/Services/Structure/CodeStructureService.cs b/src/OmniSharp.Roslyn.CSharp/Services/Structure/CodeStructureService.cs index e3d0b661e6..9619f6fe0c 100644 --- a/src/OmniSharp.Roslyn.CSharp/Services/Structure/CodeStructureService.cs +++ b/src/OmniSharp.Roslyn.CSharp/Services/Structure/CodeStructureService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.Immutable; using System.Composition; using System.Threading.Tasks; @@ -36,7 +37,7 @@ public async Task Handle(CodeStructureRequest request) var document = await _workspace.GetDocumentFromFullProjectModelAsync(request.FileName); if (document == null) { - return null; + return new CodeStructureResponse { Elements = Array.Empty() }; } var elements = await GetCodeElementsAsync(document); diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/BlockStructureFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/BlockStructureFacts.cs index e62b5c15d3..2579e0baba 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/BlockStructureFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/BlockStructureFacts.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using System.Threading.Tasks; using OmniSharp.Models.V2; @@ -41,6 +42,21 @@ public async Task UsesRoslynBlockStructureService() Assert.Equal(expected, lineSpans); } + [Fact] + public async Task NonExistingFile() + { + var request = new BlockStructureRequest + { + FileName = $"{Guid.NewGuid().ToString("N")}.cs" + }; + + var requestHandler = GetRequestHandler(SharedOmniSharpTestHost); + var response = await requestHandler.Handle(request); + + Assert.NotNull(response); + Assert.Empty(response.Spans); + } + [Fact] public async Task SupportsRegionBlocks() { diff --git a/tests/OmniSharp.Roslyn.CSharp.Tests/CodeStructureFacts.cs b/tests/OmniSharp.Roslyn.CSharp.Tests/CodeStructureFacts.cs index 1c2227b6e2..92bba01be0 100644 --- a/tests/OmniSharp.Roslyn.CSharp.Tests/CodeStructureFacts.cs +++ b/tests/OmniSharp.Roslyn.CSharp.Tests/CodeStructureFacts.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using OmniSharp.Mef; @@ -413,6 +414,21 @@ class C AssertRange(elementC.Children[15], testFile.Content, "nameThis", "name"); } + [Fact] + public async Task NonExistingFile() + { + var request = new CodeStructureRequest + { + FileName = $"{Guid.NewGuid().ToString("N")}.cs" + }; + + var requestHandler = GetRequestHandler(SharedOmniSharpTestHost); + var response = await requestHandler.Handle(request); + + Assert.NotNull(response); + Assert.Empty(response.Elements); + } + private static void AssertRange(CodeElement elementC, TestContent content, string contentSpanName, string elementRangeName) { var span = Assert.Single(content.GetSpans(contentSpanName));