diff options
Diffstat (limited to 'src/dotty/tools/dotc/core/Substituters.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/Substituters.scala | 351 |
1 files changed, 174 insertions, 177 deletions
diff --git a/src/dotty/tools/dotc/core/Substituters.scala b/src/dotty/tools/dotc/core/Substituters.scala index 9036e52c6..8255a6750 100644 --- a/src/dotty/tools/dotc/core/Substituters.scala +++ b/src/dotty/tools/dotc/core/Substituters.scala @@ -5,203 +5,200 @@ import Types._, Symbols._, Contexts._ /** Substitution operations on types. See the corresponding `subst` and * `substThis` methods on class Type for an explanation. */ -object Substituters { - - class SubstOps(val tp: Type) extends AnyVal { - - def subst(from: PolyType, to: PolyType, map: SubstPolyMap = null)(implicit ctx: Context): Type = - tp match { - case tp @ PolyParam(pt, n) => - if (pt eq from) PolyParam(to, n) else tp - case tp: NamedType => - if (tp.symbol.isStatic) tp - else tp.derivedNamedType(tp.prefix.subst(from, to, map), tp.name) - case ThisType(_) - | MethodParam(_, _) - | NoPrefix => tp - case _ => - val substMap = if (map != null) map else new SubstPolyMap(from, to) - tp match { - case tp: AppliedType => - tp.derivedAppliedType( - substMap(tp.tycon), tp.typeArgs mapConserve substMap) - case _ => - substMap mapOver tp - } - } - - def subst(from: MethodType, to: MethodType, map: SubstMethodMap)(implicit ctx: Context): Type = - tp match { - case tp @ MethodParam(mt, n) => - if (mt eq from) MethodParam(to, n) else tp - case tp: NamedType => - if (tp.symbol.isStatic) tp - else tp.derivedNamedType(tp.prefix.subst(from, to, map), tp.name) - case ThisType(_) - | PolyParam(_, _) - | NoPrefix => tp - case _ => - val substMap = if (map != null) map else new SubstMethodMap(from, to) - tp match { - case tp: AppliedType => - tp.derivedAppliedType( - substMap(tp.tycon), tp.typeArgs mapConserve substMap) - case _ => - substMap mapOver tp - } - } - - def subst1(from: Symbol, to: Type, map: Subst1Map)(implicit ctx: Context): Type = { - tp match { - case tp: NamedType => - val sym = tp.symbol - if (tp.prefix eq NoPrefix) { - if (sym eq from) return to - } - if (sym.isStatic) tp - else tp.derivedNamedType(tp.prefix.subst1(from, to, map), tp.name) - case ThisType(_) - | MethodParam(_, _) - | PolyParam(_, _) - | NoPrefix => tp - case _ => - val substMap = if (map != null) map else new Subst1Map(from, to) - tp match { - case tp: AppliedType => - tp.derivedAppliedType( - substMap(tp.tycon), tp.typeArgs mapConserve substMap) - case _ => - substMap mapOver tp - } - } +trait Substituters { this: Context => + + final def subst(tp: Type, from: PolyType, to: PolyType, map: SubstPolyMap = null): Type = + tp match { + case tp @ PolyParam(pt, n) => + if (pt eq from) PolyParam(to, n) else tp + case tp: NamedType => + if (tp.symbol.isStatic) tp + else tp.derivedNamedType(subst(tp.prefix, from, to, map), tp.name) + case ThisType(_) + | MethodParam(_, _) + | NoPrefix => tp + case _ => + val substMap = if (map != null) map else new SubstPolyMap(from, to) + tp match { + case tp: AppliedType => + tp.derivedAppliedType( + substMap(tp.tycon), tp.typeArgs mapConserve substMap) + case _ => + substMap mapOver tp + } } - def subst2(from1: Symbol, to1: Type, from2: Symbol, to2: Type, map: Subst2Map)(implicit ctx: Context): Type = { - tp match { - case tp: NamedType => - val sym = tp.symbol - if (tp.prefix eq NoPrefix) { - if (sym eq from1) return to1 - if (sym eq from2) return to2 - } - if (sym.isStatic) tp - else tp.derivedNamedType(tp.prefix.subst2(from1, to1, from2, to2, map), tp.name) - case ThisType(_) - | MethodParam(_, _) - | PolyParam(_, _) - | NoPrefix => tp - case _ => - val substMap = if (map != null) map else new Subst2Map(from1, to1, from2, to2) - tp match { - case tp: AppliedType => - tp.derivedAppliedType( - substMap(tp.tycon), tp.typeArgs mapConserve substMap) - case _ => - substMap mapOver tp - } - } + final def subst(tp: Type, from: MethodType, to: MethodType, map: SubstMethodMap): Type = + tp match { + case tp @ MethodParam(mt, n) => + if (mt eq from) MethodParam(to, n) else tp + case tp: NamedType => + if (tp.symbol.isStatic) tp + else tp.derivedNamedType(subst(tp.prefix, from, to, map), tp.name) + case ThisType(_) + | PolyParam(_, _) + | NoPrefix => tp + case _ => + val substMap = if (map != null) map else new SubstMethodMap(from, to) + tp match { + case tp: AppliedType => + tp.derivedAppliedType( + substMap(tp.tycon), tp.typeArgs mapConserve substMap) + case _ => + substMap mapOver tp + } } - def subst(from: List[Symbol], to: List[Type], map: SubstMap)(implicit ctx: Context): Type = { - tp match { - case tp: NamedType => - val sym = tp.symbol - if (tp.prefix eq NoPrefix) { - var fs = from - var ts = to - while (fs.nonEmpty) { - if (fs.head eq sym) return ts.head - fs = fs.tail - ts = ts.tail - } - } - if (sym.isStatic) tp - else tp.derivedNamedType(tp.prefix.subst(from, to, map), tp.name) - case ThisType(_) - | MethodParam(_, _) - | PolyParam(_, _) - | NoPrefix => tp - case _ => - val substMap = if (map != null) map else new SubstMap(from, to) - tp match { - case tp: AppliedType => - tp.derivedAppliedType( - substMap(tp.tycon), tp.typeArgs mapConserve substMap) - case _ => - substMap mapOver tp - } - } + final def subst1(tp: Type, from: Symbol, to: Type, map: Subst1Map): Type = { + tp match { + case tp: NamedType => + val sym = tp.symbol + if (tp.prefix eq NoPrefix) { + if (sym eq from) return to + } + if (sym.isStatic) tp + else tp.derivedNamedType(subst1(tp.prefix, from, to, map), tp.name) + case ThisType(_) + | MethodParam(_, _) + | PolyParam(_, _) + | NoPrefix => tp + case _ => + val substMap = if (map != null) map else new Subst1Map(from, to) + tp match { + case tp: AppliedType => + tp.derivedAppliedType( + substMap(tp.tycon), tp.typeArgs mapConserve substMap) + case _ => + substMap mapOver tp + } + } + } + + final def subst2(tp: Type, from1: Symbol, to1: Type, from2: Symbol, to2: Type, map: Subst2Map): Type = { + tp match { + case tp: NamedType => + val sym = tp.symbol + if (tp.prefix eq NoPrefix) { + if (sym eq from1) return to1 + if (sym eq from2) return to2 + } + if (sym.isStatic) tp + else tp.derivedNamedType(subst2(tp.prefix, from1, to1, from2, to2, map), tp.name) + case ThisType(_) + | MethodParam(_, _) + | PolyParam(_, _) + | NoPrefix => tp + case _ => + val substMap = if (map != null) map else new Subst2Map(from1, to1, from2, to2) + tp match { + case tp: AppliedType => + tp.derivedAppliedType( + substMap(tp.tycon), tp.typeArgs mapConserve substMap) + case _ => + substMap mapOver tp + } } + } - def substThis(from: ClassSymbol, to: Type, map: SubstThisMap)(implicit ctx: Context): Type = - tp match { - case tp @ ThisType(clazz) => - if (clazz eq from) to else tp - case tp: NamedType => - if (tp.symbol.isStatic) tp - else tp.derivedNamedType(tp.prefix.substThis(from, to, map), tp.name) - case MethodParam(_, _) - | PolyParam(_, _) - | NoPrefix => tp - case _ => - val substMap = if (map != null) map else new SubstThisMap(from, to) - tp match { - case tp: AppliedType => - tp.derivedAppliedType( - substMap(tp.tycon), tp.typeArgs mapConserve substMap) - case _ => - substMap mapOver tp + final def subst(tp: Type, from: List[Symbol], to: List[Type], map: SubstMap): Type = { + tp match { + case tp: NamedType => + val sym = tp.symbol + if (tp.prefix eq NoPrefix) { + var fs = from + var ts = to + while (fs.nonEmpty) { + if (fs.head eq sym) return ts.head + fs = fs.tail + ts = ts.tail } - } - - def substThis(from: RefinedType, to: Type, map: SubstRefinedThisMap)(implicit ctx: Context): Type = - tp match { - case tp @ RefinedThis(rt) => - if (rt eq from) to else tp - case tp: NamedType => - if (tp.symbol.isStatic) tp - else tp.derivedNamedType(tp.prefix.substThis(from, to, map), tp.name) - case ThisType(_) - | MethodParam(_, _) - | PolyParam(_, _) - | NoPrefix => tp - case _ => - val substMap = if (map != null) map else new SubstRefinedThisMap(from, to) - tp match { - case tp: AppliedType => - tp.derivedAppliedType( - substMap(tp.tycon), tp.typeArgs mapConserve substMap) - case _ => - substMap mapOver tp - } - } + } + if (sym.isStatic) tp + else tp.derivedNamedType(subst(tp.prefix, from, to, map), tp.name) + case ThisType(_) + | MethodParam(_, _) + | PolyParam(_, _) + | NoPrefix => tp + case _ => + val substMap = if (map != null) map else new SubstMap(from, to) + tp match { + case tp: AppliedType => + tp.derivedAppliedType( + substMap(tp.tycon), tp.typeArgs mapConserve substMap) + case _ => + substMap mapOver tp + } + } } - class SubstPolyMap(from: PolyType, to: PolyType)(implicit ctx: Context) extends TypeMap { - def apply(tp: Type) = tp.subst(from, to, this) + final def substThis(tp: Type, from: ClassSymbol, to: Type, map: SubstThisMap): Type = + tp match { + case tp @ ThisType(clazz) => + if (clazz eq from) to else tp + case tp: NamedType => + if (tp.symbol.isStatic) tp + else tp.derivedNamedType(substThis(tp.prefix, from, to, map), tp.name) + case MethodParam(_, _) + | PolyParam(_, _) + | NoPrefix => tp + case _ => + val substMap = if (map != null) map else new SubstThisMap(from, to) + tp match { + case tp: AppliedType => + tp.derivedAppliedType( + substMap(tp.tycon), tp.typeArgs mapConserve substMap) + case _ => + substMap mapOver tp + } + } + + final def substThis(tp: Type, from: RefinedType, to: Type, map: SubstRefinedThisMap): Type = + tp match { + case tp @ RefinedThis(rt) => + if (rt eq from) to else tp + case tp: NamedType => + if (tp.symbol.isStatic) tp + else tp.derivedNamedType(substThis(tp.prefix, from, to, map), tp.name) + case ThisType(_) + | MethodParam(_, _) + | PolyParam(_, _) + | NoPrefix => tp + case _ => + val substMap = if (map != null) map else new SubstRefinedThisMap(from, to) + tp match { + case tp: AppliedType => + tp.derivedAppliedType( + substMap(tp.tycon), tp.typeArgs mapConserve substMap) + case _ => + substMap mapOver tp + } + } + + final class SubstPolyMap(from: PolyType, to: PolyType) extends TypeMap { + def apply(tp: Type) = subst(tp, from, to, this) } - class SubstMethodMap(from: MethodType, to: MethodType)(implicit ctx: Context) extends TypeMap { - def apply(tp: Type) = tp.subst(from, to, this) + final class SubstMethodMap(from: MethodType, to: MethodType) extends TypeMap { + def apply(tp: Type) = subst(tp, from, to, this) } - class Subst1Map(from: Symbol, to: Type)(implicit ctx: Context) extends TypeMap { - def apply(tp: Type) = tp.subst1(from, to, this) + final class Subst1Map(from: Symbol, to: Type) extends TypeMap { + def apply(tp: Type) = subst1(tp, from, to, this) } - class Subst2Map(from1: Symbol, to1: Type, from2: Symbol, to2: Type)(implicit ctx: Context) extends TypeMap { - def apply(tp: Type) = tp.subst2(from1, to1, from2, to2, this) + final class Subst2Map(from1: Symbol, to1: Type, from2: Symbol, to2: Type) extends TypeMap { + def apply(tp: Type) = subst2(tp, from1, to1, from2, to2, this) } - class SubstMap(from: List[Symbol], to: List[Type])(implicit ctx: Context) extends TypeMap { - def apply(tp: Type): Type = tp.subst(from, to, this) + final class SubstMap(from: List[Symbol], to: List[Type]) extends TypeMap { + def apply(tp: Type): Type = subst(tp, from, to, this) } - class SubstThisMap(from: ClassSymbol, to: Type)(implicit ctx: Context) extends TypeMap { - def apply(tp: Type): Type = tp.substThis(from, to, this) + final class SubstThisMap(from: ClassSymbol, to: Type) extends TypeMap { + def apply(tp: Type): Type = substThis(tp, from, to, this) } - class SubstRefinedThisMap(from: RefinedType, to: Type)(implicit ctx: Context) extends TypeMap { - def apply(tp: Type): Type = tp.substThis(from, to, this) + final class SubstRefinedThisMap(from: RefinedType, to: Type) extends TypeMap { + def apply(tp: Type): Type = substThis(tp, from, to, this) } }
\ No newline at end of file |