fix: java-scanner提取方法体

 修改 extractMethods:
- 完全重写方法提取逻辑
- 逐行扫描Java源码
- 提取方法签名的同时提取方法体
- 使用括号计数器精确提取方法体边界

🎯 效果:
- method.methodBody 现在包含完整的Java方法体
- service-generator可以拿到Java业务逻辑进行转换
This commit is contained in:
wanwu
2025-10-29 13:52:42 +08:00
parent 0d059a45f3
commit 30897cbb57

View File

@@ -356,43 +356,77 @@ class JavaScanner {
/** /**
* 提取方法 * 提取方法
*
* ✅ 增强:提取方法体,用于业务逻辑转换
*/ */
extractMethods(content) { extractMethods(content) {
// 匹配各种访问修饰符的方法public, protected, private, 或 package-private (无修饰符) const methods = [];
const methodMatches = content.match(/(public|protected|private)?\s+[\w<>\[\]]+\s+(\w+)\s*\([^)]*\)\s*\{/g); const lines = content.split('\n');
if (!methodMatches) return [];
const methods = methodMatches.map(match => { for (let i = 0; i < lines.length; i++) {
// 提取方法名 const line = lines[i];
const methodNameMatch = match.match(/(public|protected|private)?\s+[\w<>\[\]]+\s+(\w+)\s*\(/);
const methodName = methodNameMatch ? methodNameMatch[2] : 'unknown';
// 提取访问修饰符 // 查找方法定义行(包含访问修饰符、返回类型、方法名、参数、左大括号)
const accessModifier = methodNameMatch && methodNameMatch[1] ? methodNameMatch[1] : 'package'; const methodMatch = line.match(/(public|protected|private)?\s+([\w<>\[\]]+)\s+(\w+)\s*\([^{]*\{/);
if (!methodMatch) continue;
// 提取参数信息(特别是事件类型) const accessModifier = methodMatch[1] || 'package';
const paramMatch = match.match(/\(([^)]*)\)/); const returnType = methodMatch[2];
const methodName = methodMatch[3];
// 提取参数
const paramMatch = line.match(/\(([^)]*)\)/);
const parameters = this.extractMethodParameters(line);
// 提取事件类型用于Listener
let eventType = null; let eventType = null;
if (paramMatch && paramMatch[1]) { if (paramMatch && paramMatch[1]) {
const params = paramMatch[1].trim(); const params = paramMatch[1].trim();
// 提取事件类型,如: MemberLoginEvent event
const eventTypeMatch = params.match(/(\w+Event)\s+\w+/); const eventTypeMatch = params.match(/(\w+Event)\s+\w+/);
if (eventTypeMatch) { if (eventTypeMatch) {
eventType = eventTypeMatch[1]; eventType = eventTypeMatch[1];
} }
} }
return { // ✅ 提取方法体(从左大括号后开始,到匹配的右大括号)
let braceCount = (line.match(/\{/g) || []).length - (line.match(/\}/g) || []).length;
let methodBody = '';
// 获取左大括号后的内容
const braceIndex = line.indexOf('{');
if (braceIndex !== -1) {
methodBody = line.substring(braceIndex + 1);
}
// 继续读取后续行,直到找到匹配的右大括号
for (let j = i + 1; j < lines.length && braceCount > 0; j++) {
const currentLine = lines[j];
braceCount += (currentLine.match(/\{/g) || []).length - (currentLine.match(/\}/g) || []).length;
if (braceCount > 0) {
methodBody += '\n' + currentLine;
} else {
// 最后一行,只取右大括号之前的内容
const lastBraceIndex = currentLine.lastIndexOf('}');
if (lastBraceIndex !== -1) {
methodBody += '\n' + currentLine.substring(0, lastBraceIndex);
}
}
i = j; // 更新外层循环的索引
}
methods.push({
methodName: methodName, methodName: methodName,
accessModifier: accessModifier, accessModifier: accessModifier,
signature: match, signature: line,
returnType: this.extractReturnType(match), returnType: returnType,
parameters: this.extractMethodParameters(match), parameters: parameters,
eventType: eventType eventType: eventType,
}; methodBody: methodBody.trim() // ✅ 新增:保存方法体
}); });
}
// 只返回public方法用于Service层
return methods; return methods;
} }