File tree 3 files changed +25
-1
lines changed 3 files changed +25
-1
lines changed Original file line number Diff line number Diff line change @@ -539,7 +539,7 @@ class Definitions {
539
539
540
540
// ----- primitive value class machinery ------------------------------------------
541
541
542
- lazy val ScalaNumericValueClasses : collection. Set [ Symbol ] = Set (
542
+ lazy val ScalaNumericValueClassList = List (
543
543
ByteClass ,
544
544
ShortClass ,
545
545
CharClass ,
@@ -548,6 +548,7 @@ class Definitions {
548
548
FloatClass ,
549
549
DoubleClass )
550
550
551
+ lazy val ScalaNumericValueClasses : collection.Set [Symbol ] = ScalaNumericValueClassList .toSet
551
552
lazy val ScalaValueClasses : collection.Set [Symbol ] = ScalaNumericValueClasses + UnitClass + BooleanClass
552
553
553
554
lazy val ScalaBoxedClasses = ScalaValueClasses map boxedClass
Original file line number Diff line number Diff line change @@ -386,6 +386,9 @@ object SymDenotations {
386
386
/** Is symbol a primitive value class? */
387
387
def isPrimitiveValueClass (implicit ctx : Context ) = defn.ScalaValueClasses contains symbol
388
388
389
+ /** Is symbol a primitive value class? */
390
+ def isNumericValueClass (implicit ctx : Context ) = defn.ScalaNumericValueClasses contains symbol
391
+
389
392
/** Is symbol a phantom class for which no runtime representation exists? */
390
393
def isPhantomClass (implicit ctx : Context ) = defn.PhantomClasses contains symbol
391
394
Original file line number Diff line number Diff line change @@ -1024,6 +1024,26 @@ trait Applications extends Compatibility { self: Typer =>
1024
1024
result
1025
1025
}
1026
1026
}
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
+ }
1027
1047
}
1028
1048
1029
1049
/*
You can’t perform that action at this time.
0 commit comments