Skip to content

Commit 38cced1

Browse files
author
Andrew Hall
authored
Fix bug where exact path match would throw for additional files (#77583)
From /pull/77517/files/45c0e103f76f36bed6004f836d3dcfeae4bfae0d#r1992506030
1 parent 17368bc commit 38cced1

File tree

2 files changed

+85
-9
lines changed

2 files changed

+85
-9
lines changed

src/EditorFeatures/Test/StackTraceExplorer/StackTraceExplorerTests.cs

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ private static async Task TestSymbolFoundAsync(string inputLine, string code)
3232
var reparsedResult = await StackTraceAnalyzer.AnalyzeAsync(stackFrame.ToString(), CancellationToken.None);
3333
Assert.Single(reparsedResult.ParsedFrames);
3434

35-
var reparsedFrame = reparsedResult.ParsedFrames[0] as ParsedStackFrame;
36-
AssertEx.NotNull(reparsedFrame);
35+
var reparsedFrame = Assert.IsType<ParsedStackFrame>(reparsedResult.ParsedFrames[0]);
3736
StackFrameUtils.AssertEqual(stackFrame.Root, reparsedFrame.Root);
3837

3938
// Get the definition for the parsed frame
@@ -820,9 +819,9 @@ class C
820819
var result = await StackTraceAnalyzer.AnalyzeAsync(line, CancellationToken.None);
821820
Assert.Equal(1, result.ParsedFrames.Length);
822821

823-
var parsedFame = result.ParsedFrames.OfType<ParsedStackFrame>().Single();
822+
var parsedFrame = Assert.IsType<ParsedStackFrame>(result.ParsedFrames[0]);
824823
var service = workspace.Services.GetRequiredService<IStackTraceExplorerService>();
825-
var definition = await service.TryFindDefinitionAsync(workspace.CurrentSolution, parsedFame, StackFrameSymbolPart.Method, CancellationToken.None);
824+
var definition = await service.TryFindDefinitionAsync(workspace.CurrentSolution, parsedFrame, StackFrameSymbolPart.Method, CancellationToken.None);
826825
Assert.Null(definition);
827826
}
828827

@@ -850,13 +849,89 @@ public async Task TestMetadataSymbol()
850849
var result = await StackTraceAnalyzer.AnalyzeAsync("at System.String.ToLower()", CancellationToken.None);
851850
Assert.Single(result.ParsedFrames);
852851

853-
var frame = result.ParsedFrames[0] as ParsedStackFrame;
854-
AssertEx.NotNull(frame);
855-
852+
var frame = Assert.IsType<ParsedStackFrame>(result.ParsedFrames[0]);
856853
var service = workspace.Services.GetRequiredService<IStackTraceExplorerService>();
857854
var definition = await service.TryFindDefinitionAsync(workspace.CurrentSolution, frame, StackFrameSymbolPart.Method, CancellationToken.None);
858855

859856
AssertEx.NotNull(definition);
860857
Assert.Equal("String.ToLower", definition.NameDisplayParts.ToVisibleDisplayString(includeLeftToRightMarker: false));
861858
}
859+
860+
[Fact]
861+
public async Task TestAdditionalFileExactMatchAsync()
862+
{
863+
using var workspace = TestWorkspace.Create(
864+
"""
865+
<Workspace>
866+
<Project Language="C#" CommonReferences="true">
867+
<Document>
868+
class C
869+
{
870+
void M() {}
871+
}
872+
</Document>
873+
<AdditionalDocument FilePath="C:/path/to/Component.razor">
874+
@page "/"
875+
876+
@code
877+
{
878+
void M()
879+
{
880+
}
881+
}
882+
</AdditionalDocument>
883+
</Project>
884+
</Workspace>
885+
""");
886+
887+
var result = await StackTraceAnalyzer.AnalyzeAsync("at Path.To.Component.M() in C:/path/to/Component.razor:line 5", CancellationToken.None);
888+
Assert.Single(result.ParsedFrames);
889+
890+
var frame = Assert.IsType<ParsedStackFrame>(result.ParsedFrames[0]);
891+
var service = workspace.Services.GetRequiredService<IStackTraceExplorerService>();
892+
var (document, line) = service.GetDocumentAndLine(workspace.CurrentSolution, frame);
893+
Assert.Equal(5, line);
894+
895+
AssertEx.NotNull(document);
896+
Assert.Equal(@"C:/path/to/Component.razor", document.FilePath);
897+
}
898+
899+
[Fact]
900+
public async Task TestAdditionalFileNameMatchAsync()
901+
{
902+
using var workspace = TestWorkspace.Create(
903+
"""
904+
<Workspace>
905+
<Project Language="C#" CommonReferences="true">
906+
<Document>
907+
class C
908+
{
909+
void M() {}
910+
}
911+
</Document>
912+
<AdditionalDocument FilePath="C:/path/to/Component.razor" Name="Component.razor">
913+
@page "/"
914+
915+
@code
916+
{
917+
void M()
918+
{
919+
}
920+
}
921+
</AdditionalDocument>
922+
</Project>
923+
</Workspace>
924+
""");
925+
926+
var result = await StackTraceAnalyzer.AnalyzeAsync("at Path.To.Component.M() in Component.razor:line 5", CancellationToken.None);
927+
Assert.Single(result.ParsedFrames);
928+
929+
var frame = Assert.IsType<ParsedStackFrame>(result.ParsedFrames[0]);
930+
var service = workspace.Services.GetRequiredService<IStackTraceExplorerService>();
931+
var (document, line) = service.GetDocumentAndLine(workspace.CurrentSolution, frame);
932+
Assert.Equal(5, line);
933+
934+
AssertEx.NotNull(document);
935+
Assert.Equal(@"C:/path/to/Component.razor", document.FilePath);
936+
}
862937
}

src/Features/Core/Portable/StackTraceExplorer/StackTraceExplorerService.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private static ImmutableArray<TextDocument> GetFileMatches(Solution solution, St
8989

9090
if (documentId is not null)
9191
{
92-
var document = solution.GetRequiredDocument(documentId);
92+
var document = solution.GetRequiredTextDocument(documentId);
9393
return [document];
9494
}
9595

@@ -105,7 +105,8 @@ private static ImmutableArray<TextDocument> GetFileMatches(Solution solution, St
105105

106106
foreach (var document in allDocuments)
107107
{
108-
if (string.Equals(document.Name, documentName, StringComparison.OrdinalIgnoreCase))
108+
var name = Path.GetFileName(document.Name);
109+
if (name.Equals(documentName, StringComparison.OrdinalIgnoreCase))
109110
{
110111
potentialMatches.Add(document);
111112
}

0 commit comments

Comments
 (0)