add new features and fix bugs
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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" },
|
||||
|
||||
Reference in New Issue
Block a user