fix attempt 1

This commit is contained in:
2026-06-20 06:51:15 +02:00
parent 19547d3c5f
commit d59f4ac166
5 changed files with 155 additions and 14 deletions

View File

@@ -44,7 +44,7 @@ public class TransitionLinkerEnricher implements AnalysisEnricher {
boolean isWildcard = triggerEvent.equals("event") || triggerEvent.equals("e") ||
triggerEvent.equals("msg") || triggerEvent.equals("message") ||
triggerEvent.equals("payload") || triggerEvent.matches(".*\\.get[A-Z].*\\(\\)");
triggerEvent.equals("payload");
if (isWildcard) {
String targetVar = chain.getContextMachineId();

View File

@@ -147,12 +147,21 @@ public class CallGraphBuilder {
}
List<String> polymorphicEvents = new ArrayList<>();
if (resolvedValue.matches(".*\\.get[A-Z].*\\(\\)")) {
String varName = resolvedValue.substring(0, resolvedValue.indexOf('.'));
String methodName = resolvedValue.substring(resolvedValue.indexOf('.') + 1, resolvedValue.indexOf('('));
if (resolvedValue.matches(".*\\.[a-zA-Z0-9_]+\\(\\)")) {
int lastDot = resolvedValue.lastIndexOf('.');
int firstDot = resolvedValue.indexOf('.');
int openParen = resolvedValue.indexOf('(', lastDot);
// Resolve in the first method in the path where the variable might be declared
for (String methodFqn : path) {
if (lastDot > 0 && openParen > lastDot) {
String varName = resolvedValue.substring(0, firstDot);
if (varName.contains("(")) {
varName = null;
}
String methodName = resolvedValue.substring(lastDot + 1, openParen);
if (varName != null) {
// Resolve in the first method in the path where the variable might be declared
for (String methodFqn : path) {
String declaredType = getVariableDeclaredType(methodFqn, varName);
if (declaredType != null) {
System.out.println("DEEP TRACE: " + methodFqn + " " + varName + " -> " + declaredType);
@@ -187,6 +196,8 @@ public class CallGraphBuilder {
break;
}
}
}
}
}
if (!resolvedValue.equals(event) || !polymorphicEvents.isEmpty()) {
@@ -541,9 +552,11 @@ public class CallGraphBuilder {
expr = tracedExpr; // Only accept trace if it resolves to a pure constant/primitive/constructor
}
if (expr instanceof ClassInstanceCreation cic) {
if (!cic.arguments().isEmpty()) {
expr = (Expression) cic.arguments().get(0);
if (expr instanceof ClassInstanceCreation cic && !cic.arguments().isEmpty()) {
Expression firstArg = (Expression) cic.arguments().get(0);
String resolved = constantResolver.resolve(firstArg, context);
if (resolved != null) {
expr = firstArg; // Only unwrap if it's actually a constant
}
}