Moved some stuff around, removed obsolete code, added comments and javadoc
This commit is contained in:
parent
9aad0e55c6
commit
61ca5f9a11
15 changed files with 84 additions and 68 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava;
|
||||||
|
|
||||||
|
import nl.sander.beejava.api.BeeClass;
|
||||||
import nl.sander.beejava.constantpool.ConstantPool;
|
import nl.sander.beejava.constantpool.ConstantPool;
|
||||||
import nl.sander.beejava.constantpool.entry.ConstantPoolEntry;
|
import nl.sander.beejava.constantpool.entry.ConstantPoolEntry;
|
||||||
import nl.sander.beejava.util.ByteBuf;
|
import nl.sander.beejava.util.ByteBuf;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
package nl.sander.beejava;
|
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 nl.sander.beejava.constantpool.entry.*;
|
||||||
|
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
|
@ -18,6 +21,13 @@ public class ConstantTreeCreator {
|
||||||
private final Set<ConstantPoolEntry> constantTree = new LinkedHashSet<>();
|
private final Set<ConstantPoolEntry> constantTree = new LinkedHashSet<>();
|
||||||
private BeeClass beeClass;
|
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<ConstantPoolEntry> createConstantTree(BeeClass beeClass) {
|
public Set<ConstantPoolEntry> createConstantTree(BeeClass beeClass) {
|
||||||
constantTree.clear();
|
constantTree.clear();
|
||||||
this.beeClass = beeClass;
|
this.beeClass = beeClass;
|
||||||
|
|
@ -31,22 +41,24 @@ public class ConstantTreeCreator {
|
||||||
codeContainer.getCode().forEach(this::updateConstantTree);
|
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) {
|
private void updateConstantTree(CodeLine codeline) {
|
||||||
if (codeline.hasMethod()){
|
if (codeline.hasMethod()){
|
||||||
addMethodRef(codeline);
|
addMethod(codeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (codeline.hasField()) {
|
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)));
|
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)));
|
constantTree.add(new FieldRefEntry(createClassName(codeline), createFieldNameAndType(codeline)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -66,7 +78,7 @@ public class ConstantTreeCreator {
|
||||||
if (codeline.getRef() == Ref.SUPER) {
|
if (codeline.getRef() == Ref.SUPER) {
|
||||||
return beeClass.getSuperClass().getName();
|
return beeClass.getSuperClass().getName();
|
||||||
} else if (codeline.getRef() == Ref.THIS) {
|
} else if (codeline.getRef() == Ref.THIS) {
|
||||||
return beeClass.getPackage() + "." + beeClass.getName();
|
return beeClass.getName();
|
||||||
}
|
}
|
||||||
throw new RuntimeException("shouldn't be here");
|
throw new RuntimeException("shouldn't be here");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava;
|
||||||
|
|
||||||
|
import nl.sander.beejava.api.CodeLine;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface ContainsCode {
|
public interface ContainsCode {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
import nl.sander.beejava.flags.ClassAccessFlag;
|
import nl.sander.beejava.flags.ClassAccessFlag;
|
||||||
|
|
||||||
|
|
@ -10,19 +10,19 @@ public class BeeClass {
|
||||||
private final Version classFileVersion;
|
private final Version classFileVersion;
|
||||||
private final BeePackage beePackage;
|
private final BeePackage beePackage;
|
||||||
private final Set<ClassAccessFlag> accessFlags = new HashSet<>();
|
private final Set<ClassAccessFlag> accessFlags = new HashSet<>();
|
||||||
private final String name;
|
private final String simpleName;
|
||||||
private final Class<?> superClass;
|
private final Class<?> superClass;
|
||||||
private final Set<Class<?>> interfaces = new HashSet<>();
|
private final Set<Class<?>> interfaces = new HashSet<>();
|
||||||
private final Set<BeeField> fields = new HashSet<>();
|
private final Set<BeeField> fields = new HashSet<>();
|
||||||
private final Set<BeeConstructor> constructors = new HashSet<>();
|
private final Set<BeeConstructor> constructors = new HashSet<>();
|
||||||
|
|
||||||
private BeeClass(Version classFileVersion,
|
private BeeClass(Version classFileVersion,
|
||||||
BeePackage beePackage, Set<ClassAccessFlag> accessFlags, String name, Class<?> superClass,
|
BeePackage beePackage, Set<ClassAccessFlag> accessFlags, String simpleName, Class<?> superClass,
|
||||||
Set<Class<?>> interfaces, Set<BeeField> fields, Set<BeeConstructor> constructors) {
|
Set<Class<?>> interfaces, Set<BeeField> fields, Set<BeeConstructor> constructors) {
|
||||||
this.classFileVersion = classFileVersion;
|
this.classFileVersion = classFileVersion;
|
||||||
this.beePackage = beePackage;
|
this.beePackage = beePackage;
|
||||||
this.accessFlags.addAll(accessFlags);
|
this.accessFlags.addAll(accessFlags);
|
||||||
this.name = name;
|
this.simpleName = simpleName;
|
||||||
this.superClass = superClass;
|
this.superClass = superClass;
|
||||||
this.interfaces.addAll(interfaces);
|
this.interfaces.addAll(interfaces);
|
||||||
this.fields.addAll(fields);
|
this.fields.addAll(fields);
|
||||||
|
|
@ -41,8 +41,11 @@ public class BeeClass {
|
||||||
return beePackage;
|
return beePackage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
/**
|
||||||
return name;
|
* returns the unqualified name, like java.lang.Class
|
||||||
|
*/
|
||||||
|
public String getSimpleName() {
|
||||||
|
return simpleName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<BeeConstructor> getConstructors() {
|
public Set<BeeConstructor> getConstructors() {
|
||||||
|
|
@ -53,6 +56,13 @@ public class BeeClass {
|
||||||
return accessFlags;
|
return accessFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the full name, like java.lang.Class
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return beePackage.getName() + "." + simpleName;
|
||||||
|
}
|
||||||
|
|
||||||
public Class<?> getSuperClass() {
|
public Class<?> getSuperClass() {
|
||||||
return superClass;
|
return superClass;
|
||||||
}
|
}
|
||||||
|
|
@ -62,14 +72,14 @@ public class BeeClass {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
private Version version;
|
|
||||||
private final Set<ClassAccessFlag> accessFlags = new HashSet<>();
|
private final Set<ClassAccessFlag> accessFlags = new HashSet<>();
|
||||||
private final Set<Class<?>> interfaces = new HashSet<>();
|
private final Set<Class<?>> interfaces = new HashSet<>();
|
||||||
private final Set<BeeField> fields = new HashSet<>();
|
private final Set<BeeField> fields = new HashSet<>();
|
||||||
private final Set<BeeConstructor> constructors = new HashSet<>();
|
private final Set<BeeConstructor> constructors = new HashSet<>();
|
||||||
|
private Version version;
|
||||||
private BeePackage beePackage;
|
private BeePackage beePackage;
|
||||||
private Class<?> superClass = Object.class;
|
private Class<?> superClass = Object.class;
|
||||||
private String name;
|
private String simpleName;
|
||||||
|
|
||||||
private Builder() {
|
private Builder() {
|
||||||
}
|
}
|
||||||
|
|
@ -89,8 +99,8 @@ public class BeeClass {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BeeClass.Builder withName(String name) {
|
public BeeClass.Builder withSimpleName(String simpleName) {
|
||||||
this.name = name;
|
this.simpleName = simpleName;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -115,7 +125,7 @@ public class BeeClass {
|
||||||
}
|
}
|
||||||
|
|
||||||
public BeeClass build() {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,9 +1,13 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
|
import nl.sander.beejava.ContainsCode;
|
||||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Models a constructor
|
||||||
|
*/
|
||||||
public class BeeConstructor implements ContainsCode {
|
public class BeeConstructor implements ContainsCode {
|
||||||
private final Set<MethodAccessFlag> accessFlags = new HashSet<>();
|
private final Set<MethodAccessFlag> accessFlags = new HashSet<>();
|
||||||
private final Set<BeeParameter> formalParameters = new HashSet<>();
|
private final Set<BeeParameter> formalParameters = new HashSet<>();
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
class BeePackage {
|
class BeePackage {
|
||||||
|
|
||||||
|
|
@ -7,4 +7,8 @@ class BeePackage {
|
||||||
BeePackage(String name) {
|
BeePackage(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Models a formal parameter in a method declaration.
|
||||||
|
*/
|
||||||
public class BeeParameter {
|
public class BeeParameter {
|
||||||
private final Class<?> type;
|
private final Class<?> type;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
|
|
||||||
class CodeLine {
|
public class CodeLine {
|
||||||
private final int linenumber;
|
private final int linenumber;
|
||||||
private final Opcode opcode;
|
private final Opcode opcode;
|
||||||
private Ref ref;
|
private Ref ref;
|
||||||
|
|
@ -78,28 +78,27 @@ class CodeLine {
|
||||||
return methodName;
|
return methodName;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hasMethod() {
|
public boolean hasMethod() {
|
||||||
return methodName != null;
|
return methodName != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getMethodSignature() {
|
public String getMethodSignature() {
|
||||||
return inputSignature + outputSignature;
|
return inputSignature + outputSignature;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref getRef() {
|
public Ref getRef() {
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasField() {
|
||||||
boolean hasField() {
|
|
||||||
return field != null;
|
return field != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
BeeField getField() {
|
public BeeField getField() {
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
|
|
||||||
BeeParameter getParameter() {
|
public BeeParameter getParameter() {
|
||||||
return parameter;
|
return parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
public enum Opcode {
|
public enum Opcode {
|
||||||
LOAD("load"),
|
LOAD("load"),
|
||||||
|
|
@ -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
|
* used to indicate this, super, or none of those, in which case it's class
|
||||||
*/
|
*/
|
||||||
public enum Ref {
|
public enum Ref {
|
||||||
THIS,
|
THIS,
|
||||||
SUPER,
|
SUPER
|
||||||
CLASS
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava.api;
|
||||||
|
|
||||||
public enum Version {
|
public enum Version {
|
||||||
V1_0_2(45),
|
V1_0_2(45),
|
||||||
|
|
@ -2,6 +2,7 @@ package nl.sander.beejava.flags;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
// TODO all access flags can be moved together
|
||||||
public interface AccessFlag {
|
public interface AccessFlag {
|
||||||
|
|
||||||
int getBytecode();
|
int getBytecode();
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package nl.sander.beejava;
|
package nl.sander.beejava;
|
||||||
|
|
||||||
|
import nl.sander.beejava.api.*;
|
||||||
import nl.sander.beejava.constantpool.entry.*;
|
import nl.sander.beejava.constantpool.entry.*;
|
||||||
import nl.sander.beejava.flags.FieldAccessFlag;
|
import nl.sander.beejava.flags.FieldAccessFlag;
|
||||||
import nl.sander.beejava.flags.MethodAccessFlag;
|
import nl.sander.beejava.flags.MethodAccessFlag;
|
||||||
|
|
@ -8,13 +9,15 @@ import org.junit.jupiter.api.Test;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static nl.sander.beejava.CodeLine.line;
|
import static nl.sander.beejava.api.CodeLine.line;
|
||||||
import static nl.sander.beejava.Opcode.*;
|
import static nl.sander.beejava.api.Opcode.*;
|
||||||
import static nl.sander.beejava.flags.ClassAccessFlag.PUBLIC;
|
import static nl.sander.beejava.flags.ClassAccessFlag.PUBLIC;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
public class ConstantTeeTests {
|
public class ConstantTreeCreatorTests {
|
||||||
@Test
|
|
||||||
|
// creates simplest class possible and checks the tree, that the ConstantTreeCreator emits
|
||||||
|
@Test // This is not a maintainable test
|
||||||
public void testMethodRefEntryForSuperConstructor() {
|
public void testMethodRefEntryForSuperConstructor() {
|
||||||
BeeClass classWithIntField = createEmptyClass();
|
BeeClass classWithIntField = createEmptyClass();
|
||||||
Set<ConstantPoolEntry> constantTree = new ConstantTreeCreator().createConstantTree(classWithIntField);
|
Set<ConstantPoolEntry> constantTree = new ConstantTreeCreator().createConstantTree(classWithIntField);
|
||||||
|
|
@ -72,9 +75,9 @@ public class ConstantTeeTests {
|
||||||
.withClassFileVersion(Version.V14)
|
.withClassFileVersion(Version.V14)
|
||||||
.withPackage("nl.sander.beejava.test")
|
.withPackage("nl.sander.beejava.test")
|
||||||
.withAccessFlags(PUBLIC)
|
.withAccessFlags(PUBLIC)
|
||||||
.withName("EmptyBean")
|
.withSimpleName("EmptyBean")
|
||||||
.withSuperClass(Object.class)
|
.withSuperClass(Object.class) // Not mandatory, like in java sourcecode
|
||||||
.withConstructors(constructor)
|
.withConstructors(constructor) // There's no default constructor in beejava. The user must always add them
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,7 +106,7 @@ public class ConstantTeeTests {
|
||||||
.withClassFileVersion(Version.V14)
|
.withClassFileVersion(Version.V14)
|
||||||
.withPackage("nl.sander.beejava.test")
|
.withPackage("nl.sander.beejava.test")
|
||||||
.withAccessFlags(PUBLIC)
|
.withAccessFlags(PUBLIC)
|
||||||
.withName("IntBean")
|
.withSimpleName("IntBean")
|
||||||
.withSuperClass(Object.class)
|
.withSuperClass(Object.class)
|
||||||
.withFields(intField)
|
.withFields(intField)
|
||||||
.withConstructors(constructor)
|
.withConstructors(constructor)
|
||||||
Loading…
Add table
Reference in a new issue