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