add new features and fix bugs

This commit is contained in:
Christoph Brandau
2026-06-18 17:31:51 +02:00
parent 41f331d4c4
commit 3ad3847045
14 changed files with 988 additions and 171 deletions
+70
View File
@@ -0,0 +1,70 @@
import * as vscode from "vscode"
/**
* Computes folding ranges for a TCL document based on brace matching.
*
* Handles same-line opening braces (`... {`), standalone `{`, `} elseif`/`} else`
* branch continuations and line continuations (`\`).
*/
export function computeTclFoldingRanges(document: vscode.TextDocument): vscode.FoldingRange[] {
const ranges: vscode.FoldingRange[] = []
const stack: number[] = []
let pendingStartLine: number | null = null
for (let i = 0; i < document.lineCount; i += 1) {
const line = document.lineAt(i).text
const trimmed = line.trim()
const branchContinuation = /^\}\s*(elseif|else)\b/.test(trimmed)
const sameLineOpen = trimmed.endsWith("{")
if (!trimmed || trimmed.startsWith("#")) {
continue
}
if (trimmed.startsWith("}")) {
const startLine = stack.pop()
const endLine = branchContinuation ? i - 1 : i
if (typeof startLine === "number" && startLine < endLine) {
ranges.push(
new vscode.FoldingRange(startLine, endLine, vscode.FoldingRangeKind.Region)
)
}
if (branchContinuation && sameLineOpen) {
stack.push(i)
pendingStartLine = null
} else if (trimmed !== "}" && trimmed.endsWith("\\")) {
pendingStartLine = i
} else {
pendingStartLine = null
}
continue
}
if (trimmed === "{") {
const startLine = pendingStartLine ?? i
if (startLine < i) {
stack.push(startLine)
} else {
stack.push(i)
}
pendingStartLine = null
continue
}
if (trimmed.endsWith("{")) {
stack.push(i)
pendingStartLine = null
continue
}
if (trimmed.endsWith("\\")) {
pendingStartLine = i
continue
}
pendingStartLine = null
}
return ranges
}
+12
View File
@@ -15,6 +15,7 @@ import {
cdlDocumentSymbolProvider,
defDocumentSymbolProvider
} from "./common/handlers"
import { computeTclFoldingRanges } from "./common/folding"
import { registerLogger, traceError, traceLog, traceVerbose } from "./common/log/logging"
import {
checkVersion,
@@ -115,6 +116,17 @@ export async function activate(context: vscode.ExtensionContext) {
}
})
// Folding ranges for TCL (brace based)
const tclFoldingProvider = vscode.languages.registerFoldingRangeProvider(
[{ language: "tcl" }],
{
provideFoldingRanges(document: vscode.TextDocument) {
return computeTclFoldingRanges(document)
}
}
)
context.subscriptions.push(tclFoldingProvider)
//
const formatCdlProvider = vscode.languages.registerDocumentFormattingEditProvider(
{ scheme: "file", language: "cdl" },