blob: cbe63c6b261ea7fe4f40165ec92f041e5bfd2939 [file] [log] [blame]
package org.checkerframework.framework.ajava;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.TypeDeclaration;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.checkerframework.framework.util.JavaParserUtil;
import org.checkerframework.javacutil.BugInCF;
/**
* Stores a collection of annotation files. Given a type name, can return a list of paths to stored
* annotation files corresponding to that type name.
*/
public class AnnotationFileStore {
/**
* Mapping from a fully qualified class name to the paths to annotation files that contain that
* type.
*/
private Map<String, List<String>> annotationFiles;
/** Constructs an {@code AnnotationFileStore}. */
public AnnotationFileStore() {
annotationFiles = new HashMap<>();
}
/**
* If {@code location} is a file, stores it in this as an annotation file. If {@code location} is
* a directory, stores all annotation files contained in it.
*
* @param location an annotation file or a directory containing annotation files
*/
public void addFileOrDirectory(File location) {
if (location.isDirectory()) {
for (File child : location.listFiles()) {
addFileOrDirectory(child);
}
return;
}
if (location.isFile() && location.getName().endsWith(".ajava")) {
try {
CompilationUnit root = JavaParserUtil.parseCompilationUnit(location);
for (TypeDeclaration<?> type : root.getTypes()) {
String name = JavaParserUtil.getFullyQualifiedName(type, root);
if (!annotationFiles.containsKey(name)) {
annotationFiles.put(name, new ArrayList<>());
}
annotationFiles.get(name).add(location.getPath());
}
} catch (FileNotFoundException e) {
throw new BugInCF("Unable to open annotation file: " + location.getPath(), e);
}
}
}
/**
* Given a fully qualified type name, returns a List of paths to annotation files containing
* annotations for the type.
*
* @param typeName fully qualified name of a type
* @return a list of paths to annotation files with annotations for {@code typeName}
*/
public List<String> getAnnotationFileForType(String typeName) {
if (!annotationFiles.containsKey(typeName)) {
return Collections.emptyList();
}
return Collections.unmodifiableList(annotationFiles.get(typeName));
}
}