From 28751a117f32fb163b54e36e20915fd6f2cc39ff Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 26 Jun 2015 14:23:34 +0200 Subject: Get rid of semiEraseVCs boolean parameters Replace by the pair of methods erasure/valueErasure. The boolean parameter is still kept, but only as a confuration parameter of the erasure objects. --- src/dotty/tools/dotc/core/TypeErasure.scala | 21 +++++++++++++-------- src/dotty/tools/dotc/transform/Erasure.scala | 6 +++--- .../tools/dotc/transform/ExtensionMethods.scala | 4 ++-- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/dotty/tools/dotc/core/TypeErasure.scala b/src/dotty/tools/dotc/core/TypeErasure.scala index 8abab9155..9b41eb982 100644 --- a/src/dotty/tools/dotc/core/TypeErasure.scala +++ b/src/dotty/tools/dotc/core/TypeErasure.scala @@ -110,15 +110,20 @@ object TypeErasure { private def erasureCtx(implicit ctx: Context) = if (ctx.erasedTypes) ctx.withPhase(ctx.erasurePhase).addMode(Mode.FutureDefsOK) else ctx - /** The standard erasure of a Scala type. + /** The standard erasure of a Scala type. Value classes are erased as normal classes. + * + * @param tp The type to erase. + */ + def erasure(tp: Type)(implicit ctx: Context): Type = + erasureFn(isJava = false, semiEraseVCs = false, isConstructor = false, wildcardOK = false)(tp)(erasureCtx) + + /** The value class erasure of a Scala type, where value classes are semi-erased to + * ErasedValueType (they will be fully erased in [[ElimErasedValueType]]). * * @param tp The type to erase. - * @param semiEraseVCs If true, value classes are semi-erased to ErasedValueType - * (they will be fully erased in [[ElimErasedValueType]]). - * If false, they are erased like normal classes. */ - def erasure(tp: Type, semiEraseVCs: Boolean = false)(implicit ctx: Context): Type = - erasureFn(isJava = false, semiEraseVCs, isConstructor = false, wildcardOK = false)(tp)(erasureCtx) + def valueErasure(tp: Type)(implicit ctx: Context): Type = + erasureFn(isJava = false, semiEraseVCs = true, isConstructor = false, wildcardOK = false)(tp)(erasureCtx) def sigName(tp: Type, isJava: Boolean)(implicit ctx: Context): TypeName = { val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass @@ -141,7 +146,7 @@ object TypeErasure { case tp: ThisType => tp case tp => - erasure(tp, semiEraseVCs = true) + valueErasure(tp) } /** The symbol's erased info. This is the type's erasure, except for the following symbols: @@ -392,7 +397,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean private def eraseDerivedValueClassRef(tref: TypeRef)(implicit ctx: Context): Type = { val cls = tref.symbol.asClass val underlying = underlyingOfValueClass(cls) - ErasedValueType(cls, erasure(underlying, semiEraseVCs = true)) + ErasedValueType(cls, valueErasure(underlying)) } diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala index 8446e2626..8b4c6a87d 100644 --- a/src/dotty/tools/dotc/transform/Erasure.scala +++ b/src/dotty/tools/dotc/transform/Erasure.scala @@ -270,7 +270,7 @@ object Erasure extends TypeTestsCasts{ def erasedType(tree: untpd.Tree)(implicit ctx: Context): Type = { val tp = tree.typeOpt - if (tree.isTerm) erasedRef(tp) else erasure(tp, semiEraseVCs = true) + if (tree.isTerm) erasedRef(tp) else valueErasure(tp) } override def promote(tree: untpd.Tree)(implicit ctx: Context): tree.ThisTree[Type] = { @@ -285,7 +285,7 @@ object Erasure extends TypeTestsCasts{ * are handled separately by [[typedDefDef]], [[typedValDef]] and [[typedTyped]]. */ override def typedTypeTree(tree: untpd.TypeTree, pt: Type)(implicit ctx: Context): TypeTree = - tree.withType(erasure(tree.tpe, semiEraseVCs = false)) + tree.withType(erasure(tree.tpe)) /** This override is only needed to semi-erase type ascriptions */ override def typedTyped(tree: untpd.Typed, pt: Type)(implicit ctx: Context): Tree = { @@ -454,7 +454,7 @@ object Erasure extends TypeTestsCasts{ if (pt.isValueType) pt else { if (tree.typeOpt.derivesFrom(ctx.definitions.UnitClass)) tree.typeOpt - else erasure(tree.typeOpt, semiEraseVCs = true) + else valueErasure(tree.typeOpt) } } diff --git a/src/dotty/tools/dotc/transform/ExtensionMethods.scala b/src/dotty/tools/dotc/transform/ExtensionMethods.scala index 503016d8b..f50e3324d 100644 --- a/src/dotty/tools/dotc/transform/ExtensionMethods.scala +++ b/src/dotty/tools/dotc/transform/ExtensionMethods.scala @@ -14,7 +14,7 @@ import core._ import Phases.Phase import Types._, Contexts._, Constants._, Names._, NameOps._, Flags._, DenotTransformers._ import SymDenotations._, Symbols._, StdNames._, Annotations._, Trees._, Scopes._, Denotations._ -import TypeErasure.{ erasure, ErasedValueType } +import TypeErasure.{ erasure, valueErasure, ErasedValueType } import TypeUtils._ import util.Positions._ import Decorators._ @@ -65,7 +65,7 @@ class ExtensionMethods extends MiniPhaseTransform with DenotTransformer with Ful } } - val underlying = erasure(underlyingOfValueClass(valueClass), semiEraseVCs = true) + val underlying = valueErasure(underlyingOfValueClass(valueClass)) val evt = ErasedValueType(valueClass, underlying) val u2evtSym = ctx.newSymbol(moduleSym, nme.U2EVT, Synthetic | Method, MethodType(List(nme.x_0), List(underlying), evt)) -- cgit v1.2.3