diff --git a/src/main/java/nl/sander/beejava/Compiler.java b/src/main/java/nl/sander/beejava/Compiler.java index d86ae33..e755772 100644 --- a/src/main/java/nl/sander/beejava/Compiler.java +++ b/src/main/java/nl/sander/beejava/Compiler.java @@ -1,5 +1,6 @@ package nl.sander.beejava; +import nl.sander.beejava.api.BeeClass; import nl.sander.beejava.constantpool.ConstantPool; import nl.sander.beejava.constantpool.entry.ConstantPoolEntry; import nl.sander.beejava.util.ByteBuf; diff --git a/src/main/java/nl/sander/beejava/ConstantTreeCreator.java b/src/main/java/nl/sander/beejava/ConstantTreeCreator.java index 32e88f5..e5ac480 100644 --- a/src/main/java/nl/sander/beejava/ConstantTreeCreator.java +++ b/src/main/java/nl/sander/beejava/ConstantTreeCreator.java @@ -1,5 +1,8 @@ package nl.sander.beejava; +import nl.sander.beejava.api.BeeClass; +import nl.sander.beejava.api.CodeLine; +import nl.sander.beejava.api.Ref; import nl.sander.beejava.constantpool.entry.*; import java.util.LinkedHashSet; @@ -18,6 +21,13 @@ public class ConstantTreeCreator { private final Set constantTree = new LinkedHashSet<>(); private BeeClass beeClass; + /** + * Creates a Set of nested entries that make up a single reference. For instance a class reference whose name is a utf8 reference. + * In the constant pool they are consecutive entries, but they are created like nodes in a tree structure that models their relation. + * + * @param beeClass the Class object for which the constant pool needs to be created + * @return a Set of constant pool entries + */ public Set createConstantTree(BeeClass beeClass) { constantTree.clear(); this.beeClass = beeClass; @@ -31,22 +41,24 @@ public class ConstantTreeCreator { codeContainer.getCode().forEach(this::updateConstantTree); } - // TODO construct multi root tree + /* + * scan code line for items that need adding to the constant pool + */ private void updateConstantTree(CodeLine codeline) { if (codeline.hasMethod()){ - addMethodRef(codeline); + addMethod(codeline); } if (codeline.hasField()) { - addFieldRef(codeline); + addField(codeline); } } - private void addMethodRef(CodeLine codeline) { + private void addMethod(CodeLine codeline) { constantTree.add(new MethodRefEntry(createClassName(codeline), createMethodNameAndType(codeline))); } - private void addFieldRef(CodeLine codeline) { + private void addField(CodeLine codeline) { constantTree.add(new FieldRefEntry(createClassName(codeline), createFieldNameAndType(codeline))); } @@ -66,7 +78,7 @@ public class ConstantTreeCreator { if (codeline.getRef() == Ref.SUPER) { return beeClass.getSuperClass().getName(); } else if (codeline.getRef() == Ref.THIS) { - return beeClass.getPackage() + "." + beeClass.getName(); + return beeClass.getName(); } throw new RuntimeException("shouldn't be here"); } diff --git a/src/main/java/nl/sander/beejava/ContainsCode.java b/src/main/java/nl/sander/beejava/ContainsCode.java index fc762fe..97d4043 100644 --- a/src/main/java/nl/sander/beejava/ContainsCode.java +++ b/src/main/java/nl/sander/beejava/ContainsCode.java @@ -1,5 +1,7 @@ package nl.sander.beejava; +import nl.sander.beejava.api.CodeLine; + import java.util.List; public interface ContainsCode { diff --git a/src/main/java/nl/sander/beejava/Output.java b/src/main/java/nl/sander/beejava/Output.java deleted file mode 100644 index 34c7660..0000000 --- a/src/main/java/nl/sander/beejava/Output.java +++ /dev/null @@ -1,22 +0,0 @@ -package nl.sander.beejava; - -/** - * Only used to contain void return - */ -public final class Output { - - public static final Output VOID =new Output(); - - private Output() { - } - - @Override - public int hashCode() { - return getClass().hashCode(); - } - - @Override - public boolean equals(Object obj) { - return getClass() == obj.getClass(); - } -} diff --git a/src/main/java/nl/sander/beejava/BeeClass.java b/src/main/java/nl/sander/beejava/api/BeeClass.java similarity index 81% rename from src/main/java/nl/sander/beejava/BeeClass.java rename to src/main/java/nl/sander/beejava/api/BeeClass.java index e85f332..9c9212b 100644 --- a/src/main/java/nl/sander/beejava/BeeClass.java +++ b/src/main/java/nl/sander/beejava/api/BeeClass.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; import nl.sander.beejava.flags.ClassAccessFlag; @@ -10,19 +10,19 @@ public class BeeClass { private final Version classFileVersion; private final BeePackage beePackage; private final Set accessFlags = new HashSet<>(); - private final String name; + private final String simpleName; private final Class superClass; private final Set> interfaces = new HashSet<>(); private final Set fields = new HashSet<>(); private final Set constructors = new HashSet<>(); private BeeClass(Version classFileVersion, - BeePackage beePackage, Set accessFlags, String name, Class superClass, + BeePackage beePackage, Set accessFlags, String simpleName, Class superClass, Set> interfaces, Set fields, Set constructors) { this.classFileVersion = classFileVersion; this.beePackage = beePackage; this.accessFlags.addAll(accessFlags); - this.name = name; + this.simpleName = simpleName; this.superClass = superClass; this.interfaces.addAll(interfaces); this.fields.addAll(fields); @@ -41,8 +41,11 @@ public class BeeClass { return beePackage; } - public String getName() { - return name; + /** + * returns the unqualified name, like java.lang.Class + */ + public String getSimpleName() { + return simpleName; } public Set getConstructors() { @@ -53,6 +56,13 @@ public class BeeClass { return accessFlags; } + /** + * returns the full name, like java.lang.Class + */ + public String getName() { + return beePackage.getName() + "." + simpleName; + } + public Class getSuperClass() { return superClass; } @@ -62,20 +72,20 @@ public class BeeClass { } public static class Builder { - private Version version; private final Set accessFlags = new HashSet<>(); private final Set> interfaces = new HashSet<>(); private final Set fields = new HashSet<>(); private final Set constructors = new HashSet<>(); + private Version version; private BeePackage beePackage; private Class superClass = Object.class; - private String name; + private String simpleName; private Builder() { } - public Builder withClassFileVersion(Version version){ - this.version=version; + public Builder withClassFileVersion(Version version) { + this.version = version; return this; } @@ -89,8 +99,8 @@ public class BeeClass { return this; } - public BeeClass.Builder withName(String name) { - this.name = name; + public BeeClass.Builder withSimpleName(String simpleName) { + this.simpleName = simpleName; return this; } @@ -115,7 +125,7 @@ public class BeeClass { } public BeeClass build() { - return new BeeClass(version, beePackage, accessFlags, name, superClass, interfaces, fields, constructors); + return new BeeClass(version, beePackage, accessFlags, simpleName, superClass, interfaces, fields, constructors); } diff --git a/src/main/java/nl/sander/beejava/BeeConstructor.java b/src/main/java/nl/sander/beejava/api/BeeConstructor.java similarity index 93% rename from src/main/java/nl/sander/beejava/BeeConstructor.java rename to src/main/java/nl/sander/beejava/api/BeeConstructor.java index a5243e5..f5d7643 100644 --- a/src/main/java/nl/sander/beejava/BeeConstructor.java +++ b/src/main/java/nl/sander/beejava/api/BeeConstructor.java @@ -1,10 +1,14 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; +import nl.sander.beejava.ContainsCode; import nl.sander.beejava.flags.MethodAccessFlag; import java.util.*; -public class BeeConstructor implements ContainsCode{ +/** + * Models a constructor + */ +public class BeeConstructor implements ContainsCode { private final Set accessFlags = new HashSet<>(); private final Set formalParameters = new HashSet<>(); private final List code = new LinkedList<>(); diff --git a/src/main/java/nl/sander/beejava/BeeField.java b/src/main/java/nl/sander/beejava/api/BeeField.java similarity index 98% rename from src/main/java/nl/sander/beejava/BeeField.java rename to src/main/java/nl/sander/beejava/api/BeeField.java index 138fb64..1f40c91 100644 --- a/src/main/java/nl/sander/beejava/BeeField.java +++ b/src/main/java/nl/sander/beejava/api/BeeField.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; import nl.sander.beejava.flags.FieldAccessFlag; diff --git a/src/main/java/nl/sander/beejava/BeePackage.java b/src/main/java/nl/sander/beejava/api/BeePackage.java similarity index 56% rename from src/main/java/nl/sander/beejava/BeePackage.java rename to src/main/java/nl/sander/beejava/api/BeePackage.java index 1d655ed..9b0f997 100644 --- a/src/main/java/nl/sander/beejava/BeePackage.java +++ b/src/main/java/nl/sander/beejava/api/BeePackage.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; class BeePackage { @@ -7,4 +7,8 @@ class BeePackage { BeePackage(String name) { this.name = name; } + + public String getName() { + return name; + } } diff --git a/src/main/java/nl/sander/beejava/BeeParameter.java b/src/main/java/nl/sander/beejava/api/BeeParameter.java similarity index 89% rename from src/main/java/nl/sander/beejava/BeeParameter.java rename to src/main/java/nl/sander/beejava/api/BeeParameter.java index 60c3604..7a46697 100644 --- a/src/main/java/nl/sander/beejava/BeeParameter.java +++ b/src/main/java/nl/sander/beejava/api/BeeParameter.java @@ -1,7 +1,10 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; import java.util.Objects; +/** + * Models a formal parameter in a method declaration. + */ public class BeeParameter { private final Class type; private final String name; diff --git a/src/main/java/nl/sander/beejava/CodeLine.java b/src/main/java/nl/sander/beejava/api/CodeLine.java similarity index 90% rename from src/main/java/nl/sander/beejava/CodeLine.java rename to src/main/java/nl/sander/beejava/api/CodeLine.java index a0bbb5d..a8c67a8 100644 --- a/src/main/java/nl/sander/beejava/CodeLine.java +++ b/src/main/java/nl/sander/beejava/api/CodeLine.java @@ -1,7 +1,7 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; -class CodeLine { +public class CodeLine { private final int linenumber; private final Opcode opcode; private Ref ref; @@ -78,28 +78,27 @@ class CodeLine { return methodName; } - boolean hasMethod() { + public boolean hasMethod() { return methodName != null; } - String getMethodSignature() { + public String getMethodSignature() { return inputSignature + outputSignature; } - Ref getRef() { + public Ref getRef() { return ref; } - - boolean hasField() { + public boolean hasField() { return field != null; } - BeeField getField() { + public BeeField getField() { return field; } - BeeParameter getParameter() { + public BeeParameter getParameter() { return parameter; } diff --git a/src/main/java/nl/sander/beejava/Opcode.java b/src/main/java/nl/sander/beejava/api/Opcode.java similarity index 97% rename from src/main/java/nl/sander/beejava/Opcode.java rename to src/main/java/nl/sander/beejava/api/Opcode.java index 263386b..f0eaa61 100644 --- a/src/main/java/nl/sander/beejava/Opcode.java +++ b/src/main/java/nl/sander/beejava/api/Opcode.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; public enum Opcode { LOAD("load"), diff --git a/src/main/java/nl/sander/beejava/Ref.java b/src/main/java/nl/sander/beejava/api/Ref.java similarity index 70% rename from src/main/java/nl/sander/beejava/Ref.java rename to src/main/java/nl/sander/beejava/api/Ref.java index ac972f1..49ea11a 100644 --- a/src/main/java/nl/sander/beejava/Ref.java +++ b/src/main/java/nl/sander/beejava/api/Ref.java @@ -1,10 +1,9 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; /** * used to indicate this, super, or none of those, in which case it's class */ public enum Ref { THIS, - SUPER, - CLASS + SUPER } diff --git a/src/main/java/nl/sander/beejava/Version.java b/src/main/java/nl/sander/beejava/api/Version.java similarity index 93% rename from src/main/java/nl/sander/beejava/Version.java rename to src/main/java/nl/sander/beejava/api/Version.java index 81ae9b0..36d5396 100644 --- a/src/main/java/nl/sander/beejava/Version.java +++ b/src/main/java/nl/sander/beejava/api/Version.java @@ -1,4 +1,4 @@ -package nl.sander.beejava; +package nl.sander.beejava.api; public enum Version { V1_0_2(45), diff --git a/src/main/java/nl/sander/beejava/flags/AccessFlag.java b/src/main/java/nl/sander/beejava/flags/AccessFlag.java index 75b905e..f72a126 100644 --- a/src/main/java/nl/sander/beejava/flags/AccessFlag.java +++ b/src/main/java/nl/sander/beejava/flags/AccessFlag.java @@ -2,6 +2,7 @@ package nl.sander.beejava.flags; import java.util.Set; +// TODO all access flags can be moved together public interface AccessFlag { int getBytecode(); diff --git a/src/test/java/nl/sander/beejava/ConstantTeeTests.java b/src/test/java/nl/sander/beejava/ConstantTreeCreatorTests.java similarity index 87% rename from src/test/java/nl/sander/beejava/ConstantTeeTests.java rename to src/test/java/nl/sander/beejava/ConstantTreeCreatorTests.java index afbd4f9..b67ceb1 100644 --- a/src/test/java/nl/sander/beejava/ConstantTeeTests.java +++ b/src/test/java/nl/sander/beejava/ConstantTreeCreatorTests.java @@ -1,5 +1,6 @@ package nl.sander.beejava; +import nl.sander.beejava.api.*; import nl.sander.beejava.constantpool.entry.*; import nl.sander.beejava.flags.FieldAccessFlag; import nl.sander.beejava.flags.MethodAccessFlag; @@ -8,13 +9,15 @@ import org.junit.jupiter.api.Test; import java.util.Iterator; import java.util.Set; -import static nl.sander.beejava.CodeLine.line; -import static nl.sander.beejava.Opcode.*; +import static nl.sander.beejava.api.CodeLine.line; +import static nl.sander.beejava.api.Opcode.*; import static nl.sander.beejava.flags.ClassAccessFlag.PUBLIC; import static org.junit.jupiter.api.Assertions.assertEquals; -public class ConstantTeeTests { - @Test +public class ConstantTreeCreatorTests { + + // creates simplest class possible and checks the tree, that the ConstantTreeCreator emits + @Test // This is not a maintainable test public void testMethodRefEntryForSuperConstructor() { BeeClass classWithIntField = createEmptyClass(); Set constantTree = new ConstantTreeCreator().createConstantTree(classWithIntField); @@ -72,9 +75,9 @@ public class ConstantTeeTests { .withClassFileVersion(Version.V14) .withPackage("nl.sander.beejava.test") .withAccessFlags(PUBLIC) - .withName("EmptyBean") - .withSuperClass(Object.class) - .withConstructors(constructor) + .withSimpleName("EmptyBean") + .withSuperClass(Object.class) // Not mandatory, like in java sourcecode + .withConstructors(constructor) // There's no default constructor in beejava. The user must always add them .build(); } @@ -103,7 +106,7 @@ public class ConstantTeeTests { .withClassFileVersion(Version.V14) .withPackage("nl.sander.beejava.test") .withAccessFlags(PUBLIC) - .withName("IntBean") + .withSimpleName("IntBean") .withSuperClass(Object.class) .withFields(intField) .withConstructors(constructor)