Skip to content

Commit 82ec11f

Browse files
committed
Fix outline view (filter out EmptyScriptExtent)
And also prepare `SymbolReference` for eventual support of `DocumentSymbol`.
1 parent e7d3afe commit 82ec11f

File tree

11 files changed

+193
-103
lines changed

11 files changed

+193
-103
lines changed

src/PowerShellEditorServices/Services/Symbols/ReferenceTable.cs

+37-10
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,20 @@ internal void EnsureInitialized()
7171
_parent.ScriptAst.Visit(new ReferenceVisitor(this));
7272
}
7373

74-
private void AddReference(SymbolType type, string name, IScriptExtent extent, bool isDeclaration = false)
74+
private static bool ExtentIsEmpty(IScriptExtent e) => string.IsNullOrEmpty(e.File) &&
75+
e.StartLineNumber == 0 && e.StartColumnNumber == 0 &&
76+
e.EndLineNumber == 0 && e.EndColumnNumber == 0 &&
77+
string.IsNullOrEmpty(e.Text);
78+
79+
private void AddReference(SymbolType type, string name, IScriptExtent nameExtent, IScriptExtent extent, bool isDeclaration = false)
7580
{
76-
SymbolReference symbol = new(type, name, extent, _parent, isDeclaration);
81+
// We have to exclude implicit things like `$this` that don't actually exist.
82+
if (ExtentIsEmpty(extent))
83+
{
84+
return;
85+
}
86+
87+
SymbolReference symbol = new(type, name, nameExtent, extent, _parent, isDeclaration);
7788
_symbolReferences.AddOrUpdate(
7889
name,
7990
_ => new ConcurrentBag<SymbolReference> { symbol },
@@ -103,7 +114,8 @@ public override AstVisitAction VisitCommand(CommandAst commandAst)
103114
_references.AddReference(
104115
SymbolType.Function,
105116
CommandHelpers.StripModuleQualification(commandName, out _),
106-
commandAst.CommandElements[0].Extent
117+
commandAst.CommandElements[0].Extent,
118+
commandAst.Extent
107119
);
108120

109121
return AstVisitAction.Continue;
@@ -131,6 +143,7 @@ public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst fun
131143
symbolType,
132144
functionDefinitionAst.Name,
133145
nameExtent,
146+
functionDefinitionAst.Extent,
134147
isDeclaration: true);
135148

136149
return AstVisitAction.Continue;
@@ -141,6 +154,7 @@ public override AstVisitAction VisitCommandParameter(CommandParameterAst command
141154
_references.AddReference(
142155
SymbolType.Parameter,
143156
commandParameterAst.Extent.Text,
157+
commandParameterAst.Extent,
144158
commandParameterAst.Extent);
145159

146160
return AstVisitAction.Continue;
@@ -153,6 +167,7 @@ public override AstVisitAction VisitVariableExpression(VariableExpressionAst var
153167
_references.AddReference(
154168
SymbolType.Variable,
155169
$"${variableExpressionAst.VariablePath.UserPath}",
170+
variableExpressionAst.Extent,
156171
variableExpressionAst.Extent
157172
);
158173

@@ -166,7 +181,11 @@ public override AstVisitAction VisitTypeDefinition(TypeDefinitionAst typeDefinit
166181
: SymbolType.Class;
167182

168183
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(typeDefinitionAst);
169-
_references.AddReference(symbolType, typeDefinitionAst.Name, nameExtent);
184+
_references.AddReference(
185+
symbolType,
186+
typeDefinitionAst.Name,
187+
nameExtent,
188+
typeDefinitionAst.Extent);
170189

171190
return AstVisitAction.Continue;
172191
}
@@ -176,14 +195,19 @@ public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpress
176195
_references.AddReference(
177196
SymbolType.Type,
178197
typeExpressionAst.TypeName.Name,
198+
typeExpressionAst.Extent,
179199
typeExpressionAst.Extent);
180200

181201
return AstVisitAction.Continue;
182202
}
183203

184204
public override AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
185205
{
186-
_references.AddReference(SymbolType.Type, typeConstraintAst.TypeName.Name, typeConstraintAst.Extent);
206+
_references.AddReference(
207+
SymbolType.Type,
208+
typeConstraintAst.TypeName.Name,
209+
typeConstraintAst.Extent,
210+
typeConstraintAst.Extent);
187211

188212
return AstVisitAction.Continue;
189213
}
@@ -197,8 +221,9 @@ public override AstVisitAction VisitFunctionMember(FunctionMemberAst functionMem
197221
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(functionMemberAst, true, false);
198222
_references.AddReference(
199223
symbolType,
200-
VisitorUtils.GetMemberOverloadName(functionMemberAst, true, false),
201-
nameExtent);
224+
nameExtent.Text,
225+
nameExtent,
226+
functionMemberAst.Extent);
202227

203228
return AstVisitAction.Continue;
204229
}
@@ -212,8 +237,9 @@ propertyMemberAst.Parent is TypeDefinitionAst typeAst && typeAst.IsEnum
212237
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(propertyMemberAst, false);
213238
_references.AddReference(
214239
symbolType,
215-
VisitorUtils.GetMemberOverloadName(propertyMemberAst, false),
216-
nameExtent);
240+
nameExtent.Text,
241+
nameExtent,
242+
propertyMemberAst.Extent);
217243

218244
return AstVisitAction.Continue;
219245
}
@@ -224,7 +250,8 @@ public override AstVisitAction VisitConfigurationDefinition(ConfigurationDefinit
224250
_references.AddReference(
225251
SymbolType.Configuration,
226252
nameExtent.Text,
227-
nameExtent);
253+
nameExtent,
254+
configurationDefinitionAst.Extent);
228255

229256
return AstVisitAction.Continue;
230257
}

