Skip to content

Commit 2ae1814

Browse files
authored
Merge pull request #3020 from dotty-staging/topic/inner-obj-printing
Properly escape wrapped names in REPL
2 parents 8429b7b + c64a358 commit 2ae1814

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

repl/src/dotty/tools/repl/UserFacingPrinter.scala

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,17 @@ class UserFacingPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
3333
private lazy val scalaPkg = defn.ScalaPackageClass
3434
private lazy val javaLangPkg = defn.JavaLangPackageVal.moduleClass.asClass
3535

36-
def wellKnownPkg(pkgSym: Symbol) = pkgSym match {
36+
def standardPkg(pkgSym: Symbol) = pkgSym match {
3737
case `scalaPkg` | `collectionPkg` | `immutablePkg` | `javaLangPkg` => true
38-
case pkgSym =>
39-
pkgSym.name.toTermName == nme.EMPTY_PACKAGE ||
40-
pkgSym.name.isReplWrapperName
38+
case _ => false
4139
}
4240

41+
def wrappedName(pkgSym: Symbol) =
42+
pkgSym.name.toTermName == nme.EMPTY_PACKAGE ||
43+
pkgSym.name.isReplWrapperName
44+
45+
def wellKnownPkg(pkgSym: Symbol) = standardPkg(pkgSym) || wrappedName(pkgSym)
46+
4347
override protected def keyString(sym: Symbol): String = {
4448
val flags = sym.flags
4549
if (flags is Package) ""
@@ -48,6 +52,7 @@ class UserFacingPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
4852
else if (sym.isClass && flags.is(Case)) "case class"
4953
else if (flags.is(Lazy)) "lazy val"
5054
else if (flags is Module) "object"
55+
else if (sym.isTerm && !flags.is(Param) && flags.is(Implicit)) "implicit val"
5156
else super.keyString(sym)
5257
}
5358

@@ -86,7 +91,9 @@ class UserFacingPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
8691
case tp: ConstantType => toText(tp.value)
8792
case tp: TypeAlias => toText(tp.underlying)
8893
case ExprType(result) => ":" ~~ toText(result)
89-
case TypeBounds(lo, hi) => "_"
94+
case TypeBounds(lo, hi) =>
95+
{ if (lo != defn.NothingType) toText(lo) ~~ ">: _" else Str("_") } ~~
96+
{ if (hi != defn.AnyType) "<:" ~~ toText(hi) else Text() }
9097
case tp: TypeRef => tp.info match {
9198
case TypeAlias(alias) => toText(alias)
9299
case _ => toText(tp.info)
@@ -127,8 +134,10 @@ class UserFacingPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
127134
nameString(tp.cls.name)
128135
else {
129136
def printPkg(sym: ClassSymbol): Text =
130-
if (sym.owner == defn.RootClass) toText(sym)
131-
else printPkg(sym.owner.asClass) ~ "." ~ toText(sym)
137+
if (sym.owner == defn.RootClass || wrappedName(sym.owner))
138+
nameString(sym.name.stripModuleClassSuffix)
139+
else
140+
printPkg(sym.owner.asClass) ~ "." ~ toText(sym)
132141

133142
printPkg(tp.cls.owner.asClass) ~ "." ~ nameString(tp.cls.name)
134143
}

repl/test-resources/repl/i2554

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
scala> object foo { trait ShapeLevel; trait FlatShapeLevel extends ShapeLevel; trait ColumnsShapeLevel extends FlatShapeLevel; abstract class Shape[Level <: ShapeLevel, -Mixed, Unpacked, Packed]; object Shape extends TupleShapeImplicits { }; trait TupleShapeImplicits { implicit final def tuple2Shape[Level <: ShapeLevel, M1,M2, U1,U2, P1,P2](implicit u1: Shape[_ <: Level, M1, U1, P1], u2: Shape[_ <: Level, M2, U2, P2]): Shape[Level, (M1,M2), (U1,U2), (P1,P2)] = ???; }; }
2+
// defined object foo
3+
scala> import foo._
4+
scala> implicit val shape: Shape[_ <: FlatShapeLevel, Int, Int, _] = null
5+
implicit val shape: foo.Shape[_ <: foo.FlatShapeLevel, Int, Int, _] = null
6+
scala> def hint = Shape.tuple2Shape(shape, shape)
7+
def hint: foo.Shape[foo.FlatShapeLevel, Tuple2[Int, Int], Tuple2[Int, Int],
8+
Tuple2
9+
[_, _]]

0 commit comments

Comments
 (0)