package blade.migrate.core;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
public class CUCache {
private static final Map<File, WeakReference<CompilationUnit>> _map = new WeakHashMap<>();
public static CompilationUnit getCU(File file, char[] javaSource) {
synchronized (_map) {
WeakReference<CompilationUnit> astRef = _map.get(file);
if (astRef == null || astRef.get() == null) {
final CompilationUnit newAst = createCompilationUnit(file.getName(), javaSource);
_map.put(file, new WeakReference<CompilationUnit>(newAst));
return newAst;
}
else {
return astRef.get();
}
}
}
public static void unget(File file) {
synchronized (_map) {
_map.remove(file);
}
}
@SuppressWarnings("unchecked")
private static CompilationUnit createCompilationUnit(String unitName, char[] javaSource) {
ASTParser parser = ASTParser.newParser(AST.JLS8);
Map<String, String> options = JavaCore.getOptions();
JavaCore.setComplianceOptions(JavaCore.VERSION_1_6, options);
parser.setCompilerOptions(options);
//setUnitName for resolve bindings
parser.setUnitName(unitName);
String[] sources = { "" };
String[] classpath = { "" };
//setEnvironment for resolve bindings even if the args is empty
parser.setEnvironment(classpath, sources, new String[] { "UTF-8" }, true);
parser.setResolveBindings(true);
parser.setStatementsRecovery(true);
parser.setBindingsRecovery(true);
parser.setSource(javaSource);
parser.setIgnoreMethodBodies(false);
return (CompilationUnit)parser.createAST(null);
}
}