This commit is contained in:
Anuken 2020-05-02 00:51:42 -04:00
parent c16c64b049
commit ef42f022c7
5 changed files with 103 additions and 51 deletions

View File

@ -87,6 +87,14 @@ public class Annotations{
//endregion
//region misc. utility
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Multiline {
boolean trim() default true;
boolean merge() default false;
char mergeChar() default ' ';
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface StyleDefaults{

View File

@ -3,9 +3,14 @@ package mindustry.annotations;
import arc.files.*;
import arc.struct.Array;
import arc.util.*;
import arc.util.Log;
import arc.util.Log.*;
import com.squareup.javapoet.*;
import com.sun.source.util.*;
import com.sun.tools.javac.model.*;
import com.sun.tools.javac.processing.*;
import com.sun.tools.javac.tree.*;
import com.sun.tools.javac.util.*;
import mindustry.annotations.util.*;
import javax.annotation.processing.*;
@ -19,6 +24,7 @@ import java.io.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.util.*;
import java.util.List;
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public abstract class BaseProcessor extends AbstractProcessor{
@ -36,6 +42,10 @@ public abstract class BaseProcessor extends AbstractProcessor{
protected RoundEnvironment env;
protected Fi rootDirectory;
protected Context context;
protected JavacElements elementUtils;
protected TreeMaker maker;
public static String getMethodName(Element element){
return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
}
@ -185,6 +195,11 @@ public abstract class BaseProcessor extends AbstractProcessor{
elementu = env.getElementUtils();
filer = env.getFiler();
messager = env.getMessager();
context = ((JavacProcessingEnvironment)env).getContext();
JavacProcessingEnvironment javacProcessingEnv = (JavacProcessingEnvironment)env;
this.elementUtils = javacProcessingEnv.getElementUtils();
this.maker = TreeMaker.instance(javacProcessingEnv.getContext());
Log.setLogLevel(LogLevel.info);

View File

@ -0,0 +1,59 @@
package mindustry.annotations.mutate;
import com.sun.tools.javac.tree.JCTree.*;
import mindustry.annotations.Annotations.*;
import mindustry.annotations.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import java.io.*;
import java.util.*;
//currently unused
@SupportedAnnotationTypes({"mindustry.annotations.Annotations.Multiline"})
public final class MultilineProcessor extends BaseProcessor{
@Override
public void process(RoundEnvironment env){
Set<? extends Element> fields = env.getElementsAnnotatedWith(Multiline.class);
for(Element field : fields){
String docComment = elementUtils.getDocComment(field);
if(null != docComment){
JCVariableDecl fieldNode = (JCVariableDecl)elementUtils.getTree(field);
fieldNode.init = maker.Literal(toString(docComment, field.getAnnotation(Multiline.class)));
}
}
}
static String toString(String value, Multiline annotation){
if(!annotation.merge() && !annotation.trim()){
return value;
}
String crnl = System.getProperty("line.separator");
try{
BufferedReader reader = new BufferedReader(new StringReader(value));
StringBuilder buf = new StringBuilder();
String line = reader.readLine();
while(line != null){
if(annotation.trim()){
line = line.trim();
}
if(annotation.merge() && buf.length() > 0){
if(annotation.mergeChar() != '\0'){
buf.append(annotation.mergeChar());
}
}
buf.append(line);
if(!annotation.merge()){
buf.append(crnl);
}
line = reader.readLine();
}
return buf.toString();
}catch(IOException ex){
throw new RuntimeException("checked exceptions are disgusting", ex);
}
}
}

View File

@ -7,29 +7,27 @@ import mindustry.gen.*;
import mindustry.type.*;
public class UnitTypes implements ContentList{
//TODO reimplement - DO NOT USE
public static UnitType
ghoul, revenant, lich,
crawler, fortress, eruptor, chaosArray, eradicator;
//TODO this is awful
public static @EntityDef({Unitc.class, Legsc.class}) UnitType titan;
public static @EntityDef({Unitc.class, Legsc.class}) UnitType dagger;
public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType vanguard;
//ground
public static @EntityDef({Unitc.class, Legsc.class}) UnitType titan, dagger, crawler, fortress, eruptor, chaosArray, eradicator;
//air
public static @EntityDef({Unitc.class}) UnitType wraith, reaper, ghoul, revenant, lich;
//mining
public static @EntityDef({Unitc.class, Minerc.class}) UnitType draug;
public static @EntityDef({Unitc.class, Trailc.class}) UnitType wraith;
public static @EntityDef({Unitc.class}) UnitType reaper;
public static @EntityDef({Unitc.class}) UnitType spirit;
public static @EntityDef({Unitc.class, Builderc.class}) UnitType phantom;
//TODO remove
public static UnitType alpha, delta, tau, omega, dart, javelin, trident, glaive;
public static UnitType starter;
//building
public static @EntityDef({Unitc.class, Builderc.class}) UnitType phantom, spirit;
//water
public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType vanguard;
@Override
public void load(){
dagger = new UnitType("dagger"){{
speed = 0.5f;
drag = 0.3f;
hitsize = 8f;

View File

@ -3,40 +3,12 @@ package mindustry.entities;
import mindustry.annotations.Annotations.*;
import mindustry.gen.*;
class GroupDefs{
@GroupDef(value = Entityc.class, mapping = true)
class gall{
}
@GroupDef(value = Playerc.class, mapping = true)
class gplayer{
}
@GroupDef(value = Bulletc.class, spatial = true, collide = true)
class gbullet{
}
@GroupDef(value = Unitc.class, spatial = true, mapping = true)
class gunit{
}
@GroupDef(Tilec.class)
class gtile{
}
@GroupDef(value = Syncc.class, mapping = true)
class gsync{
}
@GroupDef(Drawc.class)
class gdraw{
}
class GroupDefs<G>{
@GroupDef(value = Entityc.class, mapping = true) G all;
@GroupDef(value = Playerc.class, mapping = true) G player;
@GroupDef(value = Bulletc.class, spatial = true, collide = true) G bullet;
@GroupDef(value = Unitc.class, spatial = true, mapping = true) G unit;
@GroupDef(value = Tilec.class) G tile;
@GroupDef(value = Syncc.class, mapping = true) G sync;
@GroupDef(value = Drawc.class) G draw;
}