package com.onpositive.google.scrapbook;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.internal.compiler.ClassFile;
import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.Compiler;
import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
import org.eclipse.jdt.internal.compiler.IProblemFactory;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
import org.eclipse.jdt.internal.core.builder.NameEnvironment;
@SuppressWarnings("restriction")
public class CompilerFacade {
int length;
private final class Unit implements
org.eclipse.jdt.internal.compiler.env.ICompilationUnit {
private final String str;
private Unit(String str) {
this.str = str;
}
public char[] getFileName() {
return "snippet.java".toCharArray();
}
public char[][] getPackageName() {
return new char[][] { "snippet".toCharArray() };
}
public char[] getMainTypeName() {
return "snippet".toCharArray();
}
public char[] getContents() {
StringBuilder bs = new StringBuilder();
bs
.append("package snippet;import java.io.PrintWriter;");
ASTParser newParser = ASTParser.newParser(AST.JLS3);
newParser.setSource(str.toCharArray());
StringBuilder bls=new StringBuilder(str);
CompilationUnit createAST = (CompilationUnit) newParser.createAST(null);
//ArrayList<String> results = new ArrayList<String>();
for (Object n : createAST.imports()) {
ImportDeclaration decl = (ImportDeclaration) n;
String name = decl.getName().getFullyQualifiedName();
if (decl.isOnDemand()) {
bs.append("import "+name+".*;");
} else {
bs.append("import "+name+";");
}
int i = decl.getStartPosition()+decl.getLength();
for (int a=decl.getStartPosition();a<i;a++){
bls.setCharAt(a, ' ');
}
}
bs
.append("public class snippet{ public void doIt(PrintWriter out) throws Throwable{\n");
length=bs.length();
bs.append(bls.toString());
bs.append("\n}}");
return bs.toString().toCharArray();
}
}
byte[] resultBytes;
@SuppressWarnings("unchecked")
public byte[] compile(final String str, IJavaProject prj) {
Map prjOptions = prj.getOptions(true);
CompilerOptions options = new CompilerOptions(prjOptions);
INameEnvironment environment = new NameEnvironment(prj);
IErrorHandlingPolicy policy = new IErrorHandlingPolicy() {
public boolean stopOnFirstError() {
return false;
}
public boolean proceedOnErrors() {
return true;
}
};
ICompilerRequestor requestor = new ICompilerRequestor() {
public void acceptResult(CompilationResult result) {
ClassFile[] classFiles = result.getClassFiles();
for (ClassFile f : classFiles) {
resultBytes = f.getBytes();
break;
}
}
};
IProblemFactory problemFactory = new DefaultProblemFactory();
Compiler c = new Compiler(environment, policy, options, requestor,
problemFactory);
c.compile(new ICompilationUnit[] { new Unit(str) });
environment.cleanup();
return resultBytes;
}
CategorizedProblem[] problems;
@SuppressWarnings("unchecked")
public CategorizedProblem[] validate(final String str, IJavaProject prj) {
Map prjOptions = prj.getOptions(true);
CompilerOptions options = new CompilerOptions(prjOptions);
INameEnvironment environment = new NameEnvironment(prj);
IErrorHandlingPolicy policy = new IErrorHandlingPolicy() {
public boolean stopOnFirstError() {
return false;
}
public boolean proceedOnErrors() {
return true;
}
};
ICompilerRequestor requestor = new ICompilerRequestor() {
public void acceptResult(CompilationResult result) {
ClassFile[] classFiles = result.getClassFiles();
for (ClassFile f : classFiles) {
resultBytes = f.getBytes();
break;
}
problems=result.getAllProblems();
}
};
IProblemFactory problemFactory = new DefaultProblemFactory();
Compiler c = new Compiler(environment, policy, options, requestor,
problemFactory);
c.compile(new ICompilationUnit[] { new Unit(str) });
environment.cleanup();
return problems;
}
}