修代码补全

This commit is contained in:
2026-08-01 15:47:51 +02:00
parent 429ea367f3
commit 45fa2b9a27
18 changed files with 802 additions and 37 deletions
+42
View File
@@ -0,0 +1,42 @@
import * as vscode from "vscode";
import { parseXml } from "../language/xmlParser";
import { buildSemanticTokenRanges } from "../language/semanticTokens";
const TOKEN_TYPES = ["type", "property", "string"] as const;
export const RA3_SEMANTIC_TOKENS_LEGEND = new vscode.SemanticTokensLegend([
...TOKEN_TYPES,
]);
/**
* Highlighting fallback for malformed XML.
*
* While the document is well-formed, the built-in TextMate XML grammar colors
* it as usual and this provider returns no tokens, so nothing changes. When
* parsing reports errors (e.g. an attribute value whose closing quote has not
* been typed yet), the TextMate structure is lost, and these semantic tokens
* keep element names, attribute names and values colored.
*/
export class Ra3SemanticTokensProvider
implements vscode.DocumentSemanticTokensProvider
{
async provideDocumentSemanticTokens(
document: vscode.TextDocument,
_token: vscode.CancellationToken,
): Promise<vscode.SemanticTokens> {
const text = document.getText();
const doc = parseXml(text);
if (doc.errors.length === 0) {
return new vscode.SemanticTokens(new Uint32Array(0));
}
const ranges = buildSemanticTokenRanges(doc, text);
const builder = new vscode.SemanticTokensBuilder(RA3_SEMANTIC_TOKENS_LEGEND);
for (const r of ranges) {
builder.push(
new vscode.Range(r.line, r.startChar, r.line, r.startChar + r.length),
r.tokenType,
);
}
return builder.build();
}
}