1.1.1 优化自动补全和悬浮显示

This commit is contained in:
睿 安
2025-09-17 22:31:31 +08:00
parent 7c838fa49c
commit fe15f52be5
17 changed files with 464 additions and 431 deletions

View File

@@ -52,7 +52,8 @@ export interface ApiConstant {
// API文档解析器类
export class ApiParser {
private static instance: ApiParser;
private functions: ApiFunction[] = [];
private functions: ApiFunction[] = []; // 普通函数,不自动填写第一个参数
private functionEx: ApiFunction[] = []; // 扩展函数,自动填写所有参数
private classes: ApiClass[] = [];
private constants: ApiConstant[] = [];
private jsonFilePath: string;
@@ -83,6 +84,7 @@ export class ApiParser {
// 加载函数数据
this.functions = apiData.functions || [];
this.functionEx = apiData.functionEx || [];
// 加载类数据
this.classes = apiData.classes || [];
@@ -405,6 +407,7 @@ export class ApiParser {
try {
const apiData = {
functions: this.functions,
functionEx: this.functionEx,
classes: this.classes,
constants: this.constants
};
@@ -420,14 +423,30 @@ export class ApiParser {
this.initializeApiDocumentation();
}
// 获取所有函数
// 获取所有普通函数
public getFunctions(): ApiFunction[] {
return this.functions;
}
// 根据名称获取函数
// 获取所有扩展函数
public getFunctionEx(): ApiFunction[] {
return this.functionEx;
}
// 根据名称获取函数(包括普通函数和扩展函数)
public getFunctionByName(name: string): ApiFunction | undefined {
return this.functions.find(func => func.name === name);
// 先在普通函数中查找
let func = this.functions.find(func => func.name === name);
if (func) {
return func;
}
// 再在扩展函数中查找
return this.functionEx.find(func => func.name === name);
}
// 检查是否是扩展函数
public isFunctionEx(name: string): boolean {
return this.functionEx.some(func => func.name === name);
}
// 获取所有类
@@ -456,20 +475,43 @@ export class ApiParser {
}
// 生成函数签名
public generateFunctionSignature(func: ApiFunction): string {
const params = func.params.map(param => {
let paramStr = param.name;
if (param.optional) {
paramStr = `[${paramStr}`;
if (param.defaultValue) {
paramStr += `=${param.defaultValue}`;
}
paramStr += ']';
}
return paramStr;
}).join(', ');
public generateFunctionSignature(func: ApiFunction, isFunctionEx: boolean = false): string {
// 检查是否是普通函数且有参数
if (!isFunctionEx && func.params.length > 0) {
// 对于普通函数,将第一个参数移到函数名前面
const firstParam = func.params[0];
const remainingParams = func.params.slice(1);
return `function ${func.name}(${params})${func.returns ? `: ${func.returns.type}` : ': void'}`;
const params = remainingParams.map(param => {
let paramStr = param.name;
if (param.optional) {
paramStr = `[${paramStr}`;
if (param.defaultValue) {
paramStr += `=${param.defaultValue}`;
}
paramStr += ']';
}
return paramStr;
}).join(', ');
const paramPart = params ? `(${params})` : '()';
return `function ${firstParam.name}.${func.name}${paramPart}${func.returns ? `: ${func.returns.type}` : ': void'}`;
} else {
// 对于扩展函数或无参数的函数,保持原有格式
const params = func.params.map(param => {
let paramStr = param.name;
if (param.optional) {
paramStr = `[${paramStr}`;
if (param.defaultValue) {
paramStr += `=${param.defaultValue}`;
}
paramStr += ']';
}
return paramStr;
}).join(', ');
return `function ${func.name}(${params})${func.returns ? `: ${func.returns.type}` : ': void'}`;
}
}
// 生成类签名

View File

@@ -93,22 +93,54 @@ export class CompletionProvider implements vscode.CompletionItemProvider {
// 获取API函数完成项
private getApiFunctionCompletions(): vscode.CompletionItem[] {
const completions: vscode.CompletionItem[] = [];
// 添加普通函数(不自动填写第一个参数)
const functions = this.apiParser.getFunctions();
return functions.map(func => {
functions.forEach(func => {
const item = new vscode.CompletionItem(func.name, vscode.CompletionItemKind.Function);
item.detail = '内置函数';
item.documentation = new vscode.MarkdownString(`\`\`\`squirrel\n${this.apiParser.generateFunctionSignature(func)}\n\`\`\`\n${func.description}`);
// 为函数创建带参数的插入文本
if (func.params.length > 0) {
// 普通函数不自动填写第一个参数,用户需要手动输入
if (func.params.length > 1) {
// 从第二个参数开始添加占位符
const remainingParams = func.params.slice(1);
const paramText = remainingParams.map((param, index) => `\${${index + 1}:${param.name}}`).join(', ');
item.insertText = new vscode.SnippetString(`${func.name}(${paramText})`);
} else {
// 只有一个参数或无参数
item.insertText = new vscode.SnippetString(`${func.name}()`);
}
} else {
item.insertText = new vscode.SnippetString(`${func.name}()`);
}
completions.push(item);
});
// 添加扩展函数(自动填写所有参数)
const functionEx = this.apiParser.getFunctionEx();
functionEx.forEach(func => {
const item = new vscode.CompletionItem(func.name, vscode.CompletionItemKind.Function);
item.detail = '扩展函数';
item.documentation = new vscode.MarkdownString(`\`\`\`squirrel\n${this.apiParser.generateFunctionSignature(func)}\n\`\`\`\n${func.description}`);
// 为函数创建带参数的插入文本
if (func.params.length > 0) {
// 扩展函数自动填写所有参数
const paramText = func.params.map((param, index) => `\${${index + 1}:${param.name}}`).join(', ');
item.insertText = new vscode.SnippetString(`${func.name}(${paramText})`);
} else {
item.insertText = new vscode.SnippetString(`${func.name}()`);
}
return item;
completions.push(item);
});
return completions;
}
// 获取API类完成项

View File

@@ -37,7 +37,8 @@ export class HoverProvider implements vscode.HoverProvider {
// 首先检查是否是API函数
const apiFunction = this.apiParser.getFunctionByName(word);
if (apiFunction) {
const signature = this.apiParser.generateFunctionSignature(apiFunction);
const isFunctionEx = this.apiParser.isFunctionEx(apiFunction.name);
const signature = this.apiParser.generateFunctionSignature(apiFunction, isFunctionEx);
let hoverContent = `<span style="color:#4EC9B0;">★</span> <span style="color:#569CD6;">内置函数</span>: <code style="background-color:#2D2D30; color:#D4D4D4;">${signature}</code>\n\n`;
hoverContent += `<span style="color:#6A9955;">${apiFunction.description}</span>\n\n`;