Remove duplicate empty lines in auto formatter

This commit is contained in:
Stone_Red
2026-08-07 01:03:30 +02:00
parent a5f9c5a178
commit 4626b5a7fa
2 changed files with 58 additions and 10 deletions
+2
View File
@@ -51,3 +51,5 @@ If you pass a file path, it is loaded on startup.
- `return` / `return <value>` are regular body statements and stay indented with the block they are in. - `return` / `return <value>` are regular body statements and stay indented with the block they are in.
- `exit` / `throw` / `error` close active non-function blocks for following lines. - `exit` / `throw` / `error` close active non-function blocks for following lines.
- Comment lines (`# ...`) are kept unindented. - Comment lines (`# ...`) are kept unindented.
- Single empty lines are preserved, runs of empty lines are collapsed to one, and leading/trailing blank lines are removed.
- A blank line is inserted before each block opener (`func` / `if` / `while`) that is not nested directly under another opener, and after each block closer (`end_func` / `end_if` / `end_while`), separating sibling blocks. `else:` stays attached to its `if` block.
+56 -10
View File
@@ -207,19 +207,16 @@ internal class TextEditor
{ {
const int indentationSize = 4; const int indentationSize = 4;
List<string> blockStack = []; List<string> blockStack = [];
List<string> output = [];
string previousLine = string.Empty;
bool pendingBlank = false;
for (int i = 0; i < Lines.Count; i++) for (int i = 0; i < Lines.Count; i++)
{ {
string trimmed = Lines[i].Trim(' '); string trimmed = Lines[i].Trim(' ');
if (string.IsNullOrWhiteSpace(trimmed)) if (string.IsNullOrWhiteSpace(trimmed))
{ {
Lines[i] = string.Empty; pendingBlank = true;
continue;
}
if (trimmed.StartsWith('#'))
{
Lines[i] = trimmed;
continue; continue;
} }
@@ -270,13 +267,47 @@ internal class TextEditor
} }
int lineIndentation = closesFunctionBlock ? Math.Max(0, blockStack.Count - 1) : blockStack.Count; int lineIndentation = closesFunctionBlock ? Math.Max(0, blockStack.Count - 1) : blockStack.Count;
Lines[i] = new string(' ', lineIndentation * indentationSize) + trimmed; string indented = new string(' ', lineIndentation * indentationSize) + trimmed;
if (!isTerminatingStatement && ( bool isBlockOpener = !isTerminatingStatement && (
(trimmed.StartsWith("if ", StringComparison.Ordinal) && trimmed.EndsWith(':')) (trimmed.StartsWith("if ", StringComparison.Ordinal) && trimmed.EndsWith(':'))
|| (trimmed.StartsWith("while ", StringComparison.Ordinal) && trimmed.EndsWith(':')) || (trimmed.StartsWith("while ", StringComparison.Ordinal) && trimmed.EndsWith(':'))
|| (trimmed.StartsWith("func ", StringComparison.Ordinal) && trimmed.Contains(':')) || (trimmed.StartsWith("func ", StringComparison.Ordinal) && trimmed.Contains(':'))
|| trimmed == "else:")) || trimmed == "else:");
bool isBlockCloser = trimmed == "end_if" || trimmed == "end_while" || trimmed == "end_func";
bool insertBlank = pendingBlank;
if (previousLine.Length > 0 && !previousLine.StartsWith('#'))
{
bool previousIsCloser = previousLine == "end_if" || previousLine == "end_while" || previousLine == "end_func";
bool previousIsOpener = previousLine.StartsWith("if ", StringComparison.Ordinal) && previousLine.EndsWith(':')
|| previousLine.StartsWith("while ", StringComparison.Ordinal) && previousLine.EndsWith(':')
|| previousLine.StartsWith("func ", StringComparison.Ordinal) && previousLine.Contains(':')
|| previousLine == "else:";
if (previousIsCloser)
{
if (!isBlockCloser && trimmed != "else:")
{
insertBlank = true;
}
}
else if (isBlockOpener && trimmed != "else:" && !previousIsOpener)
{
insertBlank = true;
}
}
if (insertBlank && output.Count > 0 && output[^1].Length > 0)
{
output.Add(string.Empty);
}
output.Add(indented);
pendingBlank = false;
if (isBlockOpener)
{ {
if (trimmed.StartsWith("if ", StringComparison.Ordinal)) if (trimmed.StartsWith("if ", StringComparison.Ordinal))
{ {
@@ -308,7 +339,22 @@ internal class TextEditor
blockStack.RemoveAt(blockStack.Count - 1); blockStack.RemoveAt(blockStack.Count - 1);
} }
} }
previousLine = trimmed;
} }
while (output.Count > 0 && output[0].Length == 0)
{
output.RemoveAt(0);
}
while (output.Count > 0 && output[^1].Length == 0)
{
output.RemoveAt(output.Count - 1);
}
Lines.Clear();
Lines.AddRange(output);
} }
private static string ToLiteral(string input) private static string ToLiteral(string input)