adding java parsing but it should be bytecode to java and parsing that

This commit is contained in:
2025-07-15 17:13:08 +02:00
parent 1ee173a880
commit d8bc3bd069
8 changed files with 54 additions and 16 deletions

View File

@@ -1,5 +1,8 @@
package click.kamil.callgraphexporter; package click.kamil.callgraphexporter;
import click.kamil.callgraphexporter.domain.MethodMetadata;
import click.kamil.callgraphexporter.domain.MethodSignature;
import click.kamil.callgraphexporter.domain.Modifiers;
import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.core.dom.*;
@@ -93,9 +96,8 @@ public class JdtResolvedCallGraph {
}); });
} }
// Fixed: matches your MethodSignature record with only methodName and paramTypes
private static MethodSignature toSignature(IMethodBinding binding) { private static MethodSignature toSignature(IMethodBinding binding) {
String packageName = binding.getDeclaringClass().getPackage().getName();
String className = binding.getDeclaringClass().getName();
String methodName = binding.getName(); String methodName = binding.getName();
List<String> paramTypes = new ArrayList<>(); List<String> paramTypes = new ArrayList<>();
@@ -103,7 +105,7 @@ public class JdtResolvedCallGraph {
paramTypes.add(param.getName()); paramTypes.add(param.getName());
} }
return new MethodSignature(packageName, className, methodName, paramTypes); return new MethodSignature(methodName, paramTypes);
} }
private static MethodMetadata toMetadata(IMethodBinding binding, MethodDeclaration method) { private static MethodMetadata toMetadata(IMethodBinding binding, MethodDeclaration method) {
@@ -123,18 +125,25 @@ public class JdtResolvedCallGraph {
private static void generateDotFile(String filename) throws IOException { private static void generateDotFile(String filename) throws IOException {
StringBuilder sb = new StringBuilder("digraph G {\n"); StringBuilder sb = new StringBuilder("digraph G {\n");
for (MethodSignature caller : callGraph.keySet()) { for (MethodSignature caller : callGraph.keySet()) {
String callerLabel = formatSignature(caller);
for (MethodSignature callee : callGraph.get(caller)) { for (MethodSignature callee : callGraph.get(caller)) {
sb.append(" \"").append(caller).append("\" -> \"").append(callee).append("\";\n"); String calleeLabel = formatSignature(callee);
sb.append(" \"").append(callerLabel).append("\" -> \"").append(calleeLabel).append("\";\n");
} }
} }
sb.append("}"); sb.append("}");
Files.writeString(new File(filename).toPath(), sb.toString()); Files.writeString(new File(filename).toPath(), sb.toString());
} }
private static String formatSignature(MethodSignature sig) {
// Build a readable label (methodName + param list)
return sig.methodName() + sig.parameterTypes();
}
private static Set<Modifiers> extractModifiers(IMethodBinding binding, MethodDeclaration method) { private static Set<Modifiers> extractModifiers(IMethodBinding binding, MethodDeclaration method) {
Set<Modifiers> result = new HashSet<>(); Set<Modifiers> result = new HashSet<>();
int mods = binding.getModifiers(); int mods = binding.getModifiers();
// 1. From bitmask
if (Modifier.isPublic(mods)) result.add(Modifiers.PUBLIC); if (Modifier.isPublic(mods)) result.add(Modifiers.PUBLIC);
if (Modifier.isPrivate(mods)) result.add(Modifiers.PRIVATE); if (Modifier.isPrivate(mods)) result.add(Modifiers.PRIVATE);
if (Modifier.isProtected(mods)) result.add(Modifiers.PROTECTED); if (Modifier.isProtected(mods)) result.add(Modifiers.PROTECTED);
@@ -145,13 +154,10 @@ public class JdtResolvedCallGraph {
if (Modifier.isSynchronized(mods)) result.add(Modifiers.SYNCHRONIZED); if (Modifier.isSynchronized(mods)) result.add(Modifiers.SYNCHRONIZED);
if (Modifier.isStrictfp(mods)) result.add(Modifiers.STRICTFP); if (Modifier.isStrictfp(mods)) result.add(Modifiers.STRICTFP);
// 2. From modifiers list for special cases
for (Object mod : method.modifiers()) { for (Object mod : method.modifiers()) {
if (mod instanceof Modifier keyword) { if (mod instanceof Modifier keyword) {
if (keyword.isDefault()) result.add(Modifiers.DEFAULT); if (keyword.isDefault()) result.add(Modifiers.DEFAULT);
// NOTE: isSealed and isNonSealed are class-level only
} }
// If needed, check for annotation modifiers here
} }
return result; return result;

View File

@@ -1,4 +1,4 @@
package click.kamil.callgraphexporter; package click.kamil.callgraphexporter.domain;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,4 +1,4 @@
package click.kamil.callgraphexporter; package click.kamil.callgraphexporter.domain;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;

View File

@@ -1,10 +1,8 @@
package click.kamil.callgraphexporter; package click.kamil.callgraphexporter.domain;
import java.util.List; import java.util.List;
public record MethodSignature( public record MethodSignature(
String packageName,
String className,
String methodName, String methodName,
List<String> parameterTypes List<String> parameterTypes
) { ) {

View File

@@ -1,4 +1,4 @@
package click.kamil.callgraphexporter; package click.kamil.callgraphexporter.domain;
public enum Modifiers { public enum Modifiers {
PUBLIC, PUBLIC,
@@ -16,4 +16,3 @@ public enum Modifiers {
SEALED, SEALED,
NON_SEALED, NON_SEALED,
} }

View File

@@ -0,0 +1,26 @@
package click.kamil.callgraphexporter.domain;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class TypeGroup {
private String packageName;
private String typeName;
private TypeKind typeKind;
private EnumSet<Modifiers> modifiers = EnumSet.noneOf(Modifiers.class);
private List<Method> methods = new ArrayList<>();
public void addMethod(Method method) {
methods.add(method);
}
}

View File

@@ -0,0 +1,9 @@
package click.kamil.callgraphexporter.domain;
public enum TypeKind {
CLASS,
INTERFACE,
RECORD,
ENUM,
ANNOTATION
}

View File

@@ -14,7 +14,7 @@ import java.util.*;
public class JavaConcatenator { public class JavaConcatenator {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
Path sourceDir = Path.of("./src/main/java/click/kamil/springstatemachineexporter/ast"); Path sourceDir = Path.of("./src/main/java/click/kamil/callgraphexporter/domain");
Path outputFile = Path.of("./Combined.java"); Path outputFile = Path.of("./Combined.java");
String targetPackage = "click.kamil"; String targetPackage = "click.kamil";