aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-09-25 15:06:59 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-10-11 06:38:11 +0200
commitd936dec0c27d43dc861194594ecc22c4770450bd (patch)
tree89abb9304f18999b312a5359fa4a845e0ba2bbf4 /src/dotty/tools/dotc
parenteb2e265e12d10aa28c63bbe99b2c4a4a79ee8869 (diff)
downloaddotty-d936dec0c27d43dc861194594ecc22c4770450bd.tar.gz
dotty-d936dec0c27d43dc861194594ecc22c4770450bd.tar.bz2
dotty-d936dec0c27d43dc861194594ecc22c4770450bd.zip
Make productArity a synthetic method which can be overridden
Like other synthetic methods, productArity will not be generated if an explicit definition is given. Used to be generated unconditionally in desugaring.
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r--src/dotty/tools/dotc/ast/Desugar.scala3
-rw-r--r--src/dotty/tools/dotc/core/Definitions.scala1
-rw-r--r--src/dotty/tools/dotc/transform/SyntheticMethods.scala5
3 files changed, 5 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/ast/Desugar.scala b/src/dotty/tools/dotc/ast/Desugar.scala
index 9f37326f6..e2152066f 100644
--- a/src/dotty/tools/dotc/ast/Desugar.scala
+++ b/src/dotty/tools/dotc/ast/Desugar.scala
@@ -287,7 +287,6 @@ object desugar {
def syntheticProperty(name: TermName, rhs: Tree) =
DefDef(synthetic, name, Nil, Nil, TypeTree(), rhs)
val isDefinedMeth = syntheticProperty(nme.isDefined, Literal(Constant(true)))
- val productArityMeth = syntheticProperty(nme.productArity, Literal(Constant(arity)))
val caseParams = constrVparamss.head.toArray
val productElemMeths = for (i <- 0 until arity) yield
syntheticProperty(nme.selectorName(i), Select(This(EmptyTypeName), caseParams(i).name))
@@ -302,7 +301,7 @@ object desugar {
cpy.ValDef(vparam)(rhs = EmptyTree))
DefDef(synthetic, nme.copy, derivedTparams, copyFirstParams :: copyRestParamss, TypeTree(), creatorExpr) :: Nil
}
- copyMeths ::: isDefinedMeth :: productArityMeth :: productElemMeths.toList
+ copyMeths ::: isDefinedMeth :: productElemMeths.toList
}
else Nil
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala
index 1bc60f053..4914f667a 100644
--- a/src/dotty/tools/dotc/core/Definitions.scala
+++ b/src/dotty/tools/dotc/core/Definitions.scala
@@ -296,6 +296,7 @@ class Definitions {
lazy val ComparableClass = ctx.requiredClass("java.lang.Comparable")
lazy val ProductClass = ctx.requiredClass("scala.Product")
lazy val Product_canEqual = ProductClass.requiredMethod(nme.canEqual_)
+ lazy val Product_productArity = ProductClass.requiredMethod(nme.productArity)
lazy val LanguageModuleClass = ctx.requiredModule("dotty.language").moduleClass.asClass
// Annotation base classes
diff --git a/src/dotty/tools/dotc/transform/SyntheticMethods.scala b/src/dotty/tools/dotc/transform/SyntheticMethods.scala
index 0af3ef895..34cca2872 100644
--- a/src/dotty/tools/dotc/transform/SyntheticMethods.scala
+++ b/src/dotty/tools/dotc/transform/SyntheticMethods.scala
@@ -41,14 +41,14 @@ class SyntheticMethods extends MiniPhaseTransform with IdentityDenotTransformer
override def init(implicit ctx: Context, info: TransformerInfo) = {
valueSymbols = List(defn.Any_hashCode, defn.Any_equals)
- caseSymbols = valueSymbols ++ List(defn.Any_toString, defn.Product_canEqual)
+ caseSymbols = valueSymbols ++ List(defn.Any_toString, defn.Product_canEqual, defn.Product_productArity)
}
/** The synthetic methods of the case or value class `clazz`.
*/
def syntheticMethods(clazz: ClassSymbol)(implicit ctx: Context): List[Tree] = {
val clazzType = clazz.typeRef
- def accessors = clazz.decls.filter(_ is CaseAccessor)
+ def accessors = clazz.decls.filter(_ is CaseAccessor).toList
val symbolsToSynthesize: List[Symbol] =
if (clazz.is(Case)) caseSymbols
@@ -75,6 +75,7 @@ class SyntheticMethods extends MiniPhaseTransform with IdentityDenotTransformer
case nme.toString_ => forwardToRuntime
case nme.equals_ => vrefss => equalsBody(vrefss.head.head)
case nme.canEqual_ => vrefss => canEqualBody(vrefss.head.head)
+ case nme.productArity => vrefss => Literal(Constant(accessors.length))
}
ctx.log(s"adding $synthetic to $clazz at ${ctx.phase}")
DefDef(synthetic, syntheticRHS(ctx.withOwner(synthetic)))