From 65857d77c4571383c0392780c9fa93df90c60ddd Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Feb 2020 20:43:29 -0500 Subject: [PATCH] .... --- .../mindustry/annotations/BaseProcessor.java | 17 ++++++ .../annotations/impl/EntityProcess.java | 55 +++++++++++++------ .../mindustry/annotations/util/Selement.java | 4 +- .../mindustry/annotations/util/Smethod.java | 11 ++++ .../mindustry/annotations/util/Stype.java | 9 +++ gradle.properties | 2 +- 6 files changed, 77 insertions(+), 21 deletions(-) diff --git a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java index 189075bccf..7e149036f0 100644 --- a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java @@ -44,6 +44,23 @@ public abstract class BaseProcessor extends AbstractProcessor{ || type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char"); } + public static String getDefault(String value){ + switch(value){ + case "float": + case "double": + case "int": + case "long": + case "short": + case "char": + case "byte": + return "0"; + case "boolean": + return "false"; + default: + return "null"; + } + } + public static String simpleName(String str){ return str.contains(".") ? str.substring(str.lastIndexOf('.') + 1) : str; } diff --git a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java index 8af36efafc..3b6bc8eb94 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java @@ -335,24 +335,6 @@ public class EntityProcess extends BaseProcessor{ idBuilder.addStaticBlock(idStore.build()); - //create mock types of all components - for(Stype component : allComponents){ - - - Array dependencies = getDependencies(component); - Array out = new Array<>(); - out.add(component); - out.addAll(component.superclasses()); - dependencies.each(dep -> { - out.add(dep); - out.addAll(dep.superclasses()); - }); - - out.distinct(); - - Log.info("Dependencies of {0}:\n{1}\n\n", component, out.toString("\n", s -> "&lb> " + s)); - } - write(idBuilder); }else{ //round 2: generate actual classes and implement interfaces @@ -394,6 +376,43 @@ public class EntityProcess extends BaseProcessor{ write(def.builder, imports.asArray()); } + + //create mock types of all components + for(Stype interf : interfaces){ + Array dependencies = interf.allInterfaces(); + dependencies.add(interf); + Log.info(interf + ": sub " + interf.allSuperclasses() + " " + interf.allInterfaces()); + + Array methods = dependencies.flatMap(Stype::methods); + methods.sort(Structs.comparing(Object::toString)); + + ObjectSet signatures = new ObjectSet<>(); + + TypeSpec.Builder nullBuilder = TypeSpec.classBuilder("Null" + interf.name().substring(0, interf.name().length() - 1)) + .addModifiers(Modifier.PUBLIC, Modifier.FINAL); + + nullBuilder.addSuperinterface(interf.tname()); + + for(Smethod method : methods){ + String signature = method.toString(); + if(signatures.contains(signature)) continue; + + Stype type = method.type(); + MethodSpec.Builder builder = MethodSpec.overriding(method.e).addModifiers(Modifier.PUBLIC, Modifier.FINAL); + + if(!method.isVoid()){ + builder.addStatement("return " + getDefault(method.ret().toString())); + } + + nullBuilder.addMethod(builder.build()); + + signatures.add(signature); + } + + //write(nullBuilder); + + Log.info("Methods to override for {0}:\n{1}\n\n", interf, methods.toString("\n", s -> "&lg> &lb" + s)); + } } } diff --git a/annotations/src/main/java/mindustry/annotations/util/Selement.java b/annotations/src/main/java/mindustry/annotations/util/Selement.java index 12bf900c21..0c752c3521 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Selement.java +++ b/annotations/src/main/java/mindustry/annotations/util/Selement.java @@ -54,11 +54,11 @@ public class Selement{ @Override public int hashCode(){ - return toString().hashCode(); + return e.hashCode(); } @Override public boolean equals(Object o){ - return o != null && toString().equals(o.toString()); + return o != null && o.getClass() == getClass() && e == ((Selement)o).e; } } diff --git a/annotations/src/main/java/mindustry/annotations/util/Smethod.java b/annotations/src/main/java/mindustry/annotations/util/Smethod.java index b8f9f22d8a..9eedb5bb7e 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Smethod.java +++ b/annotations/src/main/java/mindustry/annotations/util/Smethod.java @@ -14,10 +14,21 @@ public class Smethod extends Selement{ super(executableElement); } + public boolean isAny(Modifier... mod){ + for(Modifier m : mod){ + if(is(m)) return true; + } + return false; + } + public boolean is(Modifier mod){ return e.getModifiers().contains(mod); } + public Stype type(){ + return new Stype((TypeElement)up()); + } + public Array thrown(){ return Array.with(e.getThrownTypes()).as(TypeMirror.class); } diff --git a/annotations/src/main/java/mindustry/annotations/util/Stype.java b/annotations/src/main/java/mindustry/annotations/util/Stype.java index 0fc9672661..4c7202a9d7 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Stype.java +++ b/annotations/src/main/java/mindustry/annotations/util/Stype.java @@ -24,10 +24,19 @@ public class Stype extends Selement{ return Array.with(e.getInterfaces()).map(Stype::of); } + public Array allInterfaces(){ + return interfaces().flatMap(Stype::allInterfaces).distinct(); + } + public Array superclasses(){ return Array.with(BaseProcessor.typeu.directSupertypes(mirror())).map(Stype::of); } + public Array allSuperclasses(){ + //this is truly PEAK efficiency + return superclasses().flatMap(Stype::allSuperclasses).distinct(); + } + public Stype superclass(){ return new Stype((TypeElement)BaseProcessor.typeu.asElement(BaseProcessor.typeu.directSupertypes(mirror()).get(0))); } diff --git a/gradle.properties b/gradle.properties index 5d8543ab5e..2d1a5796da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=e9bd792158afc4f72017d9bed995e448934e472e +archash=6c4b3d49c647e1d594bfd9c3e40db922f8516e5d