File tree Expand file tree Collapse file tree 3 files changed +25
-1
lines changed Expand file tree Collapse file tree 3 files changed +25
-1
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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/*
You can’t perform that action at this time.
0 commit comments