a mess
This commit is contained in:
@@ -32,22 +32,46 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
ObjectMap<Stype, Array<Stype>> componentDependencies = new ObjectMap<>();
|
ObjectMap<Stype, Array<Stype>> componentDependencies = new ObjectMap<>();
|
||||||
ObjectMap<Selement, Array<Stype>> defComponents = new ObjectMap<>();
|
ObjectMap<Selement, Array<Stype>> defComponents = new ObjectMap<>();
|
||||||
ObjectMap<Svar, String> varInitializers = new ObjectMap<>();
|
ObjectMap<Svar, String> varInitializers = new ObjectMap<>();
|
||||||
|
ObjectMap<Smethod, String> methodBlocks = new ObjectMap<>();
|
||||||
ObjectSet<String> imports = new ObjectSet<>();
|
ObjectSet<String> imports = new ObjectSet<>();
|
||||||
|
Array<Smethod> allGroups = new Array<>();
|
||||||
|
Array<Selement> allDefs = new Array<>();
|
||||||
|
Array<Stype> allInterfaces = new Array<>();
|
||||||
|
|
||||||
{
|
{
|
||||||
rounds = 2;
|
rounds = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(RoundEnvironment env) throws Exception{
|
public void process(RoundEnvironment env) throws Exception{
|
||||||
|
allGroups.addAll(methods(GroupDef.class));
|
||||||
|
allDefs.addAll(elements(EntityDef.class));
|
||||||
|
allInterfaces.addAll(types(EntityInterface.class));
|
||||||
|
|
||||||
//round 1: get component classes and generate interfaces for them
|
//round 1: generate component interfaces
|
||||||
if(round == 1){
|
if(round == 1){
|
||||||
baseComponents = types(BaseComponent.class);
|
baseComponents = types(BaseComponent.class);
|
||||||
Array<Smethod> allGroups = methods(GroupDef.class);
|
|
||||||
Array<Selement> allDefs = elements(EntityDef.class);
|
|
||||||
Array<Stype> allComponents = types(Component.class);
|
Array<Stype> allComponents = types(Component.class);
|
||||||
|
|
||||||
|
//store code
|
||||||
|
for(Stype component : allComponents){
|
||||||
|
for(Svar f : component.fields()){
|
||||||
|
VariableTree tree = f.tree();
|
||||||
|
|
||||||
|
//add initializer if it exists
|
||||||
|
if(tree.getInitializer() != null){
|
||||||
|
String init = tree.getInitializer().toString();
|
||||||
|
varInitializers.put(f, init);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Smethod elem : component.methods()){
|
||||||
|
if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE)) continue;
|
||||||
|
//get all statements in the method, store them
|
||||||
|
methodBlocks.put(elem, elem.tree().getBody().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//store components
|
//store components
|
||||||
for(Stype type : allComponents){
|
for(Stype type : allComponents){
|
||||||
componentNames.put(type.name(), type);
|
componentNames.put(type.name(), type);
|
||||||
@@ -58,13 +82,6 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
imports.addAll(getImports(comp.e));
|
imports.addAll(getImports(comp.e));
|
||||||
}
|
}
|
||||||
|
|
||||||
//parse groups
|
|
||||||
for(Smethod group : allGroups){
|
|
||||||
GroupDef an = group.annotation(GroupDef.class);
|
|
||||||
Array<Stype> types = types(an, GroupDef::value);
|
|
||||||
groupDefs.add(new GroupDefinition(group.name(), ClassName.bestGuess(packageName + "." + interfaceName(types.first())), types, an.spatial(), an.mapping()));
|
|
||||||
}
|
|
||||||
|
|
||||||
//create component interfaces
|
//create component interfaces
|
||||||
for(Stype component : allComponents){
|
for(Stype component : allComponents){
|
||||||
TypeSpec.Builder inter = TypeSpec.interfaceBuilder(interfaceName(component))
|
TypeSpec.Builder inter = TypeSpec.interfaceBuilder(interfaceName(component))
|
||||||
@@ -147,12 +164,23 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
.addModifiers(Modifier.PUBLIC).addAnnotation(EntityInterface.class);
|
.addModifiers(Modifier.PUBLIC).addAnnotation(EntityInterface.class);
|
||||||
inter.addMethod(MethodSpec.methodBuilder("draw" + Strings.capitalize(layer.name())).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).build());
|
inter.addMethod(MethodSpec.methodBuilder("draw" + Strings.capitalize(layer.name())).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).build());
|
||||||
write(inter);
|
write(inter);
|
||||||
|
}
|
||||||
|
}else if(round == 2){ //round 2: get component classes and generate interfaces for them
|
||||||
|
|
||||||
|
//parse groups
|
||||||
|
for(Smethod group : allGroups){
|
||||||
|
GroupDef an = group.annotation(GroupDef.class);
|
||||||
|
Array<Stype> types = types(an, GroupDef::value).map(this::interfaceToComp);;
|
||||||
|
groupDefs.add(new GroupDefinition(group.name(), ClassName.bestGuess(packageName + "." + interfaceName(types.first())), types, an.spatial(), an.mapping()));
|
||||||
|
}
|
||||||
|
|
||||||
|
//add special generated groups
|
||||||
|
for(DrawLayer layer : DrawLayer.values()){
|
||||||
|
String name = "DrawLayer" + Strings.capitalize(layer.name()) + "c";
|
||||||
//create group definition with no components directly
|
//create group definition with no components directly
|
||||||
GroupDefinition def = new GroupDefinition(layer.name(), ClassName.bestGuess(packageName + "." + name), Array.with(), false, false);
|
GroupDefinition def = new GroupDefinition(layer.name(), ClassName.bestGuess(packageName + "." + name), Array.with(), false, false);
|
||||||
//add manual inclusions of entities to be added to this group
|
//add manual inclusions of entities to be added to this group
|
||||||
def.manualInclusions.addAll(allDefs.select(s -> allComponents(s).contains(comp -> comp.interfaces().contains(in -> in.name().equals(name)))));
|
def.manualInclusions.addAll(allDefs.select(s -> allComponents(s).contains(comp -> comp.interfaces().contains(in -> in.name().equals(name)))));
|
||||||
|
|
||||||
groupDefs.add(def);
|
groupDefs.add(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +207,6 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
//write fields to the class; ignoring transient ones
|
//write fields to the class; ignoring transient ones
|
||||||
Array<Svar> fields = comp.fields().select(f -> !f.is(Modifier.TRANSIENT));
|
Array<Svar> fields = comp.fields().select(f -> !f.is(Modifier.TRANSIENT));
|
||||||
for(Svar f : fields){
|
for(Svar f : fields){
|
||||||
VariableTree tree = f.tree();
|
|
||||||
FieldSpec.Builder fbuilder = FieldSpec.builder(f.tname(), f.name());
|
FieldSpec.Builder fbuilder = FieldSpec.builder(f.tname(), f.name());
|
||||||
//keep statics/finals
|
//keep statics/finals
|
||||||
if(f.is(Modifier.STATIC)){
|
if(f.is(Modifier.STATIC)){
|
||||||
@@ -187,10 +214,8 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
if(f.is(Modifier.FINAL)) fbuilder.addModifiers(Modifier.FINAL);
|
if(f.is(Modifier.FINAL)) fbuilder.addModifiers(Modifier.FINAL);
|
||||||
}
|
}
|
||||||
//add initializer if it exists
|
//add initializer if it exists
|
||||||
if(tree.getInitializer() != null){
|
if(varInitializers.containsKey(f)){
|
||||||
String init = tree.getInitializer().toString();
|
fbuilder.initializer(varInitializers.get(f));
|
||||||
varInitializers.put(f, init);
|
|
||||||
fbuilder.initializer(init);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isFinal) fbuilder.addModifiers(Modifier.PROTECTED);
|
if(!isFinal) fbuilder.addModifiers(Modifier.PROTECTED);
|
||||||
@@ -235,12 +260,10 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(Smethod elem : entry.value){
|
for(Smethod elem : entry.value){
|
||||||
if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE)) continue;
|
if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE) || !methodBlocks.containsKey(elem)) continue;
|
||||||
|
|
||||||
//get all statements in the method, copy them over
|
//get all statements in the method, copy them over
|
||||||
MethodTree methodTree = elem.tree();
|
String str = methodBlocks.get(elem);
|
||||||
BlockTree blockTree = methodTree.getBody();
|
|
||||||
String str = blockTree.toString();
|
|
||||||
//name for code blocks in the methods
|
//name for code blocks in the methods
|
||||||
String blockName = elem.up().getSimpleName().toString().toLowerCase().replace("comp", "");
|
String blockName = elem.up().getSimpleName().toString().toLowerCase().replace("comp", "");
|
||||||
|
|
||||||
@@ -387,8 +410,7 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
|
|
||||||
write(idBuilder);
|
write(idBuilder);
|
||||||
}else{
|
}else{
|
||||||
//round 2: generate actual classes and implement interfaces
|
//round 3: generate actual classes and implement interfaces
|
||||||
Array<Stype> interfaces = types(EntityInterface.class);
|
|
||||||
|
|
||||||
//implement each definition
|
//implement each definition
|
||||||
for(EntityDefinition def : definitions){
|
for(EntityDefinition def : definitions){
|
||||||
@@ -397,7 +419,7 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
for(Stype comp : def.components){
|
for(Stype comp : def.components){
|
||||||
|
|
||||||
//implement the interface
|
//implement the interface
|
||||||
Stype inter = interfaces.find(i -> i.name().equals(interfaceName(comp)));
|
Stype inter = allInterfaces.find(i -> i.name().equals(interfaceName(comp)));
|
||||||
if(inter == null){
|
if(inter == null){
|
||||||
err("Failed to generate interface for", comp);
|
err("Failed to generate interface for", comp);
|
||||||
return;
|
return;
|
||||||
@@ -431,7 +453,7 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
TypeSpec.Builder nullsBuilder = TypeSpec.classBuilder("Nulls").addModifiers(Modifier.PUBLIC).addModifiers(Modifier.FINAL);
|
TypeSpec.Builder nullsBuilder = TypeSpec.classBuilder("Nulls").addModifiers(Modifier.PUBLIC).addModifiers(Modifier.FINAL);
|
||||||
|
|
||||||
//create mock types of all components
|
//create mock types of all components
|
||||||
for(Stype interf : interfaces){
|
for(Stype interf : allInterfaces){
|
||||||
//indirect interfaces to implement methods for
|
//indirect interfaces to implement methods for
|
||||||
Array<Stype> dependencies = interf.allInterfaces().and(interf);
|
Array<Stype> dependencies = interf.allInterfaces().and(interf);
|
||||||
Array<Smethod> methods = dependencies.flatMap(Stype::methods);
|
Array<Smethod> methods = dependencies.flatMap(Stype::methods);
|
||||||
@@ -502,7 +524,7 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
Array<Stype> allComponents(Selement<?> type){
|
Array<Stype> allComponents(Selement<?> type){
|
||||||
if(!defComponents.containsKey(type)){
|
if(!defComponents.containsKey(type)){
|
||||||
//get base defs
|
//get base defs
|
||||||
Array<Stype> components = types(type.annotation(EntityDef.class), EntityDef::value);
|
Array<Stype> components = types(type.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp);
|
||||||
ObjectSet<Stype> out = new ObjectSet<>();
|
ObjectSet<Stype> out = new ObjectSet<>();
|
||||||
for(Stype comp : components){
|
for(Stype comp : components){
|
||||||
//get dependencies for each def, add them
|
//get dependencies for each def, add them
|
||||||
@@ -553,7 +575,7 @@ public class EntityProcess extends BaseProcessor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
String createName(Selement<?> elem){
|
String createName(Selement<?> elem){
|
||||||
Array<Stype> comps = types(elem.annotation(EntityDef.class), EntityDef::value);
|
Array<Stype> comps = types(elem.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp);;
|
||||||
comps.sortComparing(Selement::name);
|
comps.sortComparing(Selement::name);
|
||||||
return comps.toString("", s -> s.name().replace("Comp", "")) + "Entity";
|
return comps.toString("", s -> s.name().replace("Comp", "")) + "Entity";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,287 @@
|
|||||||
|
package mindustry.annotations.util;
|
||||||
|
|
||||||
|
import com.sun.tools.javac.code.*;
|
||||||
|
import com.sun.tools.javac.code.Attribute.Array;
|
||||||
|
import com.sun.tools.javac.code.Attribute.Enum;
|
||||||
|
import com.sun.tools.javac.code.Attribute.Error;
|
||||||
|
import com.sun.tools.javac.code.Attribute.Visitor;
|
||||||
|
import com.sun.tools.javac.code.Attribute.*;
|
||||||
|
import com.sun.tools.javac.code.Type;
|
||||||
|
import com.sun.tools.javac.code.Symbol.*;
|
||||||
|
import com.sun.tools.javac.code.Type.ArrayType;
|
||||||
|
import com.sun.tools.javac.util.List;
|
||||||
|
import com.sun.tools.javac.util.*;
|
||||||
|
import sun.reflect.annotation.*;
|
||||||
|
|
||||||
|
import javax.lang.model.type.*;
|
||||||
|
import java.io.*;
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.Map.*;
|
||||||
|
import java.lang.Class;
|
||||||
|
|
||||||
|
//replaces the standard Java AnnotationProxyMaker with one that doesn't crash
|
||||||
|
//thanks, oracle.
|
||||||
|
@SuppressWarnings({"sunapi", "unchecked"})
|
||||||
|
public class AnnotationProxyMaker{
|
||||||
|
private final Compound anno;
|
||||||
|
private final Class<? extends Annotation> annoType;
|
||||||
|
|
||||||
|
private AnnotationProxyMaker(Compound var1, Class<? extends Annotation> var2){
|
||||||
|
this.anno = var1;
|
||||||
|
this.annoType = var2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <A extends Annotation> A generateAnnotation(Compound var0, Class<A> var1){
|
||||||
|
AnnotationProxyMaker var2 = new AnnotationProxyMaker(var0, var1);
|
||||||
|
return (A)var1.cast(var2.generateAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Annotation generateAnnotation(){
|
||||||
|
return AnnotationParser.annotationForMap(this.annoType, this.getAllReflectedValues());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Object> getAllReflectedValues(){
|
||||||
|
LinkedHashMap var1 = new LinkedHashMap();
|
||||||
|
Iterator var2 = this.getAllValues().entrySet().iterator();
|
||||||
|
|
||||||
|
while(var2.hasNext()){
|
||||||
|
Entry var3 = (Entry)var2.next();
|
||||||
|
MethodSymbol var4 = (MethodSymbol)var3.getKey();
|
||||||
|
Object var5 = this.generateValue(var4, (Attribute)var3.getValue());
|
||||||
|
if(var5 != null){
|
||||||
|
var1.put(var4.name.toString(), var5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return var1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<MethodSymbol, Attribute> getAllValues(){
|
||||||
|
LinkedHashMap var1 = new LinkedHashMap();
|
||||||
|
ClassSymbol var2 = (ClassSymbol)this.anno.type.tsym;
|
||||||
|
|
||||||
|
for(com.sun.tools.javac.code.Scope.Entry var3 = var2.members().elems; var3 != null; var3 = var3.sibling){
|
||||||
|
if(var3.sym.kind == 16){
|
||||||
|
MethodSymbol var4 = (MethodSymbol)var3.sym;
|
||||||
|
Attribute var5 = var4.getDefaultValue();
|
||||||
|
if(var5 != null){
|
||||||
|
var1.put(var4, var5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator var6 = this.anno.values.iterator();
|
||||||
|
|
||||||
|
while(var6.hasNext()){
|
||||||
|
Pair var7 = (Pair)var6.next();
|
||||||
|
var1.put(var7.fst, var7.snd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return var1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object generateValue(MethodSymbol var1, Attribute var2){
|
||||||
|
AnnotationProxyMaker.ValueVisitor var3 = new AnnotationProxyMaker.ValueVisitor(var1);
|
||||||
|
return var3.getValue(var2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class MirroredTypesExceptionProxy extends ExceptionProxy{
|
||||||
|
static final long serialVersionUID = 269L;
|
||||||
|
private transient List<TypeMirror> types;
|
||||||
|
private final String typeStrings;
|
||||||
|
|
||||||
|
MirroredTypesExceptionProxy(List<TypeMirror> var1){
|
||||||
|
this.types = var1;
|
||||||
|
this.typeStrings = var1.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return this.typeStrings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode(){
|
||||||
|
return (this.types != null ? this.types : this.typeStrings).hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object var1){
|
||||||
|
return this.types != null && var1 instanceof AnnotationProxyMaker.MirroredTypesExceptionProxy && this.types.equals(((AnnotationProxyMaker.MirroredTypesExceptionProxy)var1).types);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RuntimeException generateException(){
|
||||||
|
return new MirroredTypesException(this.types);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException{
|
||||||
|
var1.defaultReadObject();
|
||||||
|
this.types = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class MirroredTypeExceptionProxy extends ExceptionProxy{
|
||||||
|
static final long serialVersionUID = 269L;
|
||||||
|
private transient TypeMirror type;
|
||||||
|
private final String typeString;
|
||||||
|
|
||||||
|
MirroredTypeExceptionProxy(TypeMirror var1){
|
||||||
|
this.type = var1;
|
||||||
|
this.typeString = var1.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return this.typeString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode(){
|
||||||
|
return (this.type != null ? this.type : this.typeString).hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object var1){
|
||||||
|
return this.type != null && var1 instanceof AnnotationProxyMaker.MirroredTypeExceptionProxy && this.type.equals(((AnnotationProxyMaker.MirroredTypeExceptionProxy)var1).type);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RuntimeException generateException(){
|
||||||
|
return new MirroredTypeException(this.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException{
|
||||||
|
var1.defaultReadObject();
|
||||||
|
this.type = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ValueVisitor implements Visitor{
|
||||||
|
private MethodSymbol meth;
|
||||||
|
private Class<?> returnClass;
|
||||||
|
private Object value;
|
||||||
|
|
||||||
|
ValueVisitor(MethodSymbol var2){
|
||||||
|
this.meth = var2;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object getValue(Attribute var1){
|
||||||
|
Method var2;
|
||||||
|
try{
|
||||||
|
var2 = AnnotationProxyMaker.this.annoType.getMethod(this.meth.name.toString());
|
||||||
|
}catch(NoSuchMethodException var4){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.returnClass = var2.getReturnType();
|
||||||
|
var1.accept(this);
|
||||||
|
if(!(this.value instanceof ExceptionProxy) && !AnnotationType.invocationHandlerReturnType(this.returnClass).isInstance(this.value)){
|
||||||
|
this.typeMismatch(var2, var1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitConstant(Constant var1){
|
||||||
|
this.value = var1.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitClass(com.sun.tools.javac.code.Attribute.Class var1){
|
||||||
|
this.value = new AnnotationProxyMaker.MirroredTypeExceptionProxy(var1.classType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitArray(Array var1){
|
||||||
|
Name var2 = ((ArrayType)var1.type).elemtype.tsym.getQualifiedName();
|
||||||
|
int var6;
|
||||||
|
if(var2.equals(var2.table.names.java_lang_Class)){
|
||||||
|
ListBuffer var14 = new ListBuffer();
|
||||||
|
Attribute[] var15 = var1.values;
|
||||||
|
int var16 = var15.length;
|
||||||
|
|
||||||
|
for(var6 = 0; var6 < var16; ++var6){
|
||||||
|
Attribute var7 = var15[var6];
|
||||||
|
Type var8 = var7 instanceof UnresolvedClass ? ((UnresolvedClass)var7).classType : ((com.sun.tools.javac.code.Attribute.Class)var7).classType;
|
||||||
|
var14.append(var8);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.value = new AnnotationProxyMaker.MirroredTypesExceptionProxy(var14.toList());
|
||||||
|
}else{
|
||||||
|
int var3 = var1.values.length;
|
||||||
|
Class var4 = this.returnClass;
|
||||||
|
this.returnClass = this.returnClass.getComponentType();
|
||||||
|
|
||||||
|
try{
|
||||||
|
Object var5 = java.lang.reflect.Array.newInstance(this.returnClass, var3);
|
||||||
|
|
||||||
|
for(var6 = 0; var6 < var3; ++var6){
|
||||||
|
var1.values[var6].accept(this);
|
||||||
|
if(this.value == null || this.value instanceof ExceptionProxy){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
java.lang.reflect.Array.set(var5, var6, this.value);
|
||||||
|
}catch(IllegalArgumentException var12){
|
||||||
|
this.value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.value = var5;
|
||||||
|
}finally{
|
||||||
|
this.returnClass = var4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitEnum(Enum var1){
|
||||||
|
if(this.returnClass.isEnum()){
|
||||||
|
String var2 = var1.value.toString();
|
||||||
|
|
||||||
|
try{
|
||||||
|
this.value = java.lang.Enum.valueOf((Class)this.returnClass, var2);
|
||||||
|
}catch(IllegalArgumentException var4){
|
||||||
|
this.value = new EnumConstantNotPresentExceptionProxy((Class)this.returnClass, var2);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.value = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitCompound(Compound var1){
|
||||||
|
try{
|
||||||
|
Class var2 = this.returnClass.asSubclass(Annotation.class);
|
||||||
|
this.value = AnnotationProxyMaker.generateAnnotation(var1, var2);
|
||||||
|
}catch(ClassCastException var3){
|
||||||
|
this.value = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void visitError(Error var1){
|
||||||
|
if(var1 instanceof UnresolvedClass){
|
||||||
|
this.value = new AnnotationProxyMaker.MirroredTypeExceptionProxy(((UnresolvedClass)var1).classType);
|
||||||
|
}else{
|
||||||
|
this.value = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void typeMismatch(Method var1, final Attribute var2){
|
||||||
|
class AnnotationTypeMismatchExceptionProxy extends ExceptionProxy{
|
||||||
|
static final long serialVersionUID = 269L;
|
||||||
|
final transient Method method;
|
||||||
|
|
||||||
|
AnnotationTypeMismatchExceptionProxy(Method var2x){
|
||||||
|
this.method = var2x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return "<error>";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RuntimeException generateException(){
|
||||||
|
return new AnnotationTypeMismatchException(this.method, var2.type.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.value = new AnnotationTypeMismatchExceptionProxy(var1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
package mindustry.annotations.util;
|
package mindustry.annotations.util;
|
||||||
|
|
||||||
import arc.struct.*;
|
import arc.struct.Array;
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
|
import com.sun.tools.javac.code.Attribute.*;
|
||||||
import mindustry.annotations.*;
|
import mindustry.annotations.*;
|
||||||
|
|
||||||
import javax.lang.model.element.*;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.type.*;
|
import javax.lang.model.type.*;
|
||||||
|
import java.lang.Class;
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
|
||||||
public class Selement<T extends Element>{
|
public class Selement<T extends Element>{
|
||||||
public final T e;
|
public final T e;
|
||||||
@@ -48,11 +51,18 @@ public class Selement<T extends Element>{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <A extends Annotation> A annotation(Class<A> annotation){
|
public <A extends Annotation> A annotation(Class<A> annotation){
|
||||||
return e.getAnnotation(annotation);
|
try{
|
||||||
|
Method m = com.sun.tools.javac.code.AnnoConstruct.class.getDeclaredMethod("getAttribute", Class.class);
|
||||||
|
m.setAccessible(true);
|
||||||
|
Compound compound = (Compound)m.invoke(e, annotation);
|
||||||
|
return compound == null ? null : AnnotationProxyMaker.generateAnnotation(compound, annotation);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public <A extends Annotation> boolean has(Class<A> annotation){
|
public <A extends Annotation> boolean has(Class<A> annotation){
|
||||||
return e.getAnnotation(annotation) != null;
|
return annotation(annotation) != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Element up(){
|
public Element up(){
|
||||||
|
|||||||
@@ -163,6 +163,9 @@ allprojects{
|
|||||||
project(":desktop"){
|
project(":desktop"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
|
compileJava.options.fork = true
|
||||||
|
compileJava.options.compilerArgs += ["-XDignore.symbol.file"]
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
|
|
||||||
|
|||||||
@@ -1,48 +1,49 @@
|
|||||||
package mindustry.entities.def;
|
package mindustry.entities.def;
|
||||||
|
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
|
import mindustry.gen.*;
|
||||||
|
|
||||||
class AllEntities{
|
class AllEntities{
|
||||||
|
|
||||||
@EntityDef(value = {BulletComp.class, VelComp.class, TimedComp.class}, pooled = true)
|
@EntityDef(value = {Bulletc.class, Velc.class, Timedc.class}, pooled = true)
|
||||||
class BulletDef{}
|
class BulletDef{}
|
||||||
|
|
||||||
@EntityDef(value = {TileComp.class}, isFinal = false)
|
@EntityDef(value = {Tilec.class}, isFinal = false)
|
||||||
class TileDef{}
|
class TileDef{}
|
||||||
|
|
||||||
@EntityDef(value = {EffectComp.class}, pooled = true)
|
@EntityDef(value = {Effectc.class}, pooled = true)
|
||||||
class EffectDef{}
|
class EffectDef{}
|
||||||
|
|
||||||
@EntityDef({DecalComp.class})
|
@EntityDef({Decalc.class})
|
||||||
class DecalDef{}
|
class DecalDef{}
|
||||||
|
|
||||||
@EntityDef({PlayerComp.class})
|
@EntityDef({Playerc.class})
|
||||||
class PlayerDef{}
|
class PlayerDef{}
|
||||||
|
|
||||||
@EntityDef({UnitComp.class})
|
@EntityDef({Unitc.class})
|
||||||
class GenericUnitDef{}
|
class GenericUnitDef{}
|
||||||
|
|
||||||
@GroupDef(EntityComp.class)
|
@GroupDef(Entityc.class)
|
||||||
void all(){
|
void all(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GroupDef(PlayerComp.class)
|
@GroupDef(Playerc.class)
|
||||||
void player(){
|
void player(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GroupDef(value = UnitComp.class, spatial = true)
|
@GroupDef(value = Unitc.class, spatial = true)
|
||||||
void unit(){
|
void unit(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GroupDef(TileComp.class)
|
@GroupDef(Tilec.class)
|
||||||
void tile(){
|
void tile(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GroupDef(SyncComp.class)
|
@GroupDef(Syncc.class)
|
||||||
void sync(){
|
void sync(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user