diff options
author | paltherr <paltherr@epfl.ch> | 2004-02-26 16:42:42 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2004-02-26 16:42:42 +0000 |
commit | 76506bbb731ca10119bbe37cf7718d327d5d2ff4 (patch) | |
tree | 7e11645f515d963a28747c144c9aeb651c211b9a /sources | |
parent | 5b778f324f0f6ad0cc656afa7b951589e771a41d (diff) | |
download | scala-76506bbb731ca10119bbe37cf7718d327d5d2ff4.tar.gz scala-76506bbb731ca10119bbe37cf7718d327d5d2ff4.tar.bz2 scala-76506bbb731ca10119bbe37cf7718d327d5d2ff4.zip |
- Added ClosureHistory.java
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scalac/symtab/ClosureHistory.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/sources/scalac/symtab/ClosureHistory.java b/sources/scalac/symtab/ClosureHistory.java new file mode 100644 index 0000000000..8825fb3e20 --- /dev/null +++ b/sources/scalac/symtab/ClosureHistory.java @@ -0,0 +1,73 @@ +/* ____ ____ ____ ____ ______ *\ +** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala ** +** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL ** +** /_____/\____/\___/\____/____/ ** +\* */ + +// $Id$ + +package scalac.symtab; + +import java.util.Iterator; +import java.util.TreeMap; + +import scalac.Global; +import scalac.framework.History; +import scalac.util.Debug; + +/** This class implements a closure history. */ +public class ClosureHistory extends History { + + //######################################################################## + // Protected Methods + + /** Transforms given closure into closure at next phase. */ + protected Object transformValue(Object owner, Object value){ + Type[] closure = (Type[])value; + for (int i = 0; i < closure.length; i++) { + Symbol symbol = closure[i].symbol(); + // !!! symbol.nextInfoHasChanged() would be better + if (symbol.info() != symbol.nextInfo()) + return super.transformValue(owner, closure); + } + return closure; + } + + /** Computes the closure at current phase. */ + protected Object computeValue(Object owner) { + Symbol clasz = (Symbol)owner; + TreeMap parents = new TreeMap(SymbolComparator.instance); + addParents(parents, clasz.info()); + Type[] closure = new Type[1 + parents.size()]; + Iterator types = parents.values().iterator(); + closure[0] = clasz.type(); + for (int i = 1; i < closure.length; i++) + closure[i] = (Type)types.next(); + return closure; + } + + //######################################################################## + // Private Functions + + /** Adds all parents of given type to given parent table. */ + private static void addParents(TreeMap/*<Symbol,Type>*/ table, Type type) { + switch (type) { + case ErrorType: + return; + case TypeRef(_, Symbol symbol, _): + Type.Map map = Type.getThisTypeMap(symbol, type); + Type[] closure = symbol.closure(); + for (int i = 0; i < closure.length; i++) + table.put(closure[i].symbol(), map.apply(closure[i])); + return; + case CompoundType(Type[] parents, _): + for (int i = 0; i < parents.length; i++) + addParents(table, parents[i]); + return; + default: + throw Debug.abort("illegal case", type); + } + } + + //######################################################################## +} |