codn_ts
Version:
智能代码分析工具 - 支持语义搜索、调用链分析和代码结构可视化,对大模型/AI agent 友好
121 lines • 4.58 kB
JavaScript
;
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.collectDiagnostics = collectDiagnostics;
const lsp_core_1 = require("./lsp_core");
const os_utils_1 = require("./os_utils");
const file_utils_1 = require("./file_utils");
const path = __importStar(require("path"));
const fs = __importStar(require("fs"));
const glob_1 = require("glob");
function lspSeverityToString(sev) {
switch (sev) {
case 1:
return "error";
case 2:
return "warning";
case 3:
return "info";
case 4:
return "hint";
default:
return "info";
}
}
async function collectDiagnostics({ projectRoot = process.cwd(), file = "", waitMs = 800, } = {}) {
const rootUri = (0, file_utils_1.toFileUri)(projectRoot);
const client = new lsp_core_1.LSPClient(rootUri, {
...lsp_core_1.DEFAULT_CONFIG,
timeout: 60000,
logLevel: "debug",
});
const languages = (0, os_utils_1.detectDominantLanguages)(projectRoot, {
ignoredDirs: new Set(["node_modules", "dist"]),
topN: 1,
});
const lang = languages[0];
const file_ext = (0, os_utils_1.getLanguageFileExtensions)(lang);
try {
await client.start(lang);
let files = [];
if (file) {
files = [path.isAbsolute(file) ? file : path.join(projectRoot, file)];
}
else {
files = await (0, glob_1.glob)(`**/*.{${file_ext}}`, {
cwd: projectRoot,
ignore: "node_modules/**",
absolute: true,
});
}
const allDiagnostics = [];
const seen = new Set();
function handleDiagnostics({ uri, diagnostics, }) {
const relativePath = path.relative(projectRoot, uri.replace(/^file:\/\//, ""));
for (const d of diagnostics) {
const key = `${relativePath}:${d.range?.start?.line}:${d.range?.start?.character}:${d.message}`;
if (seen.has(key))
continue;
seen.add(key);
allDiagnostics.push({
file: relativePath,
line: d.range?.start?.line + 1 || 1,
column: d.range?.start?.character + 1 || 1,
severity: lspSeverityToString(d.severity),
message: d.message,
code: d.code,
source: d.source,
});
}
}
client.on("diagnostics", handleDiagnostics);
for (const filePath of files) {
const fileUri = (0, file_utils_1.toFileUri)(filePath);
const content = fs.readFileSync(filePath, "utf-8");
await client.sendDidOpen(fileUri, content, lang);
}
// 等待 LSP 推送 diagnostics
await new Promise((resolve) => setTimeout(resolve, waitMs));
for (const filePath of files) {
const fileUri = (0, file_utils_1.toFileUri)(filePath);
await client.sendDidClose(fileUri);
}
return allDiagnostics;
}
finally {
await client.shutdown();
}
}
//# sourceMappingURL=diagnostics.js.map