Skip to content

Commit 09eefe8

Browse files
committed
user source to metadata source go to line
1 parent 6d25ca8 commit 09eefe8

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,7 +1002,7 @@ public async Task<ImmutableArray<IdeReferenceLocationResult>> GetIdeReferenceLoc
10021002
return document.FilePath;
10031003
}
10041004

1005-
public async Task<string?> GetMetadataAsSource(SharpIdeFile currentFile, ISymbol symbol, CancellationToken cancellationToken = default)
1005+
public async Task<(string FilePath, Location Location)?> GetMetadataAsSourceForSymbol(SharpIdeFile currentFile, ISymbol symbol, CancellationToken cancellationToken = default)
10061006
{
10071007
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(FindAllSymbolReferences)}");
10081008
await _solutionLoadedTcs.Task;
@@ -1015,8 +1015,10 @@ public async Task<ImmutableArray<IdeReferenceLocationResult>> GetIdeReferenceLoc
10151015
Console.WriteLine(metadataAsSourceFile.FilePath);
10161016
var metadataAsSourceWorkspace = _metadataAsSourceFileService.TryGetWorkspace();
10171017
var documentId = metadataAsSourceWorkspace!.CurrentSolution.GetDocumentIdsWithFilePath(metadataAsSourceFile.FilePath).SingleOrDefault();
1018-
var document = metadataAsSourceWorkspace.CurrentSolution.GetDocument(documentId);
1019-
return document?.FilePath;
1018+
if (documentId is null) return null;
1019+
var document = await metadataAsSourceWorkspace.CurrentSolution.GetRequiredDocumentAsync(documentId, cancellationToken);
1020+
if (document.FilePath is null) return null;
1021+
return (document.FilePath, metadataAsSourceFile.IdentifierLocation);
10201022
}
10211023

10221024
public async Task<ImmutableArray<ReferencedSymbol>> FindAllSymbolReferences(ISymbol symbol, CancellationToken cancellationToken = default)

src/SharpIDE.Application/Features/Analysis/SharpIdeMetadataAsSourceService.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ public class SharpIdeMetadataAsSourceService(RoslynAnalysis roslynAnalysis)
88
private readonly RoslynAnalysis _roslynAnalysis = roslynAnalysis;
99
private readonly Dictionary<string, SharpIdeFile> _metadataAsSourceFileCache = [];
1010

11-
public async Task<SharpIdeFile?> CreateSharpIdeFileForMetadataAsSourceAsync(SharpIdeFile currentFile, ISymbol referencedSymbol)
11+
public async Task<(SharpIdeFile, Location)?> CreateSharpIdeFileForMetadataAsSourceAsync(SharpIdeFile currentFile, ISymbol referencedSymbol)
1212
{
13-
var filePath = await _roslynAnalysis.GetMetadataAsSource(currentFile, referencedSymbol);
14-
if (filePath is null) return null;
13+
var result = await _roslynAnalysis.GetMetadataAsSourceForSymbol(currentFile, referencedSymbol);
14+
if (result is null) return null;
15+
var (filePath, requestedSymbolLocation) = result.Value;
1516
var fileFromCache = _metadataAsSourceFileCache.GetValueOrDefault(filePath);
16-
if (fileFromCache is not null) return fileFromCache;
17+
if (fileFromCache is not null) return (fileFromCache, requestedSymbolLocation);
1718
var metadataAsSourceSharpIdeFile = new SharpIdeFile(filePath, Path.GetFileName(filePath), Path.GetExtension(filePath), null!, [], true);
1819
_metadataAsSourceFileCache[filePath] = metadataAsSourceSharpIdeFile;
19-
return metadataAsSourceSharpIdeFile;
20+
return (metadataAsSourceSharpIdeFile, requestedSymbolLocation);
2021
}
2122

2223
public async Task<SharpIdeFile?> GetOrCreateSharpIdeFileForAlreadyDecompiledMetadataAsSourceAsync(string filePath)

src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_SymbolLookup.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,13 @@ await this.InvokeAsync(() =>
9999
else
100100
{
101101
GD.Print($"Definition is not in source code, attempting to navigate to metadata as source: {referencedSymbol.Name}");
102-
var metadataAsSourceSharpIdeFile = await _sharpIdeMetadataAsSourceService.CreateSharpIdeFileForMetadataAsSourceAsync(_currentFile, referencedSymbol);
103-
if (metadataAsSourceSharpIdeFile is not null)
102+
var result = await _sharpIdeMetadataAsSourceService.CreateSharpIdeFileForMetadataAsSourceAsync(_currentFile, referencedSymbol);
103+
if (result is not null)
104104
{
105-
await GodotGlobalEvents.Instance.FileExternallySelected.InvokeParallelAsync(metadataAsSourceSharpIdeFile, new SharpIdeFileLinePosition(0, 0));
105+
var (metadataAsSourceSharpIdeFile, location) = result.Value;
106+
var definitionInMetadataSourceLineSpan = location.GetMappedLineSpan();
107+
var linePosition = new SharpIdeFileLinePosition(definitionInMetadataSourceLineSpan.Span.Start.Line, definitionInMetadataSourceLineSpan.Span.Start.Character);
108+
await GodotGlobalEvents.Instance.FileExternallySelected.InvokeParallelAsync(metadataAsSourceSharpIdeFile, linePosition);
106109
}
107110
else
108111
{

0 commit comments

Comments
 (0)