Skip to content

Commit e8e74fa

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

File tree

11 files changed

+193
-107
lines changed

11 files changed

+193
-107
lines changed

src/PowerShellEditorServices/Services/Symbols/ReferenceTable.cs

+37-14
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;
@@ -122,15 +134,12 @@ public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst fun
122134
return AstVisitAction.Continue;
123135
}
124136

125-
// We only want the function name as the extent for highlighting (and so forth).
126-
//
127-
// TODO: After we replace the deprecated SymbolInformation usage with DocumentSymbol,
128-
// we'll want *both* the name extent and the full extent.
129137
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(functionDefinitionAst);
130138
_references.AddReference(
131139
symbolType,
132140
functionDefinitionAst.Name,
133141
nameExtent,
142+
functionDefinitionAst.Extent,
134143
isDeclaration: true);
135144

136145
return AstVisitAction.Continue;
@@ -141,6 +150,7 @@ public override AstVisitAction VisitCommandParameter(CommandParameterAst command
141150
_references.AddReference(
142151
SymbolType.Parameter,
143152
commandParameterAst.Extent.Text,
153+
commandParameterAst.Extent,
144154
commandParameterAst.Extent);
145155

146156
return AstVisitAction.Continue;
@@ -153,6 +163,7 @@ public override AstVisitAction VisitVariableExpression(VariableExpressionAst var
153163
_references.AddReference(
154164
SymbolType.Variable,
155165
$"${variableExpressionAst.VariablePath.UserPath}",
166+
variableExpressionAst.Extent,
156167
variableExpressionAst.Extent
157168
);
158169

@@ -166,7 +177,11 @@ public override AstVisitAction VisitTypeDefinition(TypeDefinitionAst typeDefinit
166177
: SymbolType.Class;
167178

168179
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(typeDefinitionAst);
169-
_references.AddReference(symbolType, typeDefinitionAst.Name, nameExtent);
180+
_references.AddReference(
181+
symbolType,
182+
typeDefinitionAst.Name,
183+
nameExtent,
184+
typeDefinitionAst.Extent);
170185

171186
return AstVisitAction.Continue;
172187
}
@@ -176,14 +191,19 @@ public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpress
176191
_references.AddReference(
177192
SymbolType.Type,
178193
typeExpressionAst.TypeName.Name,
194+
typeExpressionAst.Extent,
179195
typeExpressionAst.Extent);
180196

181197
return AstVisitAction.Continue;
182198
}
183199

184200
public override AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
185201
{
186-
_references.AddReference(SymbolType.Type, typeConstraintAst.TypeName.Name, typeConstraintAst.Extent);
202+
_references.AddReference(
203+
SymbolType.Type,
204+
typeConstraintAst.TypeName.Name,
205+
typeConstraintAst.Extent,
206+
typeConstraintAst.Extent);
187207

188208
return AstVisitAction.Continue;
189209
}
@@ -197,8 +217,9 @@ public override AstVisitAction VisitFunctionMember(FunctionMemberAst functionMem
197217
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(functionMemberAst, true, false);
198218
_references.AddReference(
199219
symbolType,
200-
VisitorUtils.GetMemberOverloadName(functionMemberAst, true, false),
201-
nameExtent);
220+
nameExtent.Text,
221+
nameExtent,
222+
functionMemberAst.Extent);
202223

203224
return AstVisitAction.Continue;
204225
}
@@ -212,8 +233,9 @@ propertyMemberAst.Parent is TypeDefinitionAst typeAst && typeAst.IsEnum
212233
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(propertyMemberAst, false);
213234
_references.AddReference(
214235
symbolType,
215-
VisitorUtils.GetMemberOverloadName(propertyMemberAst, false),
216-
nameExtent);
236+
nameExtent.Text,
237+
nameExtent,
238+
propertyMemberAst.Extent);
217239

218240
return AstVisitAction.Continue;
219241
}
@@ -224,7 +246,8 @@ public override AstVisitAction VisitConfigurationDefinition(ConfigurationDefinit
224246
_references.AddReference(
225247
SymbolType.Configuration,
226248
nameExtent.Text,
227-
nameExtent);
249+
nameExtent,
250+
configurationDefinitionAst.Extent);
228251

229252
return AstVisitAction.Continue;
230253
}

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)