Summary: Setting up a basic annotation processor. Right now, the processor just saves a map of class -> methods that should be suppressed. Next, this map needs to be turned into a .inferconfig file.master
parent
37a4709a0f
commit
2f25d6344c
@ -1,13 +1,24 @@
|
|||||||
DEPENDENCIES = ../../dependencies
|
DEPENDENCIES = ../../dependencies
|
||||||
JSR_JAR = $(DEPENDENCIES)/java/jsr-305/jsr305.jar
|
JSR_JAR = $(DEPENDENCIES)/java/jsr-305/jsr305.jar
|
||||||
CLASSES_OUT = classes
|
ANNOT_SOURCES = `find com/facebook/infer/annotation -name "*.java"`
|
||||||
SOURCES = `find . -name "*.java"`
|
PROCESSOR_SOURCES = `find com/facebook/infer/annotprocess -name "*.java"`
|
||||||
|
ANNOT_CLASSES = 'annot_classes'
|
||||||
|
PROCESSOR_CLASSES = 'processor_classes'
|
||||||
|
|
||||||
all:
|
all: annotations processor
|
||||||
mkdir -p classes
|
|
||||||
javac -cp $(JSR_JAR) $(SOURCES)
|
annotations:
|
||||||
jar cvf annotations.jar $(SOURCES) `find . -name "*.class"`
|
mkdir -p $(ANNOT_CLASSES)
|
||||||
|
javac -cp $(JSR_JAR) $(ANNOT_SOURCES) -d $(ANNOT_CLASSES)
|
||||||
|
cd $(ANNOT_CLASSES) && jar cvf annotations.jar com && cp annotations.jar ../
|
||||||
|
|
||||||
|
processor:
|
||||||
|
mkdir -p $(PROCESSOR_CLASSES)
|
||||||
|
javac $(PROCESSOR_SOURCES) -d $(PROCESSOR_CLASSES)
|
||||||
|
cd $(PROCESSOR_CLASSES) && cp -r ../resources/META-INF . && jar cvMf processor.jar com META-INF && cp processor.jar ../
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rvf `find . -name "*.class"`
|
rm -r $(ANNOT_CLASSES)
|
||||||
rm -rvf annotations.jar
|
rm annotations.jar
|
||||||
|
rm -r $(PROCESSOR_CLASSES)
|
||||||
|
rm processor.jar
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015 - present Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.facebook.infer.annotprocess;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.tools.*;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@SupportedAnnotationTypes({"java.lang.SuppressWarnings"})
|
||||||
|
public class AnnotationProcessor extends AbstractProcessor {
|
||||||
|
|
||||||
|
// map of (classes -> methods in class). an empty set means suppress all warnings on class
|
||||||
|
public Map<String,Set<String>> suppressMap = new LinkedHashMap<String,Set<String>>();
|
||||||
|
|
||||||
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
|
||||||
|
for (TypeElement te : annotations) {
|
||||||
|
for (Element e : env.getElementsAnnotatedWith(te)) {
|
||||||
|
if (e instanceof TypeElement) { // class
|
||||||
|
String className = ((TypeElement) e).getQualifiedName().toString();
|
||||||
|
suppressMap.put(className, Collections.EMPTY_SET);
|
||||||
|
} else if (e instanceof ExecutableElement) { // method
|
||||||
|
String clazz = e.getEnclosingElement().toString();
|
||||||
|
Set<String> suppressMethods = suppressMap.get(clazz);
|
||||||
|
if (suppressMethods == null) {
|
||||||
|
suppressMethods = new LinkedHashSet();
|
||||||
|
suppressMap.put(clazz, suppressMethods);
|
||||||
|
} else if (suppressMethods.isEmpty()) {
|
||||||
|
// empty set means suppress warnings on all methods in class; do nothing
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
suppressMethods.add(clazz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env.processingOver()) {
|
||||||
|
// TODO: write suppressMap to a .inferconfig file on disk
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SourceVersion getSupportedSourceVersion() {
|
||||||
|
return SourceVersion.latestSupported();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
com.facebook.infer.annotprocess.AnnotationProcessor
|
Loading…
Reference in new issue