summaryrefslogtreecommitdiff
path: root/sources/scalac/symtab/SymbolSubstTypeMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/symtab/SymbolSubstTypeMap.java')
-rw-r--r--sources/scalac/symtab/SymbolSubstTypeMap.java35
1 files changed, 34 insertions, 1 deletions
diff --git a/sources/scalac/symtab/SymbolSubstTypeMap.java b/sources/scalac/symtab/SymbolSubstTypeMap.java
index f99cbbb1b0..b18c5e67cd 100644
--- a/sources/scalac/symtab/SymbolSubstTypeMap.java
+++ b/sources/scalac/symtab/SymbolSubstTypeMap.java
@@ -13,6 +13,8 @@ import java.util.Map;
import java.util.HashMap;
import java.util.Set;
+import ch.epfl.lamp.util.ForwardingMap;
+
import scalac.util.Debug;
/** A type map that substitues symbols and types for symbols. */
@@ -56,11 +58,13 @@ public class SymbolSubstTypeMap extends Type.Map {
}
public void insertSymbol(Symbol key, Symbol value) {
+ assert !symbols.containsKey(key) : Debug.show(key);
assert !types.containsKey(key) : Debug.show(key);
symbols.put(key, value);
}
public void insertSymbol(Map map) {
+ assert checkLeftContainsNoKeyFromRight(symbols, map);
assert checkLeftContainsNoKeyFromRight(types, map);
symbols.putAll(map);
}
@@ -81,6 +85,18 @@ public class SymbolSubstTypeMap extends Type.Map {
return (Symbol)symbols.get(key);
}
+ public Map getSymbols() {
+ return new ForwardingMap(symbols) {
+ public Object put(Object key, Object value) {
+ insertSymbol((Symbol)key, (Symbol)value);
+ return null;
+ }
+ public void putAll(Map map) {
+ insertSymbol(map);
+ }
+ };
+ }
+
//########################################################################
// Public Methods - Inserting and removing symbol to type substitutions
@@ -91,11 +107,13 @@ public class SymbolSubstTypeMap extends Type.Map {
public void insertType(Symbol key, Type value) {
assert !symbols.containsKey(key) : Debug.show(key);
+ assert !types.containsKey(key) : Debug.show(key);
types.put(key, value);
}
public void insertType(Map map) {
assert checkLeftContainsNoKeyFromRight(symbols, map);
+ assert checkLeftContainsNoKeyFromRight(types, map);
types.putAll(map);
}
@@ -115,6 +133,18 @@ public class SymbolSubstTypeMap extends Type.Map {
return (Type)types.get(key);
}
+ public Map getTypes() {
+ return new ForwardingMap(types) {
+ public Object put(Object key, Object value) {
+ insertType((Symbol)key, (Type)value);
+ return null;
+ }
+ public void putAll(Map map) {
+ insertType(map);
+ }
+ };
+ }
+
//########################################################################
// Public Methods - Applying the substitutions
@@ -139,7 +169,10 @@ public class SymbolSubstTypeMap extends Type.Map {
return Type.singleType(apply(prefix), (Symbol)value);
}
- // TODO what should we do with PolyTypes?
+ case ThisType(Symbol symbol):
+ Object value = symbols.get(symbol);
+ if (value == null) return super.map(type);
+ return Type.ThisType((Symbol)value);
default:
return super.map(type);