From ad84329688f45e5d7a0e6fd7c945d8486d372669 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2020 17:21:35 -0500 Subject: [PATCH] Abstract component method support --- .../mindustry/annotations/BaseProcessor.java | 7 +++++++ .../annotations/impl/EntityProcess.java | 6 ++++++ .../mindustry/annotations/util/Smethod.java | 4 ++++ .../mindustry/entities/def/EntityComps.java | 21 ++++++++++--------- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java index f299b4af76..57d3be2d9c 100644 --- a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java @@ -1,6 +1,7 @@ package mindustry.annotations; import arc.struct.*; +import arc.util.*; import com.squareup.javapoet.*; import com.sun.source.util.*; import mindustry.annotations.util.*; @@ -86,10 +87,16 @@ public abstract class BaseProcessor extends AbstractProcessor{ public void err(String message){ messager.printMessage(Kind.ERROR, message); + Log.err("[CODEGEN ERROR] " +message); } public void err(String message, Element elem){ messager.printMessage(Kind.ERROR, message, elem); + Log.err("[CODEGEN ERROR] " + message + ": " + elem); + } + + public void err(String message, Selement elem){ + err(message, elem.e); } @Override diff --git a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java index b24b9c682d..80e294a0f3 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java @@ -137,7 +137,13 @@ public class EntityProcess extends BaseProcessor{ //only write the block if it's a void method with several entries boolean writeBlock = first.ret().toString().equals("void") && entry.value.size > 1; + if(entry.value.first().is(Modifier.ABSTRACT) && entry.value.size == 1){ + err(entry.value.first().up().getSimpleName() + " declares an abstract method. This method must be implemented in another component", entry.value.first()); + } + for(Smethod elem : entry.value){ + if(elem.is(Modifier.ABSTRACT)) continue; + //get all statements in the method, copy them over MethodTree methodTree = elem.tree(); BlockTree blockTree = methodTree.getBody(); diff --git a/annotations/src/main/java/mindustry/annotations/util/Smethod.java b/annotations/src/main/java/mindustry/annotations/util/Smethod.java index ec4b77b207..b9687dd728 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Smethod.java +++ b/annotations/src/main/java/mindustry/annotations/util/Smethod.java @@ -14,6 +14,10 @@ public class Smethod extends Selement{ super(executableElement); } + public boolean is(Modifier mod){ + return e.getModifiers().contains(mod); + } + public Array thrown(){ return Array.with(e.getThrownTypes()).as(TypeMirror.class); } diff --git a/core/src/mindustry/entities/def/EntityComps.java b/core/src/mindustry/entities/def/EntityComps.java index cb0cae7553..3dea444169 100644 --- a/core/src/mindustry/entities/def/EntityComps.java +++ b/core/src/mindustry/entities/def/EntityComps.java @@ -30,8 +30,17 @@ public class EntityComps{ Entityc owner; } - class TimedComp extends EntityComp implements Scaled{ - float time, lifetime = 1f; + @Depends({TimedComp.class}) + class BulletComp{ + BulletType bullet; + + void init(){ + bullet.init(); + } + } + + abstract class TimedComp extends EntityComp implements Scaled{ + float time, lifetime; void update(){ time = Math.min(time + Time.delta(), lifetime); @@ -205,14 +214,6 @@ public class EntityComps{ } } - class BulletComp{ - BulletType bullet; - - void init(){ - bullet.init(); - } - } - @BaseComponent class EntityComp{ int id;