Moved some stuff around, removed obsolete code, added comments and javadoc

This commit is contained in:
Sander Hautvast 2020-11-09 10:24:10 +01:00
parent 9aad0e55c6
commit 61ca5f9a11
15 changed files with 84 additions and 68 deletions

View file

@ -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;

View file

@ -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");
}

View file

@ -1,5 +1,7 @@
package nl.sander.beejava;
import nl.sander.beejava.api.CodeLine;
import java.util.List;
public interface ContainsCode {

View file

@ -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();
}
}

View file

@ -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,20 +72,20 @@ 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() {
}
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);
}

View file

@ -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<MethodAccessFlag> accessFlags = new HashSet<>();
private final Set<BeeParameter> formalParameters = new HashSet<>();
private final List<CodeLine> code = new LinkedList<>();

View file

@ -1,4 +1,4 @@
package nl.sander.beejava;
package nl.sander.beejava.api;
import nl.sander.beejava.flags.FieldAccessFlag;

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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;
}

View file

@ -1,4 +1,4 @@
package nl.sander.beejava;
package nl.sander.beejava.api;
public enum Opcode {
LOAD("load"),

View file

@ -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
}

View file

@ -1,4 +1,4 @@
package nl.sander.beejava;
package nl.sander.beejava.api;
public enum Version {
V1_0_2(45),

View file

@ -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();

View file

@ -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)