src/PowerShellEditorServices/Services/Symbols/ScriptExtent.cs

+2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ public int EndOffset
9191
set;
9292
}
9393

94+
public override string ToString() => Text;
95+
9496
/// <summary>
9597
/// Gets the ending script position of the extent.
9698
/// </summary>

src/PowerShellEditorServices/Services/Symbols/SymbolReference.cs

+5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ internal record SymbolReference
1919

2020
public string SymbolName { get; }
2121

22+
public ScriptRegion NameRegion { get; }
23+
2224
public ScriptRegion ScriptRegion { get; }
2325

2426
public string SourceLine { get; internal set; }
@@ -48,6 +50,7 @@ public SymbolReference(
4850
SymbolType = symbolType;
4951
SymbolName = symbolName;
5052
ScriptRegion = new(scriptExtent);
53+
NameRegion = ScriptRegion;
5154
FilePath = filePath;
5255
SourceLine = sourceLine;
5356
IsDeclaration = isDeclaration;
@@ -56,12 +59,14 @@ public SymbolReference(
5659
public SymbolReference(
5760
SymbolType symbolType,
5861
string symbolName,
62+
IScriptExtent nameExtent,
5963
IScriptExtent scriptExtent,
6064
ScriptFile file,
6165
bool isDeclaration)
6266
{
6367
SymbolType = symbolType;
6468
SymbolName = symbolName;
69+
NameRegion = new(nameExtent);
6570
ScriptRegion = new(scriptExtent);
6671
FilePath = file.FilePath;
6772
try

src/PowerShellEditorServices/Services/Symbols/SymbolsService.cs

+1
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ public async Task<SymbolReference> GetDefinitionOfSymbolAsync(
429429
SymbolReference foundDefinition = null;
430430
foreach (ScriptFile scriptFile in referencedFiles)
431431
{
432+
// TODO: This needs to just search the file's references (filtered to declarations);
432433
foundDefinition = AstOperations.FindDefinitionOfSymbol(scriptFile.ScriptAst, foundSymbol);
433434

434435
filesSearched.Add(scriptFile.FilePath);

src/PowerShellEditorServices/Services/TextDocument/Handlers/DocumentHighlightHandler.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public override Task<DocumentHighlightContainer> Handle(
5656
highlights.Add(new DocumentHighlight
5757
{
5858
Kind = DocumentHighlightKind.Write, // TODO: Which symbol types are writable?
59-
Range = occurrence.ScriptRegion.ToRange()
59+
Range = occurrence.NameRegion.ToRange() // Just the symbol name
6060
});
6161
}
6262

src/PowerShellEditorServices/Services/TextDocument/Handlers/DocumentSymbolHandler.cs

+16-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public override async Task<SymbolInformationOrDocumentSymbolContainer> Handle(Do
5555
}
5656

5757
string containerName = Path.GetFileNameWithoutExtension(scriptFile.FilePath);
58+
5859
List<SymbolInformationOrDocumentSymbol> symbols = new();
5960
foreach (SymbolReference r in foundSymbols)
6061
{
@@ -63,15 +64,29 @@ public override async Task<SymbolInformationOrDocumentSymbolContainer> Handle(Do
6364
await Task.Yield();
6465
cancellationToken.ThrowIfCancellationRequested();
6566

67+
if (r.SymbolType is SymbolType.Type)
68+
{
69+
continue;
70+
}
71+
6672
// TODO: This should be a DocumentSymbol now as SymbolInformation is deprecated.
73+
// But this requires figuring out how to populate `children`.
74+
//
75+
// symbols.Add(new SymbolInformationOrDocumentSymbol(new DocumentSymbol
76+
// {
77+
// Name = SymbolTypeUtils.GetDecoratedSymbolName(r),
78+
// Kind = SymbolTypeUtils.GetSymbolKind(r.SymbolType),
79+
// Range = r.ScriptRegion.ToRange(),
80+
// SelectionRange = r.NameRegion.ToRange()
81+
// }));
6782
symbols.Add(new SymbolInformationOrDocumentSymbol(new SymbolInformation
6883
{
6984
ContainerName = containerName,
7085
Kind = SymbolTypeUtils.GetSymbolKind(r.SymbolType),
7186
Location = new Location
7287
{
7388
Uri = DocumentUri.From(r.FilePath),
74-
Range = r.ScriptRegion.ToRange()
89+
Range = r.ScriptRegion.ToRange() // The whole thing, not just the name.
7590
},
7691
Name = SymbolTypeUtils.GetDecoratedSymbolName(r)
7792
}));

src/PowerShellEditorServices/Services/TextDocument/ScriptRegion.cs

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public Range ToRange()
3333
};
3434
}
3535

36+
public override string ToString() => $"Start {StartLineNumber}:{StartColumnNumber}, End {EndLineNumber}:{EndColumnNumber}";
37+
3638
#region Constructors
3739

3840
public ScriptRegion(

src/PowerShellEditorServices/Services/Workspace/Handlers/WorkspaceSymbolsHandler.cs

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ public override async Task<Container<SymbolInformation>> Handle(WorkspaceSymbolP
4949
// so it's helpful to add some yields.
5050
await Task.Yield();
5151
cancellationToken.ThrowIfCancellationRequested();
52+
53+
if (foundOccurrence.SymbolType is SymbolType.Type)
54+
{
55+
continue;
56+
}
57+
5258
if (!IsQueryMatch(request.Query, foundOccurrence.SymbolName))
5359
{
5460
continue;

test/PowerShellEditorServices.Test.Shared/References/SimpleFile.ps1

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
function My-Function ($myInput)
22
{
3-
My-Function $myInput
3+
My-Function $myInput
44
}
55

66
$things = 4

0 commit comments

Comments
 (0)