diff --git a/src/main/java/nl/sander/jsontoy2/java/ClassObject.java b/src/main/java/nl/sander/jsontoy2/java/ClassObject.java index 3c71ab5..c1ca068 100644 --- a/src/main/java/nl/sander/jsontoy2/java/ClassObject.java +++ b/src/main/java/nl/sander/jsontoy2/java/ClassObject.java @@ -2,8 +2,11 @@ package nl.sander.jsontoy2.java; import nl.sander.jsontoy2.java.constantpool.ConstantPoolEntry; import nl.sander.jsontoy2.java.constantpool.Utf8Entry; +import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -34,10 +37,50 @@ public class ClassObject { public Set getMethods() { return Arrays.stream(methodInfos) - .map(mi -> new Method(getUtf8(mi.getNameIndex()), getUtf8(mi.getDescriptorIndex()))) + .map(this::createMethod) .collect(Collectors.toSet()); } + @NotNull + private Method createMethod(Info mi) { + final String descriptor = getUtf8(mi.getDescriptorIndex()); + final int split = descriptor.indexOf(')'); + final List parameters = getParameterTypes(descriptor.substring(0, split)); + + String returnType = descriptor.substring(split + 1); + returnType = returnType.substring(0, returnType.length() - 1); + return new Method(getUtf8(mi.getNameIndex()), parameters, returnType); + } + + private List getParameterTypes(String parameterDescriptor) { + List result = new ArrayList<>(); + boolean array = false; + for (int i = 1; i < parameterDescriptor.length(); i++) { + if (parameterDescriptor.charAt(i) == '[') { + array = true; + } else { + if (parameterDescriptor.charAt(i) == 'L') { + int i2 = i; + while (i2 < parameterDescriptor.length() && parameterDescriptor.charAt(i2) != ';') { + i2++; + } + result.add(getArrayIndicator(array) + parameterDescriptor.substring(i, i2)); + array = false; + i = i2; + } else { + result.add(getArrayIndicator(array) + parameterDescriptor.charAt(i)); + array = false; + } + } + } + return result; + } + + @NotNull + private String getArrayIndicator(boolean array) { + return array ? "[" : ""; + } + public String toString() { StringBuilder builder = new StringBuilder(); for (ConstantPoolEntry entry : constantPool) { diff --git a/src/main/java/nl/sander/jsontoy2/java/Method.java b/src/main/java/nl/sander/jsontoy2/java/Method.java index 805ec40..7acd121 100644 --- a/src/main/java/nl/sander/jsontoy2/java/Method.java +++ b/src/main/java/nl/sander/jsontoy2/java/Method.java @@ -1,23 +1,28 @@ package nl.sander.jsontoy2.java; +import org.jetbrains.annotations.NotNull; + +import java.util.List; import java.util.Objects; -public class Method { +public class Method implements Comparable { private final String name; - private final String type; + private final List parameterTypes; + private final String returnType; - public Method(String name, String type) { + public Method(String name, List parameterTypes, String returnType) { this.name = name; - this.type = type; + this.parameterTypes = parameterTypes; + this.returnType = returnType; } public String getName() { return name; } - public String getType() { - return type; + public String getReturnType() { + return returnType; } @Override @@ -26,19 +31,25 @@ public class Method { if (o == null || getClass() != o.getClass()) return false; Method field = (Method) o; return name.equals(field.name) && - type.equals(field.type); + returnType.equals(field.returnType); } @Override public int hashCode() { - return Objects.hash(name, type); + return Objects.hash(name, returnType); } @Override public String toString() { return "Method{" + "name='" + name + '\'' + - ", type='" + type + '\'' + + ", parameterTypes=" + parameterTypes + + ", returnType='" + returnType + '\'' + '}'; } + + @Override + public int compareTo(@NotNull Method o) { + return name.compareTo(o.name); + } } diff --git a/src/test/java/nl/sander/jsontoy2/java/ClassReaderTest.java b/src/test/java/nl/sander/jsontoy2/java/ClassReaderTest.java index 4d69ef8..8ab6e18 100644 --- a/src/test/java/nl/sander/jsontoy2/java/ClassReaderTest.java +++ b/src/test/java/nl/sander/jsontoy2/java/ClassReaderTest.java @@ -2,7 +2,9 @@ package nl.sander.jsontoy2.java; import org.junit.jupiter.api.Test; +import java.util.List; import java.util.Set; +import java.util.TreeSet; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -11,10 +13,19 @@ public class ClassReaderTest { //part of the test public int field; + public String method(String value, int[] value2, int value3) { + return value; + } + // + @Test public void testReadClass() { ClassObject object = new ClassReader().parse(ClassReaderTest.class); assertEquals(Set.of(new Field("field", "I")), object.getFields()); - assertEquals(Set.of(new Method("", "()V"), new Method("testReadClass", "()V")), object.getMethods()); + assertEquals(new TreeSet<>(Set.of( + new Method("method", List.of("Ljava/lang/String", "[I", "I"), "Ljava/lang/String"), + new Method("testReadClass", null, "V"), + new Method("", null, "V")) + ), new TreeSet<>(object.getMethods())); } }