From 60fb657649d800c03e8335892cd82455e7e34235 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 1 Dec 2015 16:52:01 +0100 Subject: Compile scala.collection.Seq without double-binding error This commit fixes two issues which caused us to complete Seq too early and read it from the classpath instead of from the sources: - Evaluting RepeatedParamClass forced Seq, this is not necessary because the type of RepeatedParamClass is a LazyType - TypeErasure#sigName on a Scala type always forced Seq, even if the type is not a repeated param type. This fixes #980. --- src/dotty/tools/dotc/core/Definitions.scala | 11 +++++++---- src/dotty/tools/dotc/core/TypeErasure.scala | 6 ++++-- test/dotc/scala-collections.whitelist | 3 +-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala index 433b8544a..4556dd9d5 100644 --- a/src/dotty/tools/dotc/core/Definitions.scala +++ b/src/dotty/tools/dotc/core/Definitions.scala @@ -56,7 +56,10 @@ class Definitions { private def newSyntheticTypeParam(cls: ClassSymbol, scope: MutableScope, paramFlags: FlagSet, suffix: String = "T0") = newTypeParam(cls, suffix.toTypeName.expandedName(cls), ExpandedName | paramFlags, scope) - private def specialPolyClass(name: TypeName, paramFlags: FlagSet, parentConstrs: Type*): ClassSymbol = { + // NOTE: Ideally we would write `parentConstrs: => Type*` but SIP-24 is only + // implemented in Dotty and not in Scala 2. + // See . + private def specialPolyClass(name: TypeName, paramFlags: FlagSet, parentConstrs: => Seq[Type]): ClassSymbol = { val completer = new LazyType { def complete(denot: SymDenotation)(implicit ctx: Context): Unit = { val cls = denot.asClass.classSymbol @@ -353,10 +356,10 @@ class Definitions { lazy val BoxedDoubleModule = ctx.requiredModule("java.lang.Double") lazy val BoxedUnitModule = ctx.requiredModule("java.lang.Void") - lazy val ByNameParamClass2x = specialPolyClass(tpnme.BYNAME_PARAM_CLASS, Covariant, AnyType) - lazy val EqualsPatternClass = specialPolyClass(tpnme.EQUALS_PATTERN, EmptyFlags, AnyType) + lazy val ByNameParamClass2x = specialPolyClass(tpnme.BYNAME_PARAM_CLASS, Covariant, Seq(AnyType)) + lazy val EqualsPatternClass = specialPolyClass(tpnme.EQUALS_PATTERN, EmptyFlags, Seq(AnyType)) - lazy val RepeatedParamClass = specialPolyClass(tpnme.REPEATED_PARAM_CLASS, Covariant, ObjectType, SeqType) + lazy val RepeatedParamClass = specialPolyClass(tpnme.REPEATED_PARAM_CLASS, Covariant, Seq(ObjectType, SeqType)) // fundamental classes lazy val StringClass = ctx.requiredClass("java.lang.String") diff --git a/src/dotty/tools/dotc/core/TypeErasure.scala b/src/dotty/tools/dotc/core/TypeErasure.scala index 7cca37911..108d862a9 100644 --- a/src/dotty/tools/dotc/core/TypeErasure.scala +++ b/src/dotty/tools/dotc/core/TypeErasure.scala @@ -126,9 +126,11 @@ object TypeErasure { erasureFn(isJava = false, semiEraseVCs = true, isConstructor = false, wildcardOK = false)(tp)(erasureCtx) def sigName(tp: Type, isJava: Boolean)(implicit ctx: Context): TypeName = { - val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass val normTp = - if (tp.isRepeatedParam) tp.translateParameterized(defn.RepeatedParamClass, seqClass) + if (tp.isRepeatedParam) { + val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass + tp.translateParameterized(defn.RepeatedParamClass, seqClass) + } else tp val erase = erasureFn(isJava, semiEraseVCs = false, isConstructor = false, wildcardOK = true) erase.sigName(normTp)(erasureCtx) diff --git a/test/dotc/scala-collections.whitelist b/test/dotc/scala-collections.whitelist index a0c9ce588..4f87fadf8 100644 --- a/test/dotc/scala-collections.whitelist +++ b/test/dotc/scala-collections.whitelist @@ -163,8 +163,7 @@ ./scala-scala/src/library/scala/collection/Searching.scala -# cyclic reference involving trait Seq -#./scala-scala/src/library/scala/collection/Seq.scala +./scala-scala/src/library/scala/collection/Seq.scala ./scala-scala/src/library/scala/collection/SeqExtractors.scala -- cgit v1.2.3