1 11 package org.eclipse.jdt.internal.eval; 12 13 import java.util.ArrayList ; 14 import java.util.HashMap ; 15 import java.util.Iterator ; 16 import java.util.Map ; 17 18 import org.eclipse.jdt.core.compiler.*; 19 import org.eclipse.jdt.internal.compiler.ClassFile; 20 import org.eclipse.jdt.internal.compiler.CompilationResult; 21 import org.eclipse.jdt.internal.compiler.Compiler; 22 import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; 23 import org.eclipse.jdt.internal.compiler.ICompilerRequestor; 24 import org.eclipse.jdt.internal.compiler.IProblemFactory; 25 import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; 26 import org.eclipse.jdt.internal.compiler.env.INameEnvironment; 27 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; 28 import org.eclipse.jdt.internal.core.util.Util; 29 30 35 public abstract class Evaluator { 36 EvaluationContext context; 37 INameEnvironment environment; 38 Map options; 39 IRequestor requestor; 40 IProblemFactory problemFactory; 41 44 Evaluator(EvaluationContext context, INameEnvironment environment, Map options, IRequestor requestor, IProblemFactory problemFactory) { 45 this.context = context; 46 this.environment = environment; 47 this.options = options; 48 this.requestor = requestor; 49 this.problemFactory = problemFactory; 50 } 51 57 protected abstract void addEvaluationResultForCompilationProblem(Map resultsByIDs,CategorizedProblem problem, char[] cuSource); 58 63 protected EvaluationResult[] evaluationResultsForCompilationProblems(CompilationResult result, char[] cuSource) { 64 CategorizedProblem[] problems = result.getAllProblems(); 66 HashMap resultsByIDs = new HashMap (5); 67 for (int i = 0; i < problems.length; i++) { 68 addEvaluationResultForCompilationProblem(resultsByIDs, problems[i], cuSource); 69 } 70 71 int size = resultsByIDs.size(); 73 EvaluationResult[] evalResults = new EvaluationResult[size]; 74 Iterator results = resultsByIDs.values().iterator(); 75 for (int i = 0; i < size; i++) { 76 evalResults[i] = (EvaluationResult)results.next(); 77 } 78 79 return evalResults; 80 } 81 85 ClassFile[] getClasses() { 86 final char[] source = getSource(); 87 final ArrayList classDefinitions = new ArrayList (); 88 89 class CompilerRequestor implements ICompilerRequestor { 91 boolean hasErrors = false; 92 public void acceptResult(CompilationResult result) { 93 if (result.hasProblems()) { 94 EvaluationResult[] evalResults = evaluationResultsForCompilationProblems(result, source); 95 for (int i = 0; i < evalResults.length; i++) { 96 EvaluationResult evalResult = evalResults[i]; 97 CategorizedProblem[] problems = evalResult.getProblems(); 98 for (int j = 0; j < problems.length; j++) { 99 Evaluator.this.requestor.acceptProblem(problems[j], evalResult.getEvaluationID(), evalResult.getEvaluationType()); 100 } 101 } 102 } 103 if (result.hasErrors()) { 104 this.hasErrors = true; 105 } else { 106 ClassFile[] classFiles = result.getClassFiles(); 107 for (int i = 0; i < classFiles.length; i++) { 108 ClassFile classFile = classFiles[i]; 109 121 classDefinitions.add(classFile); 122 } 123 } 124 } 125 } 126 127 CompilerRequestor compilerRequestor = new CompilerRequestor(); 129 Compiler compiler = getCompiler(compilerRequestor); 130 compiler.compile(new ICompilationUnit[] {new ICompilationUnit() { 131 public char[] getFileName() { 132 return CharOperation.concat(Evaluator.this.getClassName(), Util.defaultJavaExtension().toCharArray()); 134 } 135 public char[] getContents() { 136 return source; 137 } 138 public char[] getMainTypeName() { 139 return Evaluator.this.getClassName(); 140 } 141 public char[][] getPackageName() { 142 return null; 143 } 144 }}); 145 if (compilerRequestor.hasErrors) { 146 return null; 147 } else { 148 ClassFile[] result = new ClassFile[classDefinitions.size()]; 149 classDefinitions.toArray(result); 150 return result; 151 } 152 } 153 157 protected abstract char[] getClassName(); 158 161 Compiler getCompiler(ICompilerRequestor compilerRequestor) { 162 CompilerOptions compilerOptions = new CompilerOptions(this.options); 163 compilerOptions.performMethodsFullRecovery = true; 164 compilerOptions.performStatementsRecovery = true; 165 return new Compiler ( 166 this.environment, 167 DefaultErrorHandlingPolicies.exitAfterAllProblems(), 168 compilerOptions, 169 compilerRequestor, 170 this.problemFactory); 171 } 172 175 protected abstract char[] getSource(); 176 } 177 | Popular Tags |