From 8dd3466ff605db006934697edd7b8ffd9af4bf7f Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 22 May 2015 16:56:41 +0200 Subject: Add harmonization method for harmonizing numeric types. --- src/dotty/tools/dotc/core/Definitions.scala | 3 ++- src/dotty/tools/dotc/core/SymDenotations.scala | 3 +++ src/dotty/tools/dotc/typer/Applications.scala | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala index a1b44ec34..1c4d5c282 100644 --- a/src/dotty/tools/dotc/core/Definitions.scala +++ b/src/dotty/tools/dotc/core/Definitions.scala @@ -539,7 +539,7 @@ class Definitions { // ----- primitive value class machinery ------------------------------------------ - lazy val ScalaNumericValueClasses: collection.Set[Symbol] = Set( + lazy val ScalaNumericValueClassList = List( ByteClass, ShortClass, CharClass, @@ -548,6 +548,7 @@ class Definitions { FloatClass, DoubleClass) + lazy val ScalaNumericValueClasses: collection.Set[Symbol] = ScalaNumericValueClassList.toSet lazy val ScalaValueClasses: collection.Set[Symbol] = ScalaNumericValueClasses + UnitClass + BooleanClass lazy val ScalaBoxedClasses = ScalaValueClasses map boxedClass diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index c6264b817..33258b6b6 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -386,6 +386,9 @@ object SymDenotations { /** Is symbol a primitive value class? */ def isPrimitiveValueClass(implicit ctx: Context) = defn.ScalaValueClasses contains symbol + /** Is symbol a primitive value class? */ + def isNumericValueClass(implicit ctx: Context) = defn.ScalaNumericValueClasses contains symbol + /** Is symbol a phantom class for which no runtime representation exists? */ def isPhantomClass(implicit ctx: Context) = defn.PhantomClasses contains symbol diff --git a/src/dotty/tools/dotc/typer/Applications.scala b/src/dotty/tools/dotc/typer/Applications.scala index 855f265cc..e1d3d243d 100644 --- a/src/dotty/tools/dotc/typer/Applications.scala +++ b/src/dotty/tools/dotc/typer/Applications.scala @@ -1024,6 +1024,26 @@ trait Applications extends Compatibility { self: Typer => result } } + + def harmonize(trees: List[Tree])(implicit ctx: Context): List[Tree] = { + def numericClasses(trees: List[Tree], acc: Set[Symbol]): Set[Symbol] = trees match { + case tree :: trees1 => + val sym = tree.tpe.typeSymbol + if (sym.isNumericValueClass && tree.tpe.isRef(sym)) + numericClasses(trees1, acc + sym) + else + Set() + case Nil => + acc + } + val clss = numericClasses(trees, Set()) + if (clss.size > 1) { + val lub = defn.ScalaNumericValueClassList.find(lubCls => + clss.forall(defn.isValueSubClass(_, lubCls))).get.typeRef + trees.mapConserve(tree => adaptInterpolated(tree, lub, tree)) + } + else trees + } } /* -- cgit v1.2.3