1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Todo.java Thu Sep 18 18:39:44 2008 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Todo.java Tue Sep 23 10:44:51 2008 -0700 1.3 @@ -25,7 +25,14 @@ 1.4 1.5 package com.sun.tools.javac.comp; 1.6 1.7 -import com.sun.tools.javac.util.*; 1.8 +import java.util.AbstractQueue; 1.9 +import com.sun.tools.javac.util.Context; 1.10 +import java.util.HashMap; 1.11 +import java.util.Iterator; 1.12 +import java.util.LinkedList; 1.13 +import java.util.Map; 1.14 +import java.util.Queue; 1.15 +import javax.tools.JavaFileObject; 1.16 1.17 /** A queue of all as yet unattributed classes. 1.18 * 1.19 @@ -34,7 +41,7 @@ 1.20 * This code and its internal interfaces are subject to change or 1.21 * deletion without notice.</b> 1.22 */ 1.23 -public class Todo extends ListBuffer<Env<AttrContext>> { 1.24 +public class Todo extends AbstractQueue<Env<AttrContext>> { 1.25 /** The context key for the todo list. */ 1.26 protected static final Context.Key<Todo> todoKey = 1.27 new Context.Key<Todo>(); 1.28 @@ -51,4 +58,115 @@ 1.29 protected Todo(Context context) { 1.30 context.put(todoKey, this); 1.31 } 1.32 + 1.33 + public void append(Env<AttrContext> env) { 1.34 + add(env); 1.35 + } 1.36 + 1.37 + @Override 1.38 + public Iterator<Env<AttrContext>> iterator() { 1.39 + return contents.iterator(); 1.40 + } 1.41 + 1.42 + @Override 1.43 + public int size() { 1.44 + return contents.size(); 1.45 + } 1.46 + 1.47 + public boolean offer(Env<AttrContext> e) { 1.48 + if (contents.add(e)) { 1.49 + if (contentsByFile != null) 1.50 + addByFile(e); 1.51 + return true; 1.52 + } else { 1.53 + return false; 1.54 + } 1.55 + } 1.56 + 1.57 + public Env<AttrContext> poll() { 1.58 + if (size() == 0) 1.59 + return null; 1.60 + Env<AttrContext> env = contents.remove(0); 1.61 + if (contentsByFile != null) 1.62 + removeByFile(env); 1.63 + return env; 1.64 + } 1.65 + 1.66 + public Env<AttrContext> peek() { 1.67 + return (size() == 0 ? null : contents.get(0)); 1.68 + } 1.69 + 1.70 + public Queue<Queue<Env<AttrContext>>> groupByFile() { 1.71 + if (contentsByFile == null) { 1.72 + contentsByFile = new LinkedList<Queue<Env<AttrContext>>>(); 1.73 + for (Env<AttrContext> env: contents) { 1.74 + addByFile(env); 1.75 + } 1.76 + } 1.77 + return contentsByFile; 1.78 + } 1.79 + 1.80 + private void addByFile(Env<AttrContext> env) { 1.81 + JavaFileObject file = env.toplevel.sourcefile; 1.82 + if (fileMap == null) 1.83 + fileMap = new HashMap<JavaFileObject, FileQueue>(); 1.84 + FileQueue fq = fileMap.get(file); 1.85 + if (fq == null) { 1.86 + fq = new FileQueue(); 1.87 + fileMap.put(file, fq); 1.88 + contentsByFile.add(fq); 1.89 + } 1.90 + fq.fileContents.add(env); 1.91 + } 1.92 + 1.93 + private void removeByFile(Env<AttrContext> env) { 1.94 + JavaFileObject file = env.toplevel.sourcefile; 1.95 + FileQueue fq = fileMap.get(file); 1.96 + if (fq == null) 1.97 + return; 1.98 + if (fq.fileContents.remove(env)) { 1.99 + if (fq.isEmpty()) { 1.100 + fileMap.remove(file); 1.101 + contentsByFile.remove(fq); 1.102 + } 1.103 + } 1.104 + } 1.105 + 1.106 + LinkedList<Env<AttrContext>> contents = new LinkedList<Env<AttrContext>>(); 1.107 + LinkedList<Queue<Env<AttrContext>>> contentsByFile; 1.108 + Map<JavaFileObject, FileQueue> fileMap; 1.109 + 1.110 + class FileQueue extends AbstractQueue<Env<AttrContext>> { 1.111 + @Override 1.112 + public Iterator<Env<AttrContext>> iterator() { 1.113 + return fileContents.iterator(); 1.114 + } 1.115 + 1.116 + @Override 1.117 + public int size() { 1.118 + return fileContents.size(); 1.119 + } 1.120 + 1.121 + public boolean offer(Env<AttrContext> e) { 1.122 + if (fileContents.offer(e)) { 1.123 + contents.add(e); 1.124 + return true; 1.125 + } 1.126 + return false; 1.127 + } 1.128 + 1.129 + public Env<AttrContext> poll() { 1.130 + if (fileContents.size() == 0) 1.131 + return null; 1.132 + Env<AttrContext> env = fileContents.remove(0); 1.133 + contents.remove(env); 1.134 + return env; 1.135 + } 1.136 + 1.137 + public Env<AttrContext> peek() { 1.138 + return (fileContents.size() == 0 ? null : fileContents.get(0)); 1.139 + } 1.140 + 1.141 + LinkedList<Env<AttrContext>> fileContents = new LinkedList<Env<AttrContext>>(); 1.142 + } 1.143 }