Skip to content

Commit 60fb657

Browse files
committed
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.
1 parent 1125646 commit 60fb657

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ class Definitions {
5656
private def newSyntheticTypeParam(cls: ClassSymbol, scope: MutableScope, paramFlags: FlagSet, suffix: String = "T0") =
5757
newTypeParam(cls, suffix.toTypeName.expandedName(cls), ExpandedName | paramFlags, scope)
5858

59-
private def specialPolyClass(name: TypeName, paramFlags: FlagSet, parentConstrs: Type*): ClassSymbol = {
59+
// NOTE: Ideally we would write `parentConstrs: => Type*` but SIP-24 is only
60+
// implemented in Dotty and not in Scala 2.
61+
// See <http://docs.scala-lang.org/sips/pending/repeated-byname.html>.
62+
private def specialPolyClass(name: TypeName, paramFlags: FlagSet, parentConstrs: => Seq[Type]): ClassSymbol = {
6063
val completer = new LazyType {
6164
def complete(denot: SymDenotation)(implicit ctx: Context): Unit = {
6265
val cls = denot.asClass.classSymbol
@@ -353,10 +356,10 @@ class Definitions {
353356
lazy val BoxedDoubleModule = ctx.requiredModule("java.lang.Double")
354357
lazy val BoxedUnitModule = ctx.requiredModule("java.lang.Void")
355358

356-
lazy val ByNameParamClass2x = specialPolyClass(tpnme.BYNAME_PARAM_CLASS, Covariant, AnyType)
357-
lazy val EqualsPatternClass = specialPolyClass(tpnme.EQUALS_PATTERN, EmptyFlags, AnyType)
359+
lazy val ByNameParamClass2x = specialPolyClass(tpnme.BYNAME_PARAM_CLASS, Covariant, Seq(AnyType))
360+
lazy val EqualsPatternClass = specialPolyClass(tpnme.EQUALS_PATTERN, EmptyFlags, Seq(AnyType))
358361

359-
lazy val RepeatedParamClass = specialPolyClass(tpnme.REPEATED_PARAM_CLASS, Covariant, ObjectType, SeqType)
362+
lazy val RepeatedParamClass = specialPolyClass(tpnme.REPEATED_PARAM_CLASS, Covariant, Seq(ObjectType, SeqType))
360363

361364
// fundamental classes
362365
lazy val StringClass = ctx.requiredClass("java.lang.String")

src/dotty/tools/dotc/core/TypeErasure.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,11 @@ object TypeErasure {
126126
erasureFn(isJava = false, semiEraseVCs = true, isConstructor = false, wildcardOK = false)(tp)(erasureCtx)
127127

128128
def sigName(tp: Type, isJava: Boolean)(implicit ctx: Context): TypeName = {
129-
val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass
130129
val normTp =
131-
if (tp.isRepeatedParam) tp.translateParameterized(defn.RepeatedParamClass, seqClass)
130+
if (tp.isRepeatedParam) {
131+
val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass
132+
tp.translateParameterized(defn.RepeatedParamClass, seqClass)
133+
}
132134
else tp
133135
val erase = erasureFn(isJava, semiEraseVCs = false, isConstructor = false, wildcardOK = true)
134136
erase.sigName(normTp)(erasureCtx)

test/dotc/scala-collections.whitelist

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,7 @@
163163
./scala-scala/src/library/scala/collection/Searching.scala
164164

165165

166-
# cyclic reference involving trait Seq
167-
#./scala-scala/src/library/scala/collection/Seq.scala
166+
./scala-scala/src/library/scala/collection/Seq.scala
168167

169168
./scala-scala/src/library/scala/collection/SeqExtractors.scala
170169

0 commit comments

Comments
 (0)