Files
squirrelVsis/dist/providers/hoverProvider.js
2025-09-17 10:54:25 +08:00

186 lines
8.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.HoverProvider = void 0;
const vscode = __importStar(require("vscode"));
const apiParser_1 = require("./apiParser");
// 悬停信息提供者类
class HoverProvider {
constructor(cacheManager) {
this.cacheManager = cacheManager;
this.apiParser = apiParser_1.ApiParser.getInstance();
}
// 提供悬停时显示的信息
async provideHover(document, position, token) {
// 检查是否在注释中,如果在注释中则不提供悬停信息
const line = document.lineAt(position.line);
const commentIndex = line.text.indexOf('//');
if (commentIndex >= 0 && position.character > commentIndex) {
return undefined;
}
// 获取鼠标悬停位置的单词范围
const range = document.getWordRangeAtPosition(position);
if (!range) {
return undefined;
}
// 获取单词
const word = document.getText(range);
// 首先检查是否是API函数
const apiFunction = this.apiParser.getFunctionByName(word);
if (apiFunction) {
const signature = this.apiParser.generateFunctionSignature(apiFunction);
let hoverContent = `**内置函数**: \`${signature}\`\n\n`;
hoverContent += `${apiFunction.description}\n\n`;
if (apiFunction.params.length > 0) {
hoverContent += `**参数**:\n`;
apiFunction.params.forEach(param => {
hoverContent += `- \`${param.name}: ${param.type}\`${param.optional ? ' (可选)' : ''} - ${param.description}\n`;
});
}
if (apiFunction.returns) {
hoverContent += `\n**返回值**: \`${apiFunction.returns.type}\` - ${apiFunction.returns.description}`;
}
return new vscode.Hover(new vscode.MarkdownString(hoverContent), range);
}
// 检查是否是API类
const apiClass = this.apiParser.getClassByName(word);
if (apiClass) {
const signature = this.apiParser.generateClassSignature(apiClass);
let hoverContent = `**内置类**: \`${signature}\`\n\n`;
hoverContent += `${apiClass.description}\n\n`;
if (apiClass.methods.length > 0) {
hoverContent += `**方法**:\n`;
apiClass.methods.forEach(method => {
const methodSignature = this.apiParser.generateMethodSignature(method);
hoverContent += `- \`${methodSignature}\` - ${method.description}\n`;
});
}
if (apiClass.properties.length > 0) {
hoverContent += `\n**属性**:\n`;
apiClass.properties.forEach(prop => {
const propSignature = this.apiParser.generatePropertySignature(prop);
hoverContent += `- \`${propSignature}\` - ${prop.description}\n`;
});
}
return new vscode.Hover(new vscode.MarkdownString(hoverContent), range);
}
// 检查是否是API常量
const apiConstant = this.apiParser.getConstantByName(word);
if (apiConstant) {
let hoverContent = `**常量**: \`${apiConstant.name}\`\n\n`;
hoverContent += `值: ${apiConstant.value}\n\n`;
hoverContent += `${apiConstant.description}\n\n`;
hoverContent += `类别: ${apiConstant.category}`;
return new vscode.Hover(new vscode.MarkdownString(hoverContent), range);
}
// 查找函数信息
const functions = this.cacheManager.findFunctionsByName(word);
if (functions.length > 0) {
// 创建悬停信息
let hoverContent = '';
if (functions.length === 1) {
// 单个函数
const func = functions[0];
hoverContent = `**函数**: \`${func.signature}\`\n\n`;
hoverContent += `**文件**: ${func.filePath}\n\n`;
hoverContent += `**行号**: ${func.lineNumber}`;
}
else {
// 多个同名函数
hoverContent = `**函数**: ${word}\n\n`;
hoverContent += `在多个文件中定义:\n\n`;
functions.forEach(func => {
hoverContent += `- \`${func.signature}\` (${func.filePath}:${func.lineNumber})\n`;
});
}
return new vscode.Hover(new vscode.MarkdownString(hoverContent), range);
}
// 检查是否是关键字
const keywordInfo = this.getKeywordInfo(word);
if (keywordInfo) {
return new vscode.Hover(new vscode.MarkdownString(keywordInfo), range);
}
// 检查是否是常量
const constantInfo = this.getConstantInfo(word);
if (constantInfo) {
return new vscode.Hover(new vscode.MarkdownString(constantInfo), range);
}
return undefined;
}
// 获取关键字信息
getKeywordInfo(word) {
const keywordMap = {
'if': '**条件语句**\n\n用于条件执行代码块',
'else': '**条件语句**\n\n与if语句配合使用当if条件不满足时执行',
'while': '**循环语句**\n\n当条件为真时重复执行代码块',
'for': '**循环语句**\n\n用于循环执行代码块',
'foreach': '**循环语句**\n\n遍历数组或表中的每个元素',
'function': '**函数定义**\n\n用于定义函数',
'local': '**变量声明**\n\n声明局部变量',
'return': '**返回语句**\n\n从函数中返回值',
'class': '**类定义**\n\n用于定义类',
'extends': '**继承**\n\n用于指定类的父类',
'constructor': '**构造函数**\n\n类的构造函数',
'null': '**空值**\n\n表示空值',
'true': '**布尔值**\n\n表示真值',
'false': '**布尔值**\n\n表示假值'
};
return keywordMap[word];
}
// 获取常量信息
getConstantInfo(word) {
const constantMap = {
'PI': '**数学常量**\n\n圆周率 π ≈ 3.14159',
'E': '**数学常量**\n\n自然常数 e ≈ 2.71828',
'RAND_MAX': '**随机数**\n\n随机数生成器的最大值',
'CHAR_BIT': '**字符**\n\n一个字节的位数',
'CHAR_MAX': '**字符**\n\nchar类型的最大值',
'CHAR_MIN': '**字符**\n\nchar类型的最小值',
'SHRT_MAX': '**短整型**\n\nshort类型的最大值',
'SHRT_MIN': '**短整型**\n\nshort类型的最小值',
'INT_MAX': '**整型**\n\nint类型的最大值',
'INT_MIN': '**整型**\n\nint类型的最小值',
'LONG_MAX': '**长整型**\n\nlong类型的最大值',
'LONG_MIN': '**长整型**\n\nlong类型的最小值',
'FLT_MAX': '**浮点型**\n\nfloat类型的最大值',
'FLT_MIN': '**浮点型**\n\nfloat类型的最小值',
'DBL_MAX': '**双精度浮点型**\n\ndouble类型的最大值',
'DBL_MIN': '**双精度浮点型**\n\ndouble类型的最小值'
};
return constantMap[word];
}
}
exports.HoverProvider = HoverProvider;
//# sourceMappingURL=hoverProvider.js.map