package cn.bran.japid.rendererloader;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.Compiler;
import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import static org.eclipse.jdt.internal.compiler.impl.CompilerOptions.*;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
import cn.bran.japid.template.JapidRenderer;
import cn.bran.japid.util.JapidFlags;
/**
* Java compiler (uses eclipse JDT)
*
* based on
*/
public class RendererCompiler {
Compiler jdtCompiler;
/**
* supposed to have a single instance for the entire application
*
* @param classes
* @param cl
*/
@SuppressWarnings("deprecation")
public RendererCompiler(Map<String, RendererClass> classes, TemplateClassLoader cl) {
/**
* Try to guess the magic configuration options
*/
Map<String, String> settings = new HashMap<String, String>();
settings.put(OPTION_ReportMissingSerialVersion, IGNORE);
settings.put(OPTION_LineNumberAttribute, GENERATE);
settings.put(OPTION_SourceFileAttribute, GENERATE);
settings.put(OPTION_ReportDeprecation, IGNORE);
settings.put(OPTION_ReportUnusedImport, IGNORE);
settings.put(OPTION_Encoding, "UTF-8");
settings.put(OPTION_LocalVariableAttribute, GENERATE);
String javaVersion = VERSION_1_6;
try {
String version = System.getProperty("java.version");
if (version.startsWith("1.6"))
javaVersion = VERSION_1_6;
else if(version.startsWith("1.7"))
javaVersion = VERSION_1_7;
else if(version.startsWith("1.5"))
javaVersion = VERSION_1_5;
} catch (Exception e) {}
JapidFlags.debug("would compile Japid for JDK version: " + javaVersion);
settings.put(OPTION_Source, javaVersion);
settings.put(OPTION_TargetPlatform, javaVersion);
settings.put(OPTION_PreserveUnusedLocal, PRESERVE);
settings.put(OPTION_Compliance, javaVersion);
jdtCompiler = new Compiler(
new NameEnv(cl),
DefaultErrorHandlingPolicies.exitOnFirstError(),
settings,
new CompilerRequestor(),
new DefaultProblemFactory(Locale.ENGLISH)) {
@Override
protected void handleInternalException(Throwable e, CompilationUnitDeclaration ud, CompilationResult result) {
e.printStackTrace();
}
};
}
public void compile(String[] classNames) {
ICompilationUnit[] compilationUnits = new CompilationUnit[classNames.length];
for (int i = 0; i < classNames.length; i++) {
compilationUnits[i] = new CompilationUnit(classNames[i]);
}
jdtCompiler.compile(compilationUnits);
JapidRenderer.persistJapidClassesLater();
}
/**
* @author Bing Ran (bing.ran@gmail.com)
* @param scriptNames
*/
public void compile(List<String> scriptNames) {
String[] names = new String[scriptNames.size()];
compile(scriptNames.toArray(names));
}
}