1 16 package com.google.gwt.dev.jdt; 17 18 import com.google.gwt.core.ext.TreeLogger; 19 import com.google.gwt.core.ext.typeinfo.CompilationUnitProvider; 20 21 import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; 22 import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; 23 24 import java.io.File ; 25 import java.util.ArrayList ; 26 import java.util.Arrays ; 27 import java.util.Collection ; 28 import java.util.HashMap ; 29 import java.util.HashSet ; 30 import java.util.Iterator ; 31 import java.util.List ; 32 import java.util.Map ; 33 import java.util.Set ; 34 35 40 public class AstCompiler extends AbstractCompiler { 41 42 45 private class CompilationUnitDeclarationCache { 46 47 private final Map lastModified = new HashMap (); 48 49 private final Map map = new HashMap (); 50 51 public void remove(String newLoc) { 52 map.remove(newLoc); 53 } 54 55 private void add(String location, CompilationUnitDeclaration item) { 56 File file = new File (location); 57 if (file.exists()) { 58 lastModified.put(location, new Long (file.lastModified())); 59 } 60 if (!map.containsKey(location)) { 61 map.put(location, new ArrayList ()); 62 } 63 get(location).add(item); 64 } 65 66 private boolean containsKey(String location) { 67 return map.containsKey(location); 68 } 69 70 private List get(Object key) { 71 return (List ) map.get(key); 72 } 73 74 private CompilationUnitDeclaration[] getDeclarations() { 75 Set outSet = new HashSet (); 76 for (Iterator iter = map.values().iterator(); iter.hasNext();) { 77 List element = (List ) iter.next(); 78 outSet.addAll(element); 79 } 80 CompilationUnitDeclaration[] out = new CompilationUnitDeclaration[outSet.size()]; 81 int i = 0; 82 for (Iterator iter = outSet.iterator(); iter.hasNext();) { 83 CompilationUnitDeclaration element = (CompilationUnitDeclaration) iter.next(); 84 out[i] = element; 85 i++; 86 } 87 return out; 88 } 89 90 private void removeAll(Collection c) { 91 map.keySet().removeAll(c); 92 } 93 } 94 95 private final CompilationUnitDeclarationCache cachedResults = new CompilationUnitDeclarationCache(); 96 97 public AstCompiler(SourceOracle sourceOracle) { 98 super(sourceOracle, false); 99 } 100 101 public CompilationUnitDeclaration[] getCompilationUnitDeclarations( 102 TreeLogger logger, ICompilationUnit[] units) { 103 List allUnits = Arrays.asList(units); 104 List newUnits = new ArrayList (); 105 106 for (Iterator iter = allUnits.iterator(); iter.hasNext();) { 108 ICompilationUnitAdapter adapter = (ICompilationUnitAdapter) iter.next(); 109 CompilationUnitProvider cup = adapter.getCompilationUnitProvider(); 110 String location = cup.getLocation(); 111 if (!(cachedResults.containsKey(location))) { 112 newUnits.add(adapter); 113 } 114 } 115 ICompilationUnit[] toBeProcessed = new ICompilationUnit[newUnits.size()]; 116 newUnits.toArray(toBeProcessed); 117 CompilationUnitDeclaration[] newCuds = compile(logger, toBeProcessed); 118 119 for (int i = 0; i < newCuds.length; i++) { 121 String newLoc = String.valueOf(newCuds[i].getFileName()); 122 cachedResults.remove(newLoc); 123 cachedResults.add(newLoc, newCuds[i]); 124 } 125 return cachedResults.getDeclarations(); 126 } 127 128 public void invalidateChangedFiles(Set changedFiles, Set typeNames) { 129 cachedResults.removeAll(changedFiles); 130 invalidateUnitsInFiles(changedFiles, typeNames); 131 } 132 } 133 | Popular Tags |