1 16 package com.google.gwt.dev.shell; 17 18 import com.google.gwt.core.ext.PropertyOracle; 19 import com.google.gwt.core.ext.TreeLogger; 20 import com.google.gwt.core.ext.UnableToCompleteException; 21 import com.google.gwt.core.ext.typeinfo.JClassType; 22 import com.google.gwt.core.ext.typeinfo.TypeOracle; 23 import com.google.gwt.dev.cfg.Rule; 24 import com.google.gwt.dev.cfg.Rules; 25 import com.google.gwt.dev.cfg.StaticPropertyOracle; 26 import com.google.gwt.dev.jdt.CacheManager; 27 import com.google.gwt.dev.jdt.RebindOracle; 28 import com.google.gwt.dev.util.Util; 29 30 import java.io.File ; 31 import java.util.ArrayList ; 32 import java.util.HashSet ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 import java.util.Set ; 36 37 40 public class StandardRebindOracle implements RebindOracle { 41 42 45 private final class Rebinder { 46 47 private final StandardGeneratorContext genCtx; 48 49 private final Set usedRules = new HashSet (); 50 51 private final List usedTypeNames = new ArrayList (); 52 53 public Rebinder(TypeOracle typeOracle, PropertyOracle propOracle) { 54 genCtx = new StandardGeneratorContext(typeOracle, propOracle, genDir, 55 outDir, cacheManager); 56 } 57 58 public String rebind(TreeLogger logger, String typeName) 59 throws UnableToCompleteException { 60 61 String result = tryRebind(logger, typeName); 62 if (result == null) { 63 result = typeName; 64 } 65 66 JClassType[] genTypes = genCtx.finish(logger); 69 if (genTypes.length > 0) { 70 onGeneratedTypes(result, genTypes); 71 } 72 73 return result; 74 } 75 76 private String tryRebind(TreeLogger logger, String typeName) 77 throws UnableToCompleteException { 78 if (usedTypeNames.contains(typeName)) { 79 String [] cycle = (String []) Util.toArray(String .class, usedTypeNames); 82 Messages.UNABLE_TO_REBIND_DUE_TO_CYCLE_IN_RULES.log(logger, cycle, null); 83 throw new UnableToCompleteException(); 84 } 85 86 usedTypeNames.add(typeName); 89 90 if (rules.isEmpty()) { 93 logger.log(TreeLogger.DEBUG, 94 "No rules are defined, so no substitution can occur", null); 95 return null; 96 } 97 98 for (Iterator iter = rules.iterator(); iter.hasNext();) { 99 Rule rule = (Rule) iter.next(); 100 101 TreeLogger branch = Messages.TRACE_CHECKING_RULE.branch(logger, rule, 104 null); 105 106 if (rule.isApplicable(branch, genCtx, typeName)) { 107 if (!usedRules.contains(rule)) { 111 usedRules.add(rule); 112 Messages.TRACE_RULE_MATCHED.log(logger, null); 113 114 return rule.realize(logger, genCtx, typeName); 117 118 } else { 119 } 123 } else { 124 Messages.TRACE_RULE_DID_NOT_MATCH.log(logger, null); 125 } 126 } 127 128 return null; 131 } 132 } 133 134 private final CacheManager cacheManager; 135 136 private final File genDir; 137 138 private final File outDir; 139 140 private final PropertyOracle propOracle; 141 142 private final Rules rules; 143 144 private final TypeOracle typeOracle; 145 146 public StandardRebindOracle(TypeOracle typeOracle, PropertyOracle propOracle, 147 Rules rules, File genDir, File moduleOutDir, CacheManager cacheManager) { 148 this.typeOracle = typeOracle; 149 this.propOracle = propOracle; 150 this.rules = rules; 151 this.genDir = genDir; 152 this.outDir = moduleOutDir; 153 if (cacheManager != null) { 154 this.cacheManager = cacheManager; 155 } else { 156 this.cacheManager = new CacheManager(typeOracle); 157 } 158 } 159 160 public StandardRebindOracle(TypeOracle typeOracle, 161 StaticPropertyOracle propOracle, Rules rules, File genDir, 162 File moduleOutDir) { 163 this(typeOracle, propOracle, rules, genDir, moduleOutDir, null); 165 } 166 167 public String rebind(TreeLogger logger, String typeName) 168 throws UnableToCompleteException { 169 170 logger = Messages.TRACE_TOPLEVEL_REBIND.branch(logger, typeName, null); 171 172 Rebinder rebinder = new Rebinder(typeOracle, propOracle); 173 String result = rebinder.rebind(logger, typeName); 174 175 Messages.TRACE_TOPLEVEL_REBIND_RESULT.log(logger, result, null); 176 177 return result; 178 } 179 180 protected void onGeneratedTypes(String result, JClassType[] genTypes) { 181 } 182 183 } 184 | Popular Tags |