Skip to content

Commit 8babb3a

Browse files
authored
Fix span calculation on RazorMapToDocumentRangesEndpoint (#11798)
It turns out when converting a range to a span you need to use the right SourceText...
2 parents ac9bd79 + d880023 commit 8babb3a

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Mapping/RazorMapToDocumentRangesEndpoint.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public Uri GetTextDocumentIdentifier(RazorMapToDocumentRangesParams request)
7272
}
7373

7474
ranges[i] = originalRange;
75-
spans[i] = originalRange.ToRazorTextSpan(generatedDocument.Text);
75+
spans[i] = originalRange.ToRazorTextSpan(codeDocument.Source.Text);
7676
}
7777

7878
return new RazorMapToDocumentRangesResponse()

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/Mapping/RazorMapToDocumentRangesEndpointTest.cs

+41
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.CodeAnalysis.Razor.DocumentMapping;
1010
using Microsoft.CodeAnalysis.Razor.Protocol;
1111
using Microsoft.CodeAnalysis.Razor.Protocol.DocumentMapping;
12+
using Microsoft.CodeAnalysis.Testing;
1213
using Xunit;
1314
using Xunit.Abstractions;
1415

@@ -190,6 +191,46 @@ public async Task Handle_MapToDocumentRanges_Razor()
190191
Assert.Null(response);
191192
}
192193

194+
[Fact]
195+
public async Task Handle_MapToDocumentRanges_CSharp_LargeFile()
196+
{
197+
// Arrange
198+
var chsarpAnnotatedSource = """
199+
class C
200+
{
201+
public void M()
202+
{
203+
var currentTime = [|DateTime.Now|];
204+
}
205+
}
206+
""";
207+
208+
TestFileMarkupParser.GetSpan(chsarpAnnotatedSource, out var csharpSource, out var projectedRange);
209+
var documentPath = new Uri("C:/path/to/document.cshtml");
210+
var codeDocument = CreateCodeDocumentWithCSharpProjection(
211+
razorSource: "<p>@DateTime.Now</p>",
212+
projectedCSharpSource: csharpSource,
213+
sourceMappings: [new SourceMapping(new SourceSpan(4, 12), new SourceSpan(projectedRange.Start, projectedRange.Length))]);
214+
var documentContext = CreateDocumentContext(documentPath, codeDocument);
215+
var languageEndpoint = new RazorMapToDocumentRangesEndpoint(_documentMappingService);
216+
var request = new RazorMapToDocumentRangesParams()
217+
{
218+
Kind = RazorLanguageKind.CSharp,
219+
ProjectedRanges = [LspFactory.CreateSingleLineRange(line: 4, character: 26, length: 12)],
220+
RazorDocumentUri = documentPath,
221+
};
222+
var expectedRange = LspFactory.CreateSingleLineRange(line: 0, character: 4, length: 12);
223+
224+
var requestContext = CreateRazorRequestContext(documentContext);
225+
226+
// Act
227+
var response = await languageEndpoint.HandleRequestAsync(request, requestContext, DisposalToken);
228+
229+
// Assert
230+
Assert.NotNull(response);
231+
Assert.Equal(expectedRange, response.Ranges[0]);
232+
}
233+
193234
private static RazorCodeDocument CreateCodeDocumentWithCSharpProjection(string razorSource, string projectedCSharpSource, ImmutableArray<SourceMapping> sourceMappings)
194235
{
195236
var codeDocument = CreateCodeDocument(razorSource, tagHelpers: []);

0 commit comments

Comments
 (0)