from ai two

This commit is contained in:
2026-07-06 21:41:26 +02:00
parent 56588a835d
commit 2caaec5419
3 changed files with 146 additions and 12 deletions

View File

@@ -268,7 +268,16 @@ public class ConstantResolver {
if (fragment.getInitializer() != null) {
String rhsVal = resolveExpressionWithParams(fragment.getInitializer(), localVars, context);
if (rhsVal == null) rhsVal = resolveInternal(fragment.getInitializer(), context, visited);
if (rhsVal != null) localVars.put(varName, rhsVal);
if (rhsVal != null) {
localVars.put(varName, rhsVal);
} else {
java.util.Map<String, String> bFields = extractBuilderFields(fragment.getInitializer(), localVars, context, visited);
if (bFields != null) {
for (java.util.Map.Entry<String, String> e : bFields.entrySet()) {
localVars.put(varName + "." + e.getKey(), e.getValue());
}
}
}
}
}
}
@@ -321,9 +330,19 @@ public class ConstantResolver {
} else if (lhs instanceof FieldAccess fa) {
varName = "this." + fa.getName().getIdentifier();
}
String rhsVal = resolveExpressionWithParams(assignment.getRightHandSide(), localVars, context);
if (rhsVal == null) rhsVal = resolveInternal(assignment.getRightHandSide(), context, visited);
if (varName != null && rhsVal != null) {
if (varName != null) {
String rhsVal = resolveExpressionWithParams(assignment.getRightHandSide(), localVars, context);
if (rhsVal == null) rhsVal = resolveInternal(assignment.getRightHandSide(), context, visited);
if (rhsVal != null) {
localVars.put(varName, rhsVal);
} else {
java.util.Map<String, String> bFields = extractBuilderFields(assignment.getRightHandSide(), localVars, context, visited);
if (bFields != null) {
for (java.util.Map.Entry<String, String> e : bFields.entrySet()) {
localVars.put(varName + "." + e.getKey(), e.getValue());
}
}
}
if (varName.startsWith("this.")) {
localVars.put(varName, rhsVal);
String bareName = varName.substring(5);
@@ -577,6 +596,22 @@ public class ConstantResolver {
}
}
} else {
if (mi.arguments().isEmpty() && mi.getExpression() instanceof SimpleName sn) {
String objName = sn.getIdentifier();
String methodName = mi.getName().getIdentifier();
String propName = null;
if (methodName.startsWith("get") && methodName.length() > 3) {
propName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
} else {
propName = methodName;
}
String val = paramValues.get(objName + "." + propName);
if (val == null && !propName.equals(methodName)) {
val = paramValues.get(objName + "." + methodName);
}
if (val != null) return val;
}
MethodDeclaration sideEffectMd = findInvokedMethod(mi, context);
if (sideEffectMd != null && sideEffectMd.getBody() != null) {
TypeDeclaration currentTd = findEnclosingType(sideEffectMd);
@@ -613,6 +648,29 @@ public class ConstantResolver {
return null;
}
private java.util.Map<String, String> extractBuilderFields(Expression expr, java.util.Map<String, String> localVars, CodebaseContext context, Set<String> visited) {
if (!(expr instanceof MethodInvocation mi)) return null;
java.util.Map<String, String> fields = new java.util.HashMap<>();
MethodInvocation current = mi;
while (current != null) {
String methodName = current.getName().getIdentifier();
if (!"build".equals(methodName) && !"builder".equals(methodName) && !"toBuilder".equals(methodName)) {
if (current.arguments().size() == 1) {
Expression arg = (Expression) current.arguments().get(0);
String val = resolveExpressionWithParams(arg, localVars, context);
if (val == null) val = resolveInternal(arg, context, visited);
if (val != null) fields.put(methodName, val);
}
}
if (current.getExpression() instanceof MethodInvocation next) {
current = next;
} else {
break;
}
}
return fields.isEmpty() ? null : fields;
}
private String resolveInfix(InfixExpression expr, CodebaseContext context, Set<String> visited) {
if (expr.getOperator() != InfixExpression.Operator.PLUS) return null;