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;
|
||||
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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<ConstantPoolEntry> 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<ConstantPoolEntry> 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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
package nl.sander.beejava;
|
||||
|
||||
import nl.sander.beejava.api.CodeLine;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
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;
|
||||
|
||||
|
|
@ -10,19 +10,19 @@ public class BeeClass {
|
|||
private final Version classFileVersion;
|
||||
private final BeePackage beePackage;
|
||||
private final Set<ClassAccessFlag> accessFlags = new HashSet<>();
|
||||
private final String name;
|
||||
private final String simpleName;
|
||||
private final Class<?> superClass;
|
||||
private final Set<Class<?>> interfaces = new HashSet<>();
|
||||
private final Set<BeeField> fields = new HashSet<>();
|
||||
private final Set<BeeConstructor> constructors = new HashSet<>();
|
||||
|
||||
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) {
|
||||
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<BeeConstructor> 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,14 +72,14 @@ public class BeeClass {
|
|||
}
|
||||
|
||||
public static class Builder {
|
||||
private Version version;
|
||||
private final Set<ClassAccessFlag> accessFlags = new HashSet<>();
|
||||
private final Set<Class<?>> interfaces = new HashSet<>();
|
||||
private final Set<BeeField> fields = new HashSet<>();
|
||||
private final Set<BeeConstructor> constructors = new HashSet<>();
|
||||
private Version version;
|
||||
private BeePackage beePackage;
|
||||
private Class<?> superClass = Object.class;
|
||||
private String name;
|
||||
private String simpleName;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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 java.util.*;
|
||||
|
||||
/**
|
||||
* Models a constructor
|
||||
*/
|
||||
public class BeeConstructor implements ContainsCode {
|
||||
private final Set<MethodAccessFlag> accessFlags = 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;
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package nl.sander.beejava;
|
||||
package nl.sander.beejava.api;
|
||||
|
||||
public enum Opcode {
|
||||
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
|
||||
*/
|
||||
public enum Ref {
|
||||
THIS,
|
||||
SUPER,
|
||||
CLASS
|
||||
SUPER
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package nl.sander.beejava;
|
||||
package nl.sander.beejava.api;
|
||||
|
||||
public enum Version {
|
||||
V1_0_2(45),
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<ConstantPoolEntry> 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)
|
||||
Loading…
Add table
Reference in a new issue