1 16 package com.google.gwt.dev.jdt; 17 18 import com.google.gwt.core.ext.TreeLogger; 19 import com.google.gwt.core.ext.UnableToCompleteException; 20 import com.google.gwt.dev.jdt.FindDeferredBindingSitesVisitor.DeferredBindingSite; 21 import com.google.gwt.dev.util.Empty; 22 import com.google.gwt.dev.util.Util; 23 24 import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; 25 import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; 26 import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; 27 import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; 28 import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; 29 30 import java.util.HashMap ; 31 import java.util.HashSet ; 32 import java.util.Iterator ; 33 import java.util.Map ; 34 import java.util.Set ; 35 36 40 public class WebModeCompilerFrontEnd extends AstCompiler { 41 42 private final RebindPermutationOracle rebindPermOracle; 43 44 public WebModeCompilerFrontEnd(SourceOracle sourceOracle, 45 RebindPermutationOracle rebindPermOracle) { 46 super(sourceOracle); 47 this.rebindPermOracle = rebindPermOracle; 48 } 49 50 public CompilationUnitDeclaration[] getCompilationUnitDeclarations( 51 TreeLogger logger, String [] seedTypeNames) 52 throws UnableToCompleteException { 53 54 ICompilationUnit[] units = new ICompilationUnit[seedTypeNames.length]; 57 for (int i = 0; i < seedTypeNames.length; i++) { 58 String seedTypeName = seedTypeNames[i]; 59 units[i] = getCompilationUnitForType(logger, seedTypeName); 60 } 61 62 CompilationUnitDeclaration[] cuds = compile(logger, units); 66 return cuds; 67 } 68 69 public RebindPermutationOracle getRebindPermutationOracle() { 70 return rebindPermOracle; 71 } 72 73 76 protected String [] doFindAdditionalTypesUsingJsni(TreeLogger logger, 77 CompilationUnitDeclaration cud) { 78 Set dependentTypeNames = new HashSet (); 79 FindJsniRefVisitor v = new FindJsniRefVisitor(dependentTypeNames); 80 cud.traverse(v, cud.scope); 81 return (String []) dependentTypeNames.toArray(Empty.STRINGS); 82 } 83 84 87 protected String [] doFindAdditionalTypesUsingRebinds(TreeLogger logger, 88 CompilationUnitDeclaration cud) { 89 Set dependentTypeNames = new HashSet (); 90 91 Map requestedTypes = new HashMap (); 94 FindDeferredBindingSitesVisitor v = new FindDeferredBindingSitesVisitor( 95 requestedTypes); 96 cud.traverse(v, cud.scope); 97 98 for (Iterator iter = requestedTypes.keySet().iterator(); iter.hasNext();) { 101 String reqType = (String ) iter.next(); 102 DeferredBindingSite site = (DeferredBindingSite) requestedTypes.get(reqType); 103 104 try { 105 String [] resultTypes = rebindPermOracle.getAllPossibleRebindAnswers( 106 getLogger(), reqType); 107 for (int i = 0; i < resultTypes.length; ++i) { 109 String typeName = resultTypes[i]; 110 111 ReferenceBinding type = resolvePossiblyNestedType(typeName); 116 117 if (type == null) { 119 FindDeferredBindingSitesVisitor.reportRebindProblem(site, 120 "Rebind result '" + typeName + "' could not be found"); 121 continue; 122 } 123 if (!type.isClass()) { 124 FindDeferredBindingSitesVisitor.reportRebindProblem(site, 125 "Rebind result '" + typeName + "' must be a class"); 126 continue; 127 } 128 if (type.isAbstract()) { 129 FindDeferredBindingSitesVisitor.reportRebindProblem(site, 130 "Rebind result '" + typeName + "' cannot be abstract"); 131 continue; 132 } 133 if (type.isNestedType() && !type.isStatic()) { 134 FindDeferredBindingSitesVisitor.reportRebindProblem(site, 135 "Rebind result '" + typeName 136 + "' cannot be a non-static nested class"); 137 continue; 138 } 139 if (type.isLocalType()) { 140 FindDeferredBindingSitesVisitor.reportRebindProblem(site, 141 "Rebind result '" + typeName + "' cannot be a local class"); 142 continue; 143 } 144 MethodBinding noArgCtor = type.getExactMethod("<init>".toCharArray(), 146 TypeBinding.NoParameters, cud.scope); 147 148 if (noArgCtor == null) { 149 FindDeferredBindingSitesVisitor.reportRebindProblem(site, 150 "Rebind result '" + typeName 151 + "' has no default (zero argument) constructors"); 152 continue; 153 } 154 dependentTypeNames.add(typeName); 155 } 156 Util.addAll(dependentTypeNames, resultTypes); 157 } catch (UnableToCompleteException e) { 158 FindDeferredBindingSitesVisitor.reportRebindProblem(site, 159 "Failed to resolve '" + reqType + "' via deferred binding"); 160 } 161 } 162 return (String []) dependentTypeNames.toArray(Empty.STRINGS); 163 } 164 } 165 | Popular Tags |