Skip to content

Commit c23658f

Browse files
committed
(PowerShellGH-793) Add support for Folding Range client settings
This commit uses the the client configuration settings to modify the behaviour of the server. In particular the Enable and ShowLastLine setting. * The enable setting will change the provider to return null when disabled * The ShowLastLine setting emulates the behaviour in PowerShell/vscode-powershell#1557 * Modifies conversion method for the internal region class to FoldingRange object to show/hide the last line based on the extension settings * Modifies the tests for the default value and adds tests for the show and hide scenarios
1 parent ad51e08 commit c23658f

File tree

4 files changed

+86
-22
lines changed

4 files changed

+86
-22
lines changed

src/PowerShellEditorServices.Protocol/Server/LanguageServer.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1300,9 +1300,12 @@ protected Task HandleEvaluateRequest(
13001300
private FoldingRange[] Fold(
13011301
string documentUri)
13021302
{
1303+
// TODO Should be using dynamic registrations
1304+
if (!this.currentSettings.CodeFolding.Enable) { return null; }
13031305
var result = new List<FoldingRange>();
13041306
foreach (FoldingReference fold in TokenOperations.FoldableRegions(
1305-
editorSession.Workspace.GetFile(documentUri).ScriptTokens))
1307+
editorSession.Workspace.GetFile(documentUri).ScriptTokens,
1308+
this.currentSettings.CodeFolding.ShowLastLine))
13061309
{
13071310
result.Add(new FoldingRange {
13081311
EndCharacter = value.EndCharacter,

src/PowerShellEditorServices.Protocol/Server/LanguageServerSettings.cs

+39
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ public class LanguageServerSettings
2020

2121
public CodeFormattingSettings CodeFormatting { get; set; }
2222

23+
public CodeFoldingSettings CodeFolding { get; set; }
24+
2325
public LanguageServerSettings()
2426
{
2527
this.ScriptAnalysis = new ScriptAnalysisSettings();
2628
this.CodeFormatting = new CodeFormattingSettings();
29+
this.CodeFolding = new CodeFoldingSettings();
2730
}
2831

2932
public void Update(
@@ -39,6 +42,7 @@ public void Update(
3942
workspaceRootPath,
4043
logger);
4144
this.CodeFormatting = new CodeFormattingSettings(settings.CodeFormatting);
45+
this.CodeFolding.Update(settings.CodeFolding, logger);
4246
}
4347
}
4448
}
@@ -261,6 +265,41 @@ private Hashtable GetCustomPSSASettingsHashtable(int tabSize, bool insertSpaces)
261265
}
262266
}
263267

