Skip to content

Instantly share code, notes, and snippets.

public class AwesomeLoggerProcessor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment env){ }
@Override
public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { }
@Override
public Set<String> getSupportedAnnotationTypes() { }
//processor module
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':annotation')
compile 'com.google.auto.service:auto-service:1.0-rc2'
}
@igor-brishkoski
igor-brishkoski / processor_preview.java
Created February 5, 2017 00:49
Processor preview
@AutoService(Processor.class)
public class AwesomeLoggerProcessor extends AbstractProcessor {
private static final String KEY_PARAM_NAME = "args";
private static final String METHOD_LOG = "log";
private static final String CLASS_SUFFIX = "_Log";
private Messager messager;
private Filer filer;
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
@igor-brishkoski
igor-brishkoski / elements.java
Created February 5, 2017 00:51
Element Types
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.FIELD
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
//get all elements annotated with AwesomeLogger
Collection<? extends Element> annotatedElements = roundEnvironment.getElementsAnnotatedWith(AwesomeLogger.class);
for (Element type : annotatedElements) {
...
}
return true;
@igor-brishkoski
igor-brishkoski / filter_elements.java
Last active February 5, 2017 02:08
Filter Elements Guava
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
//get all elements annotated with AwesomeLogger
Collection<? extends Element> annotatedElements = roundEnvironment.getElementsAnnotatedWith(AwesomeLogger.class);
//filter out elements we don't need
List<TypeElement> types = new ImmutableList.Builder<TypeElement>()
.addAll(ElementFilter.typesIn(annotatedElements))
.build();
package com.example; // PackageElement
public class User { // TypeElement
private String firstName;// VariableElement
private String lastName; // VariableElement
public User () {} // ExecuteableElement
}
private boolean isValidClass(TypeElement type){
if(type.getKind() != ElementKind.CLASS){
messager.printMessage(Diagnostic.Kind.ERROR,type.getSimpleName()+" only classes can be annotated with AwesomeLogger");
return false;
}
if(type.getModifiers().contains(Modifier.PRIVATE)){
messager.printMessage(Diagnostic.Kind.ERROR,type.getSimpleName()+" only public classes can be annotated with AwesomeLogger");
return false;
}
@igor-brishkoski
igor-brishkoski / code_gen.java
Last active February 5, 2017 02:06
Code Generation
private void writeSourceFile(TypeElement originatingType) {
//get Log class from android.util package
//This will make sure the Log class is properly imported into our class
ClassName logClassName = ClassName.get("android.util", "Log");
//get the current annotated class name
TypeVariableName typeVariableName = TypeVariableName.get(originatingType.getSimpleName().toString());
//create static void method named log
MethodSpec log = MethodSpec.methodBuilder(METHOD_LOG)
@igor-brishkoski
igor-brishkoski / main_activity_gen_code.java
Created April 15, 2017 19:22
Main Activity our custom class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
User g = new User("Gandalf", "The White", "Maia");
User_Log.log(g);
}