@@ -24,7 +24,8 @@ class TupleOptimizations extends MiniPhase with IdentityDenotTransformer {
24
24
def phaseName : String = " genericTuples"
25
25
26
26
override def transformApply (tree : tpd.Apply )(implicit ctx : Context ): tpd.Tree = {
27
- if (tree.symbol == defn.DynamicTuple_dynamicCons ) transformTupleCons(tree)
27
+ if (! tree.symbol.exists || tree.symbol.owner != defn.DynamicTupleModuleClass ) super .transformApply(tree)
28
+ else if (tree.symbol == defn.DynamicTuple_dynamicCons ) transformTupleCons(tree)
28
29
else if (tree.symbol == defn.DynamicTuple_dynamicTail ) transformTupleTail(tree)
29
30
else if (tree.symbol == defn.DynamicTuple_dynamicSize ) transformTupleSize(tree)
30
31
else if (tree.symbol == defn.DynamicTuple_dynamicConcat ) transformTupleConcat(tree)
@@ -34,8 +35,7 @@ class TupleOptimizations extends MiniPhase with IdentityDenotTransformer {
34
35
}
35
36
36
37
private def transformTupleCons (tree : tpd.Apply )(implicit ctx : Context ): Tree = {
37
- val TypeApply (_, headType :: tailType :: Nil ) = tree.fun
38
- val tail :: head :: Nil = tree.args
38
+ val head :: tail :: Nil = tree.args
39
39
tupleTypes(tree.tpe) match {
40
40
case Some (tpes) =>
41
41
// Generate a the tuple directly with TupleN+1.apply
@@ -44,7 +44,7 @@ class TupleOptimizations extends MiniPhase with IdentityDenotTransformer {
44
44
// val t = tail
45
45
// TupleN+1(head, t._1, ..., t._n)
46
46
evalOnce(Typed (tail, TypeTree (defn.tupleType(tpes.tail)))) { tup =>
47
- val elements = head :: ( 0 until size - 1 ).map(i => tup.select(nme.selectorName(i))).toList
47
+ val elements = head :: tupleSelectors(tup, size - 1 )
48
48
knownTupleFromElements(tpes, elements)
49
49
}
50
50
} else {
@@ -77,7 +77,7 @@ class TupleOptimizations extends MiniPhase with IdentityDenotTransformer {
77
77
// val t = tup.asInstanceOf[TupleN[...]]
78
78
// TupleN-1(t._2, ..., t._n)
79
79
evalOnce(Typed (tup, TypeTree (defn.tupleType(tpes)))) { tup =>
80
- val elements = ( 1 until size).map(i => tup.select(nme.selectorName(i))).toList
80
+ val elements = tupleSelectors(tup, size).tail
81
81
knownTupleFromElements(tpes.tail, elements)
82
82
}
83
83
} else if (size <= MaxTupleArity + 1 ) {
@@ -125,10 +125,7 @@ class TupleOptimizations extends MiniPhase with IdentityDenotTransformer {
125
125
evalOnce(Typed (self, TypeTree (defn.tupleType(tpes1)))) { self =>
126
126
evalOnce(Typed (that, TypeTree (defn.tupleType(tpes2)))) { that =>
127
127
val types = tpes1 ::: tpes2
128
- val elements = {
129
- (0 until n).map(i => self.select(nme.selectorName(i))) ++
130
- (0 until m).map(i => that.select(nme.selectorName(i)))
131
- }.toList
128
+ val elements = tupleSelectors(self, n) ::: tupleSelectors(that, m)
132
129
knownTupleFromElements(types, elements)
133
130
}
134
131
}
@@ -235,4 +232,8 @@ class TupleOptimizations extends MiniPhase with IdentityDenotTransformer {
235
232
}
236
233
rec(tp.stripTypeVar, Nil , bound)
237
234
}
235
+
236
+ private def tupleSelectors (tup : Tree , size : Int )(implicit ctx : Context ): List [Tree ] =
237
+ (0 until size).map(i => tup.select(nme.selectorName(i))).toList
238
+
238
239
}
0 commit comments