268+
/// <summary>
269+
/// Code folding settings
270+
/// </summary>
271+
public class CodeFoldingSettings
272+
{
273+
/// <summary>
274+
/// Whether the folding is enabled. Default is true as per VSCode
275+
/// </summary>
276+
public bool Enable { get; set; } = true;
277+
278+
/// <summary>
279+
/// Whether to show or hide the last line of a folding region. Default is true as per VSCode
280+
/// </summary>
281+
public bool ShowLastLine { get; set; } = true;
282+
283+
/// <summary>
284+
/// Update these settings from another settings object
285+
/// </summary>
286+
public void Update(
287+
CodeFoldingSettings settings,
288+
ILogger logger)
289+
{
290+
if (settings != null) {
291+
if (this.Enable != settings.Enable) {
292+
this.Enable = settings.Enable;
293+
logger.Write(LogLevel.Verbose, string.Format("Using Code Folding Enabled - {0}", this.Enable));
294+
}
295+
if (this.ShowLastLine != settings.ShowLastLine) {
296+
this.ShowLastLine = settings.ShowLastLine;
297+
logger.Write(LogLevel.Verbose, string.Format("Using Code Folding ShowLastLine - {0}", this.ShowLastLine));
298+
}
299+
}
300+
}
301+
}
302+
264303
public class LanguageServerSettingsWrapper
265304
{
266305
// NOTE: This property is capitalized as 'Powershell' because the

src/PowerShellEditorServices/Language/TokenOperations.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ internal static class TokenOperations
2222
/// <summary>
2323
/// Extracts all of the unique foldable regions in a script given the list tokens
2424
/// </summary>
25-
internal static FoldingReference[] FoldableRegions(Token[] tokens) {
25+
internal static FoldingReference[] FoldableRegions(
26+
Token[] tokens,
27+
bool ShowLastLine)
28+
{
2629
List<FoldingReference> foldableRegions = new List<FoldingReference>();
2730

2831
// Find matching braces { -> }
@@ -93,6 +96,12 @@ internal static FoldingReference[] FoldableRegions(Token[] tokens) {
9396
return (item.StartLine == foldableRegions[index - 1].StartLine);
9497
});
9598

99+
// Some editors have different folding UI, sometimes the lastline should be displayed
100+
// If we do want to show the last line, just change the region to be one line less
101+
if (ShowLastLine) {
102+
foldableRegions.ForEach( item => { item.EndLine--; });
103+
}
104+
96105
return foldableRegions.ToArray();
97106
}
98107

test/PowerShellEditorServices.Test/Language/TokenOperationsTests.cs

+33-20
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ public class TokenOperationsTests
1313
/// <summary>
1414
/// Helper method to create a stub script file and then call FoldableRegions
1515
/// </summary>
16-
private FoldingReference[] GetRegions(string text) {
16+
private FoldingReference[] GetRegions(string text, bool showLastLine = true) {
1717
ScriptFile scriptFile = new ScriptFile(
1818
"testfile",
1919
"clienttestfile",
2020
text,
2121
Version.Parse("5.0"));
22-
return Microsoft.PowerShell.EditorServices.TokenOperations.FoldableRegions(scriptFile.ScriptTokens);
22+
return Microsoft.PowerShell.EditorServices.TokenOperations.FoldableRegions(scriptFile.ScriptTokens, showLastLine);
2323
}
2424

2525
/// <summary>
@@ -113,21 +113,21 @@ double quoted herestrings should also fold
113113
$something = $true
114114
#endregion Comment Block 3";
115115
private FoldingReference[] expectedAllInOneScriptFolds = {
116-
CreateFoldingReference(0, 0, 4, 10, "region"),
117-
CreateFoldingReference(1, 0, 3, 2, "comment"),
118-
CreateFoldingReference(10, 0, 15, 2, "comment"),
119-
CreateFoldingReference(16, 30, 60, 1, null),
120-
CreateFoldingReference(17, 0, 22, 2, "comment"),
121-
CreateFoldingReference(23, 7, 26, 2, null),
122-
CreateFoldingReference(28, 5, 31, 2, null),
123-
CreateFoldingReference(35, 2, 37, 0, "comment"),
124-
CreateFoldingReference(39, 2, 49, 14, "region"),
125-
CreateFoldingReference(41, 4, 45, 14, "region"),
126-
CreateFoldingReference(51, 7, 53, 3, null),
127-
CreateFoldingReference(56, 7, 59, 3, null),
128-
CreateFoldingReference(64, 0, 66, 0, "comment"),
129-
CreateFoldingReference(67, 0, 72, 26, "region"),
130-
CreateFoldingReference(68, 0, 70, 0, "comment")
116+
CreateFoldingReference(0, 0, 3, 10, "region"),
117+
CreateFoldingReference(1, 0, 2, 2, "comment"),
118+
CreateFoldingReference(10, 0, 14, 2, "comment"),
119+
CreateFoldingReference(16, 30, 59, 1, null),
120+
CreateFoldingReference(17, 0, 21, 2, "comment"),
121+
CreateFoldingReference(23, 7, 25, 2, null),
122+
CreateFoldingReference(28, 5, 30, 2, null),
123+
CreateFoldingReference(35, 2, 36, 0, "comment"),
124+
CreateFoldingReference(39, 2, 48, 14, "region"),
125+
CreateFoldingReference(41, 4, 44, 14, "region"),
126+
CreateFoldingReference(51, 7, 52, 3, null),
127+
CreateFoldingReference(56, 7, 58, 3, null),
128+
CreateFoldingReference(64, 0, 65, 0, "comment"),
129+
CreateFoldingReference(67, 0, 71, 26, "region"),
130+
CreateFoldingReference(68, 0, 69, 0, "comment")
131131
};
132132

133133
/// <summary>
@@ -168,6 +168,19 @@ public void LaguageServiceFindsFoldablRegionsWithCRLF() {
168168
AssertFoldingReferenceArrays(expectedAllInOneScriptFolds, result);
169169
}
170170

171+
[Fact]
172+
public void LaguageServiceFindsFoldablRegionsWithoutLastLine() {
173+
FoldingReference[] result = GetRegions(allInOneScript, false);
174+
// Incrememnt the end line of the expected regions by one as we will
175+
// be hiding the last line
176+
FoldingReference[] expectedFolds = expectedAllInOneScriptFolds.Clone() as FoldingReference[];
177+
for (int index = 0; index < expectedFolds.Length; index++)
178+
{
179+
expectedFolds[index].EndLine++;
180+
}
181+
AssertFoldingReferenceArrays(expectedFolds, result);
182+
}
183+
171184
[Fact]
172185
public void LaguageServiceFindsFoldablRegionsWithMismatchedRegions() {
173186
string testString =
@@ -180,7 +193,7 @@ public void LaguageServiceFindsFoldablRegionsWithMismatchedRegions() {
180193
#region should not fold - mismatched
181194
";
182195
FoldingReference[] expectedFolds = {
183-
CreateFoldingReference(2, 0, 4, 10, "region")
196+
CreateFoldingReference(2, 0, 3, 10, "region")
184197
};
185198

186199
FoldingReference[] result = GetRegions(testString);
@@ -197,8 +210,8 @@ public void LaguageServiceFindsFoldablRegionsWithDuplicateRegions() {
197210
})
198211
";
199212
FoldingReference[] expectedFolds = {
200-
CreateFoldingReference(1, 64, 2, 27, null),
201-
CreateFoldingReference(2, 35, 4, 2, null)
213+
CreateFoldingReference(1, 64, 1, 27, null),
214+
CreateFoldingReference(2, 35, 3, 2, null)
202215
};
203216

204217
FoldingReference[] result = GetRegions(testString);

0 commit comments

Comments
 (0)