Skip to content

Commit 21fe8b7

Browse files
committed
Add harmonization method for harmonizing numeric types.
1 parent 91bb668 commit 21fe8b7

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ class Definitions {
539539

540540
// ----- primitive value class machinery ------------------------------------------
541541

542-
lazy val ScalaNumericValueClasses: collection.Set[Symbol] = Set(
542+
lazy val ScalaNumericValueClassList = List(
543543
ByteClass,
544544
ShortClass,
545545
CharClass,
@@ -548,6 +548,7 @@ class Definitions {
548548
FloatClass,
549549
DoubleClass)
550550

551+
lazy val ScalaNumericValueClasses: collection.Set[Symbol] = ScalaNumericValueClassList.toSet
551552
lazy val ScalaValueClasses: collection.Set[Symbol] = ScalaNumericValueClasses + UnitClass + BooleanClass
552553

553554
lazy val ScalaBoxedClasses = ScalaValueClasses map boxedClass

src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,9 @@ object SymDenotations {
386386
/** Is symbol a primitive value class? */
387387
def isPrimitiveValueClass(implicit ctx: Context) = defn.ScalaValueClasses contains symbol
388388

389+
/** Is symbol a primitive value class? */
390+
def isNumericValueClass(implicit ctx: Context) = defn.ScalaNumericValueClasses contains symbol
391+
389392
/** Is symbol a phantom class for which no runtime representation exists? */
390393
def isPhantomClass(implicit ctx: Context) = defn.PhantomClasses contains symbol
391394

src/dotty/tools/dotc/typer/Applications.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,26 @@ trait Applications extends Compatibility { self: Typer =>
10241024
result
10251025
}
10261026
}
1027+
1028+
def harmonize(trees: List[Tree])(implicit ctx: Context): List[Tree] = {
1029+
def numericClasses(trees: List[Tree], acc: Set[Symbol]): Set[Symbol] = trees match {
1030+
case tree :: trees1 =>
1031+
val sym = tree.tpe.typeSymbol
1032+
if (sym.isNumericValueClass && tree.tpe.isRef(sym))
1033+
numericClasses(trees1, acc + sym)
1034+
else
1035+
Set()
1036+
case Nil =>
1037+
acc
1038+
}
1039+
val clss = numericClasses(trees, Set())
1040+
if (clss.size > 1) {
1041+
val lub = defn.ScalaNumericValueClassList.find(lubCls =>
1042+
clss.forall(defn.isValueSubClass(_, lubCls))).get.typeRef
1043+
trees.mapConserve(tree => adaptInterpolated(tree, lub, tree))
1044+
}
1045+
else trees
1046+
}
10271047
}
10281048

10291049
/*

0 commit comments

Comments
 (0)