61 lines
2.1 KiB
Java
61 lines
2.1 KiB
Java
//: annotations/InterfaceExtractorProcessor.java
|
|
// APT-based annotation processing.
|
|
// {Exec: apt -factory
|
|
// annotations.InterfaceExtractorProcessorFactory
|
|
// Multiplier.java -s ../annotations}
|
|
package annotations;
|
|
import com.sun.mirror.apt.*;
|
|
import com.sun.mirror.declaration.*;
|
|
import java.io.*;
|
|
import java.util.*;
|
|
|
|
public class InterfaceExtractorProcessor
|
|
implements AnnotationProcessor {
|
|
private final AnnotationProcessorEnvironment env;
|
|
private ArrayList<MethodDeclaration> interfaceMethods =
|
|
new ArrayList<MethodDeclaration>();
|
|
public InterfaceExtractorProcessor(
|
|
AnnotationProcessorEnvironment env) { this.env = env; }
|
|
public void process() {
|
|
for(TypeDeclaration typeDecl :
|
|
env.getSpecifiedTypeDeclarations()) {
|
|
ExtractInterface annot =
|
|
typeDecl.getAnnotation(ExtractInterface.class);
|
|
if(annot == null)
|
|
break;
|
|
for(MethodDeclaration m : typeDecl.getMethods())
|
|
if(m.getModifiers().contains(Modifier.PUBLIC) &&
|
|
!(m.getModifiers().contains(Modifier.STATIC)))
|
|
interfaceMethods.add(m);
|
|
if(interfaceMethods.size() > 0) {
|
|
try {
|
|
PrintWriter writer =
|
|
env.getFiler().createSourceFile(annot.value());
|
|
writer.println("package " +
|
|
typeDecl.getPackage().getQualifiedName() +";");
|
|
writer.println("public interface " +
|
|
annot.value() + " {");
|
|
for(MethodDeclaration m : interfaceMethods) {
|
|
writer.print(" public ");
|
|
writer.print(m.getReturnType() + " ");
|
|
writer.print(m.getSimpleName() + " (");
|
|
int i = 0;
|
|
for(ParameterDeclaration parm :
|
|
m.getParameters()) {
|
|
writer.print(parm.getType() + " " +
|
|
parm.getSimpleName());
|
|
if(++i < m.getParameters().size())
|
|
writer.print(", ");
|
|
}
|
|
writer.println(");");
|
|
}
|
|
writer.println("}");
|
|
writer.close();
|
|
} catch(IOException ioe) {
|
|
throw new RuntimeException(ioe);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} ///:~
|