Skip to content

Commit eb2472d

Browse files
authored
Merge pull request #3566 from dotty-staging/fix-repl-alias
REPL: do not dealias before printing types
2 parents 4fae88a + f1f3558 commit eb2472d

File tree

8 files changed

+45
-35
lines changed

8 files changed

+45
-35
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ class Definitions {
194194
else NoSymbol)
195195
cls
196196
}
197+
lazy val ScalaPackageObjectRef = ctx.requiredModuleRef("scala.package")
197198
lazy val JavaPackageVal = ctx.requiredPackage("java")
198199
lazy val JavaLangPackageVal = ctx.requiredPackage("java.lang")
199200
// fundamental modules

compiler/src/dotty/tools/dotc/core/Types.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,12 @@ object Types {
700700
(name, buf) => buf += member(name).asSingleDenotation)
701701
}
702702

703+
/** The set of type alias members of this type */
704+
final def typeAliasMembers(implicit ctx: Context): Seq[SingleDenotation] = track("typeAlias") {
705+
memberDenots(typeAliasNameFilter,
706+
(name, buf) => buf += member(name).asSingleDenotation)
707+
}
708+
703709
/** The set of type members of this type */
704710
final def typeMembers(implicit ctx: Context): Seq[SingleDenotation] = track("typeMembers") {
705711
memberDenots(typeNameFilter,
@@ -4411,6 +4417,15 @@ object Types {
44114417
name.isTermName && pre.nonPrivateMember(name).hasAltWith(_.symbol is Deferred)
44124418
}
44134419

4420+
/** A filter for names of type aliases of a given type */
4421+
object typeAliasNameFilter extends NameFilter {
4422+
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean =
4423+
name.isTypeName && {
4424+
val mbr = pre.nonPrivateMember(name)
4425+
mbr.symbol.isAliasType
4426+
}
4427+
}
4428+
44144429
object typeNameFilter extends NameFilter {
44154430
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean = name.isTypeName
44164431
}

compiler/src/dotty/tools/dotc/printing/PlainPrinter.scala

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,13 @@ class PlainPrinter(_ctx: Context) extends Printer {
136136
case _ => Nil
137137
})
138138

139+
/** Direct references to these symbols are printed without their prefix for convenience.
140+
* They are either aliased in scala.Predef or in the scala package object.
141+
*/
142+
private[this] lazy val printWithoutPrefix: Set[Symbol] =
143+
(defn.ScalaPredefModuleRef.typeAliasMembers
144+
++ defn.ScalaPackageObjectRef.typeAliasMembers).map(_.info.classSymbol).toSet
145+
139146
def toText(tp: Type): Text = controlled {
140147
homogenize(tp) match {
141148
case tp: TypeType =>
@@ -147,7 +154,10 @@ class PlainPrinter(_ctx: Context) extends Printer {
147154
case tp: TermRef if tp.denot.isOverloaded =>
148155
"<overloaded " ~ toTextRef(tp) ~ ">"
149156
case tp: TypeRef =>
150-
toTextPrefix(tp.prefix) ~ selectionString(tp)
157+
if (printWithoutPrefix.contains(tp.symbol))
158+
toText(tp.name)
159+
else
160+
toTextPrefix(tp.prefix) ~ selectionString(tp)
151161
case tp: TermParamRef =>
152162
ParamRefNameString(tp) ~ ".type"
153163
case tp: TypeParamRef =>

compiler/src/dotty/tools/dotc/printing/UserFacingPrinter.scala

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,6 @@ class UserFacingPrinter(_ctx: Context) extends RefinedPrinter(_ctx) {
1111
private[this] def getPkgCls(path: String) =
1212
_ctx.requiredPackage(path).moduleClass.asClass
1313

14-
private lazy val collectionPkg = getPkgCls("scala.collection")
15-
private lazy val immutablePkg = getPkgCls("scala.collection.immutable")
16-
private lazy val scalaPkg = defn.ScalaPackageClass
17-
private lazy val javaLangPkg = defn.JavaLangPackageVal.moduleClass.asClass
18-
19-
def standardPkg(pkgSym: Symbol) = pkgSym match {
20-
case `scalaPkg` | `collectionPkg` | `immutablePkg` | `javaLangPkg` => true
21-
case _ => false
22-
}
23-
24-
def wrappedName(pkgSym: Symbol) =
25-
pkgSym.name.toTermName == nme.EMPTY_PACKAGE ||
26-
pkgSym.name.isReplWrapperName
27-
28-
def wellKnownPkg(pkgSym: Symbol) = standardPkg(pkgSym) || wrappedName(pkgSym)
29-
3014
override protected def keyString(sym: Symbol): String =
3115
if (sym.flagsUNSAFE is Package) "" else super.keyString(sym)
3216

@@ -55,22 +39,6 @@ class UserFacingPrinter(_ctx: Context) extends RefinedPrinter(_ctx) {
5539
override def toText(tp: Type): Text = tp match {
5640
case ExprType(result) => ":" ~~ toText(result)
5741
case tp: ConstantType => toText(tp.value)
58-
case tp: TypeRef => tp.info match {
59-
case TypeAlias(alias) => toText(alias)
60-
case _ => toText(tp.info)
61-
}
62-
case tp: ClassInfo => {
63-
if (wellKnownPkg(tp.cls.owner)) nameString(tp.cls.name)
64-
else {
65-
def printPkg(sym: ClassSymbol): Text =
66-
if (sym.owner == defn.RootClass || wrappedName(sym.owner))
67-
nameString(sym.name.stripModuleClassSuffix)
68-
else
69-
printPkg(sym.owner.asClass) ~ "." ~ toText(sym)
70-
71-
printPkg(tp.cls.owner.asClass) ~ "." ~ nameString(tp.cls.name)
72-
}
73-
}
7442
case tp => super.toText(tp)
7543
}
7644
}

compiler/test-resources/repl/importFromObj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ scala> import o._
77
scala> buf += xs
88
1 | buf += xs
99
| ^^
10-
| found: scala.collection.immutable.List[Int](o.xs)
10+
| found: List[Int](o.xs)
1111
| required: Int
1212
|
1313
scala> buf ++= xs
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
scala> type Identity[T] = T
2+
// defined alias type Identity = [T] => T
3+
scala> def foo[T](x: T): Identity[T] = x
4+
def foo[T](x: T): Identity[T]
5+
scala> foo(1)
6+
val res0: Identity[Int] = 1
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
scala> List(1,2,3)
2+
val res0: List[Int] = List(1, 2, 3)
3+
scala> Map("foo" -> 1)
4+
val res1: Map[String, Int] = Map("foo" -> 1)
5+
scala> Seq('a','b')
6+
val res2: Seq[Char] = List(a, b)
7+
scala> Set(4, 5)
8+
val res3: Set[Int] = Set(4, 5)
9+
scala> Iterator(1)
10+
val res4: Iterator[Int] = non-empty iterator

compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ class ErrorMessagesTests extends ErrorMessagesTest {
493493
val DoesNotConformToBound(tpe, which, bound) :: Nil = messages
494494
assertEquals("Int", tpe.show)
495495
assertEquals("upper", which)
496-
assertEquals("scala.collection.immutable.List[Int]", bound.show)
496+
assertEquals("List[Int]", bound.show)
497497
}
498498

499499
@Test def doesNotConformToSelfType =

0 commit comments

Comments
 (0)