diff options
author | Martin Odersky <odersky@gmail.com> | 2014-09-25 15:06:59 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-10-11 06:38:11 +0200 |
commit | d936dec0c27d43dc861194594ecc22c4770450bd (patch) | |
tree | 89abb9304f18999b312a5359fa4a845e0ba2bbf4 /src/dotty/tools/dotc | |
parent | eb2e265e12d10aa28c63bbe99b2c4a4a79ee8869 (diff) | |
download | dotty-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.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Definitions.scala | 1 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/SyntheticMethods.scala | 5 |
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))) |