diff --git a/src/main/java/nl/sander/beejava/CompiledClass.java b/src/main/java/nl/sander/beejava/CompiledClass.java index eb2efb3..c6cec76 100644 --- a/src/main/java/nl/sander/beejava/CompiledClass.java +++ b/src/main/java/nl/sander/beejava/CompiledClass.java @@ -28,14 +28,14 @@ public class CompiledClass { return thisClass.getIndex(); } - public ClassEntry superClass() { + public ClassEntry addSuperClass() { if (superClass == null) { superClass = createClassEntry(beeClass.getSuperClass().getName()); } return superClass; } - public ClassEntry thisClass() { + public ClassEntry addThisClass() { if (thisClass == null) { thisClass = createClassEntry(internalName(beeClass.getName())); } @@ -58,11 +58,7 @@ public class CompiledClass { constantTree.add(interfaceEntry); } - public void setThisClass() { - constantTree.add(thisClass()); - } - - public void setInterfaces() { + public void addInterfaces() { beeClass.getInterfaces().forEach(interfase -> { ClassEntry interfaceEntry = new ClassEntry(new Utf8Entry(internalName(interfase.getName()))); addInterface(interfaceEntry); @@ -70,6 +66,12 @@ public class CompiledClass { }); } + public void addFields() { + beeClass.getFields().forEach(field -> { + // TODO + }); + } + private ClassEntry createClassEntry(String name) { return new ClassEntry(new Utf8Entry(internalName(name))); } diff --git a/src/main/java/nl/sander/beejava/Compiler.java b/src/main/java/nl/sander/beejava/Compiler.java index 17adf48..34d3f63 100644 --- a/src/main/java/nl/sander/beejava/Compiler.java +++ b/src/main/java/nl/sander/beejava/Compiler.java @@ -27,11 +27,12 @@ public class Compiler { public CompiledClass compile(BeeClass beeClass) { compiledClass = new CompiledClass(beeClass); beeClass.getConstructors().forEach(this::updateConstantPool); - // TODO update constantTree for fields ? - // TODO update constantTree for methods + // TODO update constant pool for fields ? + // TODO update constant pool for methods - compiledClass.setThisClass(); - compiledClass.setInterfaces(); + compiledClass.addThisClass(); + compiledClass.addInterfaces(); + compiledClass.addFields(); return compiledClass; } @@ -46,19 +47,19 @@ public class Compiler { */ private void updateConstantPool(CodeLine codeline) { if (codeline.hasMethod()) { - addMethod(codeline); + addMethodToConstantPool(codeline); } if (codeline.hasField()) { - addField(codeline); + addFieldToConstantPool(codeline); } } - private void addMethod(CodeLine codeline) { + private void addMethodToConstantPool(CodeLine codeline) { compiledClass.addConstantPoolEntry(new MethodRefEntry(getOrCreateClassEntry(codeline), createMethodNameAndType(codeline))); } - private void addField(CodeLine codeline) { + private void addFieldToConstantPool(CodeLine codeline) { compiledClass.addConstantPoolEntry(new FieldRefEntry(getOrCreateClassEntry(codeline), createFieldNameAndType(codeline))); } @@ -72,9 +73,10 @@ public class Compiler { private ClassEntry getOrCreateClassEntry(CodeLine codeline) { if (codeline.getRef() == Ref.SUPER) { - return compiledClass.superClass(); + return compiledClass.addSuperClass(); + } else if (codeline.getRef() == Ref.THIS) { - return compiledClass.thisClass(); + return compiledClass.addThisClass(); } //TODO other cases throw new RuntimeException("shouldn't be here"); diff --git a/src/test/java/nl/sander/beejava/CompilerTests.java b/src/test/java/nl/sander/beejava/CompilerTests.java index dff6d77..30d9780 100644 --- a/src/test/java/nl/sander/beejava/CompilerTests.java +++ b/src/test/java/nl/sander/beejava/CompilerTests.java @@ -62,38 +62,4 @@ public class CompilerTests { Utf8Entry type = (Utf8Entry) child5; assertEquals("()V", type.getUtf8()); } - - private BeeClass createClassWithIntField() { - BeeField intField = BeeField.builder() - .withAccessFlags(FieldAccessFlag.PRIVATE) - .withType(int.class) - .withName("intField") - .build(); - - BeeParameter intValueParameter = BeeParameter.create(int.class, "intValue"); - - BeeConstructor constructor = BeeConstructor.builder() - .withAccessFlags(MethodAccessFlag.PUBLIC) - .withFormalParameters(intValueParameter) - .withCode( - line(0, LOAD, Ref.THIS), - line(1, INVOKE, Ref.SUPER, "", "()"), - line(2, LOAD, Ref.THIS), - line(3, LOAD, intValueParameter), - line(4, PUT, intField), - line(5, RETURN)) - .build(); - - return BeeClass.builder() - .withClassFileVersion(Version.V14) - .withPackage("nl.sander.beejava.test") - .withAccessFlags(PUBLIC) - .withSimpleName("IntBean") - .withSuperClass(Object.class) - .withFields(intField) - .withConstructors(constructor) - .build(); - } - - } diff --git a/src/test/java/nl/sander/beejava/TestData.java b/src/test/java/nl/sander/beejava/TestData.java index cb133cd..00c3a86 100644 --- a/src/test/java/nl/sander/beejava/TestData.java +++ b/src/test/java/nl/sander/beejava/TestData.java @@ -1,9 +1,7 @@ package nl.sander.beejava; -import nl.sander.beejava.api.BeeClass; -import nl.sander.beejava.api.BeeConstructor; -import nl.sander.beejava.api.Ref; -import nl.sander.beejava.api.Version; +import nl.sander.beejava.api.*; +import nl.sander.beejava.flags.FieldAccessFlag; import nl.sander.beejava.flags.MethodAccessFlag; import java.io.Serializable; @@ -20,7 +18,7 @@ public class TestData { .withAccessFlags(PUBLIC) .withSimpleName("EmptyBean") .withSuperClass(Object.class) // Not mandatory, like in java sourcecode - .withConstructors(getBeeConstructor()) // There's no default constructor in beejava. The user must always add them + .withConstructors(createConstructor()) // There's no default constructor in beejava. The user must always add them .build(); } @@ -32,18 +30,49 @@ public class TestData { .withSimpleName("EmptyBean") .withSuperClass(Object.class) // Not mandatory, like in java sourcecode .withInterfaces(Serializable.class) - .withConstructors(getBeeConstructor()) // There's no default constructor in beejava. The user must always add them + .withConstructors(createConstructor()) // There's no default constructor in beejava. The user must always add them .build(); } - private static BeeConstructor getBeeConstructor() { + public static BeeClass createClassWithIntField() { + BeeField intField = BeeField.builder() + .withAccessFlags(FieldAccessFlag.PRIVATE) + .withType(int.class) + .withName("intField") + .build(); + + BeeParameter intValueParameter = BeeParameter.create(int.class, "intValue"); + BeeConstructor constructor = BeeConstructor.builder() + .withAccessFlags(MethodAccessFlag.PUBLIC) + .withFormalParameters(intValueParameter) + .withCode( + line(0, LOAD, Ref.THIS), + line(1, INVOKE, Ref.SUPER, "", "()"), + line(2, LOAD, Ref.THIS), + line(3, LOAD, intValueParameter), + line(4, PUT, intField), + line(5, RETURN)) + .build(); + + return BeeClass.builder() + .withClassFileVersion(Version.V14) + .withPackage("nl.sander.beejava.test") + .withAccessFlags(PUBLIC) + .withSimpleName("IntBean") + .withSuperClass(Object.class) + .withFields(intField) + .withConstructors(constructor) + .build(); + } + + private static BeeConstructor createConstructor() { + return BeeConstructor.builder() .withAccessFlags(MethodAccessFlag.PUBLIC) .withCode( line(0, LOAD, Ref.THIS), line(1, INVOKE, Ref.SUPER, "", "()"), line(5, RETURN)) .build(); - return constructor; } }