From c4f46320f762b919954ff56b5d4a158ed01b469b Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Mon, 27 Oct 2025 18:21:01 +1000 Subject: [PATCH] fix more razor symbol hovers --- .../Features/Analysis/RoslynAnalysis.cs | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs index 9d5f5c1..5bf4a49 100644 --- a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs +++ b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs @@ -725,9 +725,10 @@ public class RoslynAnalysis(ILogger logger, BuildService buildSe var generatedDocSyntaxRoot = await generatedDocument.GetSyntaxRootAsync(cancellationToken); var razorText = await additionalDocument.GetTextAsync(cancellationToken); - - var mappedPosition = MapRazorLinePositionToGeneratedCSharpAbsolutePosition(razorCSharpDocument, razorText, linePosition); + var razorAbsoluteIndex = razorText.Lines.GetPosition(linePosition); + var mappedPosition = MapRazorLinePositionToGeneratedCSharpAbsolutePosition(razorCSharpDocument, razorAbsoluteIndex); if (mappedPosition is null) return (null, null); + var semanticModelAsync = await generatedDocument.GetSemanticModelAsync(cancellationToken); var (symbol, linePositionSpan) = GetSymbolAtPosition(semanticModelAsync!, generatedDocSyntaxRoot!, mappedPosition!.Value); if (symbol is null || linePositionSpan is null) return (null, null); @@ -783,8 +784,9 @@ public class RoslynAnalysis(ILogger logger, BuildService buildSe var generatedDocSyntaxRoot = await generatedDocument.GetSyntaxRootAsync(cancellationToken); var razorText = await additionalDocument.GetTextAsync(cancellationToken); + var razorAbsoluteIndex = razorText.Lines.GetPosition(linePosition); + var mappedPosition = MapRazorLinePositionToGeneratedCSharpAbsolutePosition(razorCSharpDocument, razorAbsoluteIndex); - var mappedPosition = MapRazorLinePositionToGeneratedCSharpAbsolutePosition(razorCSharpDocument, razorText, linePosition); var semanticModel = await generatedDocument.GetSemanticModelAsync(cancellationToken); var (symbol, linePositionSpan) = GetSymbolAtPosition(semanticModel!, generatedDocSyntaxRoot!, mappedPosition!.Value); @@ -817,6 +819,9 @@ public class RoslynAnalysis(ILogger logger, BuildService buildSe VariableDeclaratorSyntax variableDecl => variableDecl.Identifier.Span, AccessorDeclarationSyntax accessorDecl => accessorDecl.Keyword.Span, IndexerDeclarationSyntax indexerDecl => indexerDecl.ThisKeyword.Span, + + GenericNameSyntax genericDecl => genericDecl.Identifier.Span, + IdentifierNameSyntax identifierDecl => identifierDecl.Identifier.Span, _ => node.Span }; @@ -825,21 +830,11 @@ public class RoslynAnalysis(ILogger logger, BuildService buildSe return (symbol, linePositionSpan); } - private static int? MapRazorLinePositionToGeneratedCSharpAbsolutePosition(RazorCSharpDocument razorCSharpDocument, SourceText razorText, LinePosition razorLinePosition) + private static int? MapRazorLinePositionToGeneratedCSharpAbsolutePosition(RazorCSharpDocument razorCSharpDocument, int razorAbsoluteIndex) { - var mappings = razorCSharpDocument.SourceMappings; - var razorOffset = razorText.Lines.GetPosition(razorLinePosition); - - foreach (var mapping in mappings) + if (_documentMappingService!.TryMapToCSharpDocumentPosition(razorCSharpDocument, razorAbsoluteIndex, out var csharpPosition, out var csharpIndex)) { - var span = mapping.OriginalSpan; - if (razorOffset >= span.AbsoluteIndex && razorOffset < span.AbsoluteIndex + span.Length) - { - // Calculate offset within the mapping - var offsetInMapping = razorOffset - span.AbsoluteIndex; - // Map to generated C# position - return mapping.GeneratedSpan.AbsoluteIndex + offsetInMapping; - } + return csharpIndex; } return null; }