Skip to content

Commit f1a7882

Browse files
daviwilKayla Davis
authored andcommitted
Add test for dot-sourced find function definition
1 parent 32451c0 commit f1a7882

File tree

8 files changed

+99
-37
lines changed

8 files changed

+99
-37
lines changed

src/PowerShellEditorServices/Language/LanguageService.cs

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,10 @@ public CompletionDetails GetCompletionDetailsInFile(
120120
result => result.CompletionText.Equals(entryName));
121121
return completionResult;
122122
}
123-
else { return null; }
123+
else
124+
{
125+
return null;
126+
}
124127
}
125128

126129
/// <summary>
@@ -146,6 +149,7 @@ public SymbolReference FindSymbolAtLocation(
146149
{
147150
symbolReference.FilePath = file.FilePath;
148151
}
152+
149153
return symbolReference;
150154
}
151155

@@ -205,36 +209,34 @@ public GetDefinitionResult GetDefinitionOfSymbol(
205209
SymbolReference foundSymbol,
206210
ScriptFile[] referencedFiles)
207211
{
208-
if (foundSymbol != null)
212+
Validate.IsNotNull("foundSymbol", foundSymbol);
213+
214+
// look through the referenced files until definition is found
215+
// or there are no more file to look through
216+
SymbolReference foundDefinition = null;
217+
for (int i = 0; i < referencedFiles.Length; i++)
209218
{
210-
// look through the referenced files until definition is found
211-
// or there are no more file to look through
212-
int index = 0;
213-
SymbolReference foundDefinition = null;
214-
while (foundDefinition == null && index < referencedFiles.Length)
215-
{
216-
foundDefinition =
217-
AstOperations.FindDefinitionOfSymbol(
218-
referencedFiles[index].ScriptAst,
219-
foundSymbol);
220-
if (foundDefinition != null)
221-
{
222-
foundDefinition.FilePath = referencedFiles[index].FilePath;
223-
}
224-
index++;
225-
}
219+
foundDefinition =
220+
AstOperations.FindDefinitionOfSymbol(
221+
referencedFiles[i].ScriptAst,
222+
foundSymbol);
226223

227-
// if definition is not found in referenced files
228-
// look for it in the builtin commands
229-
if (foundDefinition == null)
224+
if (foundDefinition != null)
230225
{
231-
CommandInfo cmdInfo = GetCommandInfo(foundSymbol.SymbolName);
232-
foundDefinition = FindDeclarationForBuiltinCommand(cmdInfo, foundSymbol);
226+
foundDefinition.FilePath = referencedFiles[i].FilePath;
227+
break;
233228
}
229+
}
234230

235-
return new GetDefinitionResult(foundDefinition);
231+
// if definition is not found in referenced files
232+
// look for it in the builtin commands
233+
if (foundDefinition == null)
234+
{
235+
CommandInfo cmdInfo = GetCommandInfo(foundSymbol.SymbolName);
236+
foundDefinition = FindDeclarationForBuiltinCommand(cmdInfo, foundSymbol);
236237
}
237-
else { return null; }
238+
239+
return new GetDefinitionResult(foundDefinition);
238240
}
239241

240242
/// <summary>
@@ -254,6 +256,7 @@ public FindOccurrencesResult FindOccurrencesInFile(
254256
file.ScriptAst,
255257
lineNumber,
256258
columnNumber);
259+
257260
if (foundSymbol != null)
258261
{
259262
IEnumerable<SymbolReference> symbolOccurrences =
@@ -268,7 +271,10 @@ public FindOccurrencesResult FindOccurrencesInFile(
268271
FoundOccurrences = symbolOccurrences
269272
};
270273
}
271-
else { return null; }
274+
else
275+
{
276+
return null;
277+
}
272278
}
273279

274280
/// <summary>
@@ -300,9 +306,15 @@ public ParameterSetSignatures FindParameterSetsInFile(
300306

301307
return new ParameterSetSignatures(commandInfoSet, foundSymbol);
302308
}
303-
else { return null; }
309+
else
310+
{
311+
return null;
312+
}
313+
}
314+
else
315+
{
316+
return null;
304317
}
305-
else { return null; }
306318
}
307319

308320
#endregion
@@ -354,8 +366,10 @@ private ScriptFile[] GetBuiltinCommandScriptFiles(PSModuleInfo moduleInfo)
354366
}
355367
}
356368
}
369+
357370
return scriptFiles.ToArray();
358371
}
372+
359373
return new List<ScriptFile>().ToArray();
360374
}
361375

@@ -383,6 +397,7 @@ private SymbolReference FindDeclarationForBuiltinCommand(CommandInfo cmdInfo, Sy
383397
index++;
384398
}
385399
}
400+
386401
return foundDefinition;
387402
}
388403
}

src/PowerShellEditorServices/Session/Workspace.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ private void RecursivelyFindReferences(
144144
scriptFile.FilePath,
145145
filename);
146146

147-
if (referencedScriptFiles.ContainsKey(resolvedScriptPath))
147+
if (!referencedScriptFiles.ContainsKey(resolvedScriptPath))
148148
{
149-
if (TryGetFile(resolvedScriptPath, out newFile))
149+
if (!TryGetFile(resolvedScriptPath, out newFile))
150150
{
151151
newFile = OpenFile(resolvedScriptPath);
152152
referencedScriptFiles.Add(resolvedScriptPath, newFile);

test/PowerShellEditorServices.Test.Host/ScenarioTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public void FindsNoReferencesOfEmptyLine()
216216
Arguments = new FileLocationRequestArgs
217217
{
218218
File = "TestFiles\\FindReferences.ps1",
219-
Line = 9,
219+
Line = 10,
220220
Offset = 1,
221221
}
222222
});
@@ -256,7 +256,7 @@ public void FindsReferencesOnCommand()
256256
Arguments = new FileLocationRequestArgs
257257
{
258258
File = "TestFiles\\FindReferences.ps1",
259-
Line = 10,
259+
Line = 9,
260260
Offset = 2,
261261
}
262262
});
@@ -297,7 +297,7 @@ public void FindsNoDefinitionOfBuiltinCommand()
297297
Arguments = new FileLocationRequestArgs
298298
{
299299
File = "TestFiles\\FindReferences.ps1",
300-
Line = 12,
300+
Line = 11,
301301
Offset = 10,
302302
}
303303
});
@@ -315,7 +315,7 @@ public void FindsDefintionOfVariable()
315315
Arguments = new FileLocationRequestArgs
316316
{
317317
File = "TestFiles\\FindReferences.ps1",
318-
Line = 10,
318+
Line = 9,
319319
Offset = 14,
320320
}
321321
});
@@ -358,7 +358,7 @@ public void GetsParameterHintsOnCommand()
358358
Arguments = new SignatureHelpRequestArgs
359359
{
360360
File = "TestFiles\\FindReferences.ps1",
361-
Line = 14,
361+
Line = 13,
362362
Offset = 15,
363363
}
364364
});

test/PowerShellEditorServices.Test.Host/TestFiles/FindReferences.ps1

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ function My-Function ($myInput)
66
$things = 4
77

88
$things
9-
. simpleps.ps1
109
My-Function $things
1110

1211
Write-Output "Hi";
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// Copyright (c) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
4+
//
5+
6+
using Microsoft.PowerShell.EditorServices.Session;
7+
8+
namespace Microsoft.PowerShell.EditorServices.Test.Shared.Definition
9+
{
10+
public class FindsFunctionDefinitionInDotSourceReference
11+
{
12+
public static readonly ScriptRegion SourceDetails =
13+
new ScriptRegion
14+
{
15+
File = @"References\FileWithReferences.ps1",
16+
StartLineNumber = 3,
17+
StartColumnNumber = 6
18+
};
19+
}
20+
}

test/PowerShellEditorServices.Test.Shared/PowerShellEditorServices.Test.Shared.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<Compile Include="Completion\CompleteCommandFromModule.cs" />
4343
<Compile Include="Completion\CompleteCommandInFile.cs" />
4444
<Compile Include="Completion\CompleteVariableInFile.cs" />
45+
<Compile Include="Definition\FindsFunctionDefinitionInDotSourceReference.cs" />
4546
<Compile Include="Definition\FindsFunctionDefinition.cs" />
4647
<Compile Include="Definition\FindsVariableDefinition.cs" />
4748
<Compile Include="Occurrences\FindOccurrencesOnParameter.cs" />
@@ -69,6 +70,7 @@
6970
</None>
7071
</ItemGroup>
7172
<ItemGroup>
73+
<None Include="References\FileWithReferences.ps1" />
7274
<None Include="References\SimpleFile.ps1">
7375
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
7476
</None>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
. .\SimpleFile.ps1
2+
3+
My-Function "test"

test/PowerShellEditorServices.Test/Language/LanguageServiceTests.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,23 @@ public void LanguageServiceFindsFunctionDefinition()
117117
Assert.Equal("My-Function", definition.SymbolName);
118118
}
119119

120+
[Fact]
121+
public void LanguageServiceFindsFunctionDefinitionInDotSourceReference()
122+
{
123+
GetDefinitionResult definitionResult =
124+
this.GetDefinition(
125+
FindsFunctionDefinitionInDotSourceReference.SourceDetails);
126+
127+
SymbolReference definition = definitionResult.FoundDefinition;
128+
Assert.True(
129+
definitionResult.FoundDefinition.FilePath.EndsWith(
130+
FindsFunctionDefinition.SourceDetails.File),
131+
"Unexpected reference file: " + definitionResult.FoundDefinition.FilePath);
132+
Assert.Equal(1, definition.ScriptRegion.StartLineNumber);
133+
Assert.Equal(10, definition.ScriptRegion.StartColumnNumber);
134+
Assert.Equal("My-Function", definition.SymbolName);
135+
}
136+
120137
[Fact]
121138
public void LanguageServiceFindsVariableDefinition()
122139
{
@@ -164,7 +181,13 @@ private ScriptFile GetScriptFile(ScriptRegion scriptRegion)
164181
baseSharedScriptPath,
165182
scriptRegion.File);
166183

167-
return this.workspace.OpenFile(resolvedPath);
184+
ScriptFile scriptFile = null;
185+
if (!this.workspace.TryGetFile(resolvedPath, out scriptFile))
186+
{
187+
scriptFile = this.workspace.OpenFile(resolvedPath);
188+
}
189+
190+
return scriptFile;
168191
}
169192

170193
private CompletionResults GetCompletionResults(ScriptRegion scriptRegion)

0 commit comments

Comments
 (0)