diff --git a/build.sbt b/build.sbt index c2c5fda85b36..a27722235ee1 100644 --- a/build.sbt +++ b/build.sbt @@ -18,7 +18,6 @@ val `dotty-bench-bootstrapped` = Build.`dotty-bench-bootstrapped` val `scala-library` = Build.`scala-library` val `scala-compiler` = Build.`scala-compiler` val `scala-reflect` = Build.`scala-reflect` -val `dotty-repl` = Build.`dotty-repl` val scalap = Build.scalap val dist = Build.dist val `dist-bootstrapped` = Build.`dist-bootstrapped` diff --git a/compiler/src/dotty/tools/dotc/printing/RefinedPrinter.scala b/compiler/src/dotty/tools/dotc/printing/RefinedPrinter.scala index f5e99390f1df..49da2dc136ee 100644 --- a/compiler/src/dotty/tools/dotc/printing/RefinedPrinter.scala +++ b/compiler/src/dotty/tools/dotc/printing/RefinedPrinter.scala @@ -662,6 +662,11 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) { override protected def keyString(sym: Symbol): String = { val flags = sym.flagsUNSAFE if (sym.isType && sym.owner.isTerm) "" + else if (sym.isPackageObject) "package object" + else if (flags.is(Module) && flags.is(Case)) "case object" + else if (sym.isClass && flags.is(Case)) "case class" + else if (flags is Module) "object" + else if (sym.isTerm && !flags.is(Param) && flags.is(Implicit)) "implicit val" else super.keyString(sym) } diff --git a/compiler/src/dotty/tools/dotc/printing/UserFacingPrinter.scala b/compiler/src/dotty/tools/dotc/printing/UserFacingPrinter.scala new file mode 100644 index 000000000000..23ea813b6e81 --- /dev/null +++ b/compiler/src/dotty/tools/dotc/printing/UserFacingPrinter.scala @@ -0,0 +1,71 @@ +package dotty.tools.dotc +package printing + +import core._ +import Constants.Constant, Contexts.Context, Denotations._, Flags._, Names._ +import NameOps._, StdNames._, Decorators._, Scopes.Scope, Types._, Texts._ +import SymDenotations.NoDenotation, Symbols.{ Symbol, ClassSymbol, defn } + +class UserFacingPrinter(_ctx: Context) extends RefinedPrinter(_ctx) { + + private[this] def getPkgCls(path: String) = + _ctx.requiredPackage(path).moduleClass.asClass + + private lazy val collectionPkg = getPkgCls("scala.collection") + private lazy val immutablePkg = getPkgCls("scala.collection.immutable") + private lazy val scalaPkg = defn.ScalaPackageClass + private lazy val javaLangPkg = defn.JavaLangPackageVal.moduleClass.asClass + + def standardPkg(pkgSym: Symbol) = pkgSym match { + case `scalaPkg` | `collectionPkg` | `immutablePkg` | `javaLangPkg` => true + case _ => false + } + + def wrappedName(pkgSym: Symbol) = + pkgSym.name.toTermName == nme.EMPTY_PACKAGE || + pkgSym.name.isReplWrapperName + + def wellKnownPkg(pkgSym: Symbol) = standardPkg(pkgSym) || wrappedName(pkgSym) + + override protected def keyString(sym: Symbol): String = + if (sym.flagsUNSAFE is Package) "" else super.keyString(sym) + + override def nameString(name: Name): String = + if (name.isReplAssignName) name.decode.toString.takeWhile(_ != '$') + else name.decode.toString + + override def toText(sym: Symbol): Text = + if (sym.name.isReplAssignName) nameString(sym.name) + else keyString(sym) ~~ nameString(sym.name.stripModuleClassSuffix) + + override def dclText(sym: Symbol): Text = toText(sym) ~ { + if (sym.is(Method)) toText(sym.info) + else if (sym.isType && sym.info.isInstanceOf[TypeAlias]) toText(sym.info) + else if (sym.isType || sym.isClass) "" + else ":" ~~ toText(sym.info) + } + + override def toText(const: Constant): Text = Str(const.value.toString) + + override def toText(tp: Type): Text = tp match { + case ExprType(result) => ":" ~~ toText(result) + case tp: ConstantType => toText(tp.value) + case tp: TypeRef => tp.info match { + case TypeAlias(alias) => toText(alias) + case _ => toText(tp.info) + } + case tp: ClassInfo => { + if (wellKnownPkg(tp.cls.owner)) nameString(tp.cls.name) + else { + def printPkg(sym: ClassSymbol): Text = + if (sym.owner == defn.RootClass || wrappedName(sym.owner)) + nameString(sym.name.stripModuleClassSuffix) + else + printPkg(sym.owner.asClass) ~ "." ~ toText(sym) + + printPkg(tp.cls.owner.asClass) ~ "." ~ nameString(tp.cls.name) + } + } + case tp => super.toText(tp) + } +} diff --git a/compiler/src/dotty/tools/dotc/printing/package.scala b/compiler/src/dotty/tools/dotc/printing/package.scala index e2c0dda1b57e..c7d04cd05a3e 100644 --- a/compiler/src/dotty/tools/dotc/printing/package.scala +++ b/compiler/src/dotty/tools/dotc/printing/package.scala @@ -20,4 +20,10 @@ package object printing { * -Xprint will print `sym.name` instead of `sym.originalName` */ val XprintMode = new Key[Unit] + + /** @pre `nel` is non-empty list */ + private[printing] implicit class ListOps[A](val nel: List[A]) extends AnyVal { + def intersperse(a: A): List[A] = + nel.flatMap(a :: _ :: Nil).tail + } } diff --git a/repl/src/dotty/tools/repl/AbstractFileClassLoader.scala b/compiler/src/dotty/tools/repl/AbstractFileClassLoader.scala similarity index 100% rename from repl/src/dotty/tools/repl/AbstractFileClassLoader.scala rename to compiler/src/dotty/tools/repl/AbstractFileClassLoader.scala diff --git a/repl/src/dotty/tools/repl/AmmoniteReader.scala b/compiler/src/dotty/tools/repl/AmmoniteReader.scala similarity index 100% rename from repl/src/dotty/tools/repl/AmmoniteReader.scala rename to compiler/src/dotty/tools/repl/AmmoniteReader.scala diff --git a/repl/src/dotty/tools/repl/Main.scala b/compiler/src/dotty/tools/repl/Main.scala similarity index 100% rename from repl/src/dotty/tools/repl/Main.scala rename to compiler/src/dotty/tools/repl/Main.scala diff --git a/repl/src/dotty/tools/repl/ParseResult.scala b/compiler/src/dotty/tools/repl/ParseResult.scala similarity index 98% rename from repl/src/dotty/tools/repl/ParseResult.scala rename to compiler/src/dotty/tools/repl/ParseResult.scala index e2ad3f3609e9..f8a1f3df21b2 100644 --- a/repl/src/dotty/tools/repl/ParseResult.scala +++ b/compiler/src/dotty/tools/repl/ParseResult.scala @@ -95,7 +95,7 @@ case object Help extends Command { object ParseResult { - private[this] val CommandExtract = """(:[\S]+)\s*(.*)""".r + @sharable private[this] val CommandExtract = """(:[\S]+)\s*(.*)""".r /** Extract a `ParseResult` from the string `sourceCode` */ def apply(sourceCode: String)(implicit ctx: Context): ParseResult = diff --git a/repl/src/dotty/tools/repl/Rendering.scala b/compiler/src/dotty/tools/repl/Rendering.scala similarity index 100% rename from repl/src/dotty/tools/repl/Rendering.scala rename to compiler/src/dotty/tools/repl/Rendering.scala diff --git a/repl/src/dotty/tools/repl/ReplCompiler.scala b/compiler/src/dotty/tools/repl/ReplCompiler.scala similarity index 100% rename from repl/src/dotty/tools/repl/ReplCompiler.scala rename to compiler/src/dotty/tools/repl/ReplCompiler.scala diff --git a/repl/src/dotty/tools/repl/ReplDriver.scala b/compiler/src/dotty/tools/repl/ReplDriver.scala similarity index 100% rename from repl/src/dotty/tools/repl/ReplDriver.scala rename to compiler/src/dotty/tools/repl/ReplDriver.scala diff --git a/repl/src/dotty/tools/repl/ReplFrontEnd.scala b/compiler/src/dotty/tools/repl/ReplFrontEnd.scala similarity index 100% rename from repl/src/dotty/tools/repl/ReplFrontEnd.scala rename to compiler/src/dotty/tools/repl/ReplFrontEnd.scala diff --git a/repl/src/dotty/tools/repl/package.scala b/compiler/src/dotty/tools/repl/package.scala similarity index 86% rename from repl/src/dotty/tools/repl/package.scala rename to compiler/src/dotty/tools/repl/package.scala index f1fa141e0cb1..4d73926647cd 100644 --- a/repl/src/dotty/tools/repl/package.scala +++ b/compiler/src/dotty/tools/repl/package.scala @@ -4,6 +4,7 @@ import dotc.core.Contexts.Context import dotc.core.Symbols.Symbol import dotc.core.Denotations.Denotation import dotc.reporting.diagnostic.MessageContainer +import dotc.printing.UserFacingPrinter import dotc.reporting.{ StoreReporter, @@ -17,11 +18,6 @@ package object repl { new StoreReporter(null) with UniqueMessagePositions with HideNonSensicalMessages - private[repl] implicit class ListOps[A](val nel: List[A]) extends AnyVal { - def intersperse(a: A): List[A] = - nel.flatMap(a :: _ :: Nil).tail - } - private[repl] implicit class ShowUser(val s: Symbol) extends AnyVal { def showUser(implicit ctx: Context): String = { val printer = new UserFacingPrinter(ctx) diff --git a/repl/src/dotty/tools/repl/results.scala b/compiler/src/dotty/tools/repl/results.scala similarity index 100% rename from repl/src/dotty/tools/repl/results.scala rename to compiler/src/dotty/tools/repl/results.scala diff --git a/repl/src/dotty/tools/repl/terminal/Ansi.scala b/compiler/src/dotty/tools/repl/terminal/Ansi.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/Ansi.scala rename to compiler/src/dotty/tools/repl/terminal/Ansi.scala diff --git a/repl/src/dotty/tools/repl/terminal/Filter.scala b/compiler/src/dotty/tools/repl/terminal/Filter.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/Filter.scala rename to compiler/src/dotty/tools/repl/terminal/Filter.scala diff --git a/repl/src/dotty/tools/repl/terminal/FilterTools.scala b/compiler/src/dotty/tools/repl/terminal/FilterTools.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/FilterTools.scala rename to compiler/src/dotty/tools/repl/terminal/FilterTools.scala diff --git a/repl/src/dotty/tools/repl/terminal/LICENSE b/compiler/src/dotty/tools/repl/terminal/LICENSE similarity index 100% rename from repl/src/dotty/tools/repl/terminal/LICENSE rename to compiler/src/dotty/tools/repl/terminal/LICENSE diff --git a/repl/src/dotty/tools/repl/terminal/Protocol.scala b/compiler/src/dotty/tools/repl/terminal/Protocol.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/Protocol.scala rename to compiler/src/dotty/tools/repl/terminal/Protocol.scala diff --git a/repl/src/dotty/tools/repl/terminal/SpecialKeys.scala b/compiler/src/dotty/tools/repl/terminal/SpecialKeys.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/SpecialKeys.scala rename to compiler/src/dotty/tools/repl/terminal/SpecialKeys.scala diff --git a/repl/src/dotty/tools/repl/terminal/Terminal.scala b/compiler/src/dotty/tools/repl/terminal/Terminal.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/Terminal.scala rename to compiler/src/dotty/tools/repl/terminal/Terminal.scala diff --git a/repl/src/dotty/tools/repl/terminal/Utils.scala b/compiler/src/dotty/tools/repl/terminal/Utils.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/Utils.scala rename to compiler/src/dotty/tools/repl/terminal/Utils.scala diff --git a/repl/src/dotty/tools/repl/terminal/filters/BasicFilters.scala b/compiler/src/dotty/tools/repl/terminal/filters/BasicFilters.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/filters/BasicFilters.scala rename to compiler/src/dotty/tools/repl/terminal/filters/BasicFilters.scala diff --git a/repl/src/dotty/tools/repl/terminal/filters/GUILikeFilters.scala b/compiler/src/dotty/tools/repl/terminal/filters/GUILikeFilters.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/filters/GUILikeFilters.scala rename to compiler/src/dotty/tools/repl/terminal/filters/GUILikeFilters.scala diff --git a/repl/src/dotty/tools/repl/terminal/filters/HistoryFilter.scala b/compiler/src/dotty/tools/repl/terminal/filters/HistoryFilter.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/filters/HistoryFilter.scala rename to compiler/src/dotty/tools/repl/terminal/filters/HistoryFilter.scala diff --git a/repl/src/dotty/tools/repl/terminal/filters/ReadlineFilters.scala b/compiler/src/dotty/tools/repl/terminal/filters/ReadlineFilters.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/filters/ReadlineFilters.scala rename to compiler/src/dotty/tools/repl/terminal/filters/ReadlineFilters.scala diff --git a/repl/src/dotty/tools/repl/terminal/filters/UndoFilter.scala b/compiler/src/dotty/tools/repl/terminal/filters/UndoFilter.scala similarity index 100% rename from repl/src/dotty/tools/repl/terminal/filters/UndoFilter.scala rename to compiler/src/dotty/tools/repl/terminal/filters/UndoFilter.scala diff --git a/repl/test-resources/repl/defs b/compiler/test-resources/repl/defs similarity index 100% rename from repl/test-resources/repl/defs rename to compiler/test-resources/repl/defs diff --git a/repl/test-resources/repl/errmsgs b/compiler/test-resources/repl/errmsgs similarity index 100% rename from repl/test-resources/repl/errmsgs rename to compiler/test-resources/repl/errmsgs diff --git a/repl/test-resources/repl/errorThenValid b/compiler/test-resources/repl/errorThenValid similarity index 100% rename from repl/test-resources/repl/errorThenValid rename to compiler/test-resources/repl/errorThenValid diff --git a/repl/test-resources/repl/functions b/compiler/test-resources/repl/functions similarity index 100% rename from repl/test-resources/repl/functions rename to compiler/test-resources/repl/functions diff --git a/repl/test-resources/repl/getClass b/compiler/test-resources/repl/getClass similarity index 100% rename from repl/test-resources/repl/getClass rename to compiler/test-resources/repl/getClass diff --git a/repl/test-resources/repl/i1433 b/compiler/test-resources/repl/i1433 similarity index 100% rename from repl/test-resources/repl/i1433 rename to compiler/test-resources/repl/i1433 diff --git a/repl/test-resources/repl/i2063 b/compiler/test-resources/repl/i2063 similarity index 100% rename from repl/test-resources/repl/i2063 rename to compiler/test-resources/repl/i2063 diff --git a/repl/test-resources/repl/i2213 b/compiler/test-resources/repl/i2213 similarity index 100% rename from repl/test-resources/repl/i2213 rename to compiler/test-resources/repl/i2213 diff --git a/repl/test-resources/repl/i2492 b/compiler/test-resources/repl/i2492 similarity index 100% rename from repl/test-resources/repl/i2492 rename to compiler/test-resources/repl/i2492 diff --git a/repl/test-resources/repl/i2554 b/compiler/test-resources/repl/i2554 similarity index 88% rename from repl/test-resources/repl/i2554 rename to compiler/test-resources/repl/i2554 index 2830056997be..b8d88dee119c 100644 --- a/repl/test-resources/repl/i2554 +++ b/compiler/test-resources/repl/i2554 @@ -4,6 +4,4 @@ scala> import foo._ scala> implicit val shape: Shape[_ <: FlatShapeLevel, Int, Int, _] = null implicit val shape: foo.Shape[_ <: foo.FlatShapeLevel, Int, Int, _] = null scala> def hint = Shape.tuple2Shape(shape, shape) -def hint: foo.Shape[foo.FlatShapeLevel, Tuple2[Int, Int], Tuple2[Int, Int], - Tuple2 -[_, _]] +def hint: foo.Shape[foo.FlatShapeLevel, (Int, Int), (Int, Int), ()] diff --git a/repl/test-resources/repl/import b/compiler/test-resources/repl/import similarity index 100% rename from repl/test-resources/repl/import rename to compiler/test-resources/repl/import diff --git a/repl/test-resources/repl/importFromObj b/compiler/test-resources/repl/importFromObj similarity index 100% rename from repl/test-resources/repl/importFromObj rename to compiler/test-resources/repl/importFromObj diff --git a/repl/test-resources/repl/innerClasses b/compiler/test-resources/repl/innerClasses similarity index 100% rename from repl/test-resources/repl/innerClasses rename to compiler/test-resources/repl/innerClasses diff --git a/repl/test-resources/repl/onePlusOne b/compiler/test-resources/repl/onePlusOne similarity index 100% rename from repl/test-resources/repl/onePlusOne rename to compiler/test-resources/repl/onePlusOne diff --git a/repl/test-resources/repl/overrides b/compiler/test-resources/repl/overrides similarity index 100% rename from repl/test-resources/repl/overrides rename to compiler/test-resources/repl/overrides diff --git a/repl/test-resources/repl/patdef b/compiler/test-resources/repl/patdef similarity index 100% rename from repl/test-resources/repl/patdef rename to compiler/test-resources/repl/patdef diff --git a/repl/test-resources/repl/renderNull b/compiler/test-resources/repl/renderNull similarity index 100% rename from repl/test-resources/repl/renderNull rename to compiler/test-resources/repl/renderNull diff --git a/repl/test-resources/repl/toplevelTry b/compiler/test-resources/repl/toplevelTry similarity index 100% rename from repl/test-resources/repl/toplevelTry rename to compiler/test-resources/repl/toplevelTry diff --git a/repl/test-resources/repl/valueClassMember b/compiler/test-resources/repl/valueClassMember similarity index 100% rename from repl/test-resources/repl/valueClassMember rename to compiler/test-resources/repl/valueClassMember diff --git a/repl/test-resources/repl/varOrder b/compiler/test-resources/repl/varOrder similarity index 100% rename from repl/test-resources/repl/varOrder rename to compiler/test-resources/repl/varOrder diff --git a/repl/test-resources/type-printer/classDefs b/compiler/test-resources/type-printer/classDefs similarity index 100% rename from repl/test-resources/type-printer/classDefs rename to compiler/test-resources/type-printer/classDefs diff --git a/repl/test-resources/type-printer/defs b/compiler/test-resources/type-printer/defs similarity index 100% rename from repl/test-resources/type-printer/defs rename to compiler/test-resources/type-printer/defs diff --git a/compiler/test-resources/type-printer/functions b/compiler/test-resources/type-printer/functions new file mode 100644 index 000000000000..6d0bcd7e92da --- /dev/null +++ b/compiler/test-resources/type-printer/functions @@ -0,0 +1,2 @@ +scala> val toInt: Any => Int = new { def apply(a: Any) = 1; override def toString() = "" } +val toInt: Any => Int = diff --git a/repl/test-resources/type-printer/hkClass b/compiler/test-resources/type-printer/hkClass similarity index 100% rename from repl/test-resources/type-printer/hkClass rename to compiler/test-resources/type-printer/hkClass diff --git a/repl/test-resources/type-printer/infix b/compiler/test-resources/type-printer/infix similarity index 100% rename from repl/test-resources/type-printer/infix rename to compiler/test-resources/type-printer/infix diff --git a/repl/test-resources/type-printer/type-mismatch b/compiler/test-resources/type-printer/type-mismatch similarity index 100% rename from repl/test-resources/type-printer/type-mismatch rename to compiler/test-resources/type-printer/type-mismatch diff --git a/repl/test-resources/type-printer/typeAliasInfix b/compiler/test-resources/type-printer/typeAliasInfix similarity index 100% rename from repl/test-resources/type-printer/typeAliasInfix rename to compiler/test-resources/type-printer/typeAliasInfix diff --git a/repl/test-resources/type-printer/vals b/compiler/test-resources/type-printer/vals similarity index 100% rename from repl/test-resources/type-printer/vals rename to compiler/test-resources/type-printer/vals diff --git a/compiler/test/dotty/tools/dotc/CompilationTests.scala b/compiler/test/dotty/tools/dotc/CompilationTests.scala index 7c65516ba015..0da87dfc396a 100644 --- a/compiler/test/dotty/tools/dotc/CompilationTests.scala +++ b/compiler/test/dotty/tools/dotc/CompilationTests.scala @@ -197,7 +197,7 @@ class CompilationTests extends ParallelTesting { compileDir("../compiler/src/dotty/tools/dotc/config", picklingOptions) + compileDir("../compiler/src/dotty/tools/dotc/parsing", picklingOptions) + compileDir("../compiler/src/dotty/tools/dotc/printing", picklingOptions) + - compileDir("../repl/src/dotty/tools/repl", picklingOptions) + + compileDir("../compiler/src/dotty/tools/repl", picklingOptions) + compileDir("../compiler/src/dotty/tools/dotc/rewrite", picklingOptions) + compileDir("../compiler/src/dotty/tools/dotc/transform", picklingOptions) + compileDir("../compiler/src/dotty/tools/dotc/typer", picklingOptions) + diff --git a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala index c325e1497509..9a4d40fb6397 100644 --- a/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala +++ b/compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala @@ -365,7 +365,7 @@ class ErrorMessagesTests extends ErrorMessagesTest { @Test def methodDoesNotTakePrameters = checkMessagesAfter("frontend") { """ - |object Scope{ + |object Scope { | def foo = () | foo() |} diff --git a/repl/test/dotty/tools/repl/CompilerTests.scala b/compiler/test/dotty/tools/repl/CompilerTests.scala similarity index 100% rename from repl/test/dotty/tools/repl/CompilerTests.scala rename to compiler/test/dotty/tools/repl/CompilerTests.scala diff --git a/repl/test/dotty/tools/repl/ReplTest.scala b/compiler/test/dotty/tools/repl/ReplTest.scala similarity index 100% rename from repl/test/dotty/tools/repl/ReplTest.scala rename to compiler/test/dotty/tools/repl/ReplTest.scala diff --git a/repl/test/dotty/tools/repl/ScriptedTests.scala b/compiler/test/dotty/tools/repl/ScriptedTests.scala similarity index 100% rename from repl/test/dotty/tools/repl/ScriptedTests.scala rename to compiler/test/dotty/tools/repl/ScriptedTests.scala diff --git a/repl/test/dotty/tools/repl/TabcompleteTests.scala b/compiler/test/dotty/tools/repl/TabcompleteTests.scala similarity index 100% rename from repl/test/dotty/tools/repl/TabcompleteTests.scala rename to compiler/test/dotty/tools/repl/TabcompleteTests.scala diff --git a/repl/test/dotty/tools/repl/TypeTests.scala b/compiler/test/dotty/tools/repl/TypeTests.scala similarity index 100% rename from repl/test/dotty/tools/repl/TypeTests.scala rename to compiler/test/dotty/tools/repl/TypeTests.scala diff --git a/project/Build.scala b/project/Build.scala index 9eb36e2a184d..50d05fec03e2 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -130,6 +130,7 @@ object Build { javaSource in Compile := baseDirectory.value / "src", javaSource in Test := baseDirectory.value / "test", resourceDirectory in Compile := baseDirectory.value / "resources", + resourceDirectory in Test := baseDirectory.value / "test-resources", // Prevent sbt from rewriting our dependencies ivyScala ~= (_ map (_ copy (overrideScalaVersion = false))) @@ -407,7 +408,6 @@ object Build { settings(commonBootstrappedSettings). settings(dottyDocSettings) - lazy val `dotty-bot` = project.in(file("bot")). settings(commonScala2Settings). settings( diff --git a/repl/src/dotty/tools/repl/UserFacingPrinter.scala b/repl/src/dotty/tools/repl/UserFacingPrinter.scala deleted file mode 100644 index 55ec71f633e7..000000000000 --- a/repl/src/dotty/tools/repl/UserFacingPrinter.scala +++ /dev/null @@ -1,148 +0,0 @@ -package dotty.tools -package repl - -import dotc.ast.Trees.{ Untyped, Tree } -import dotc.core.Annotations.Annotation -import dotc.core.Constants.Constant -import dotc.core.Contexts.Context -import dotc.core.Denotations.{ Denotation, MultiDenotation, SingleDenotation } -import dotc.core.Flags._ -import dotc.core.TypeApplications.{ AppliedType, EtaExpansion } -import dotc.core.Names._ -import dotc.core.NameOps._ -import dotc.core.StdNames._ -import dotc.core.Decorators._ -import dotc.core.Scopes.Scope -import dotc.core.Symbols.{ Symbol, ClassSymbol, defn } -import dotc.core.SymDenotations.NoDenotation -import dotc.core.Types._ -import dotc.printing.Texts._ -import dotc.printing.{ GlobalPrec, DotPrec, Printer, PlainPrinter } -import dotc.typer.Implicits.SearchResult -import dotc.typer.ImportInfo - -class UserFacingPrinter(_ctx: Context) extends PlainPrinter(_ctx) { - - private def panic(msg: String): Nothing = throw new AssertionError(msg) - - private[this] def getPkgCls(path: String) = - _ctx.requiredPackage(path).moduleClass.asClass - - private lazy val collectionPkg = getPkgCls("scala.collection") - private lazy val immutablePkg = getPkgCls("scala.collection.immutable") - private lazy val scalaPkg = defn.ScalaPackageClass - private lazy val javaLangPkg = defn.JavaLangPackageVal.moduleClass.asClass - - def standardPkg(pkgSym: Symbol) = pkgSym match { - case `scalaPkg` | `collectionPkg` | `immutablePkg` | `javaLangPkg` => true - case _ => false - } - - def wrappedName(pkgSym: Symbol) = - pkgSym.name.toTermName == nme.EMPTY_PACKAGE || - pkgSym.name.isReplWrapperName - - def wellKnownPkg(pkgSym: Symbol) = standardPkg(pkgSym) || wrappedName(pkgSym) - - override protected def keyString(sym: Symbol): String = { - val flags = sym.flags - if (flags is Package) "" - else if (sym.isPackageObject) "package object" - else if (flags.is(Module) && flags.is(Case)) "case object" - else if (sym.isClass && flags.is(Case)) "case class" - else if (flags.is(Lazy)) "lazy val" - else if (flags is Module) "object" - else if (sym.isTerm && !flags.is(Param) && flags.is(Implicit)) "implicit val" - else super.keyString(sym) - } - - override def nameString(name: Name): String = - if (name.isReplAssignName) name.decode.toString.takeWhile(_ != '$') - else name.decode.toString - - override def toText(sym: Symbol): Text = - if (sym.name.isReplAssignName) nameString(sym.name) - else keyString(sym) ~~ nameString(sym.name.stripModuleClassSuffix) - - override def dclText(sym: Symbol): Text = - toText(sym) ~ { - if (sym.is(Method)) toText(sym.info) - else if (sym.isClass) "" - else if (sym.isType && sym.info.isInstanceOf[TypeAlias]) " =" ~~ toText(sym.info) - else if (sym.isType) "" - else { - ":" ~~ toText(sym.info) - } - } - - override def toText(denot: Denotation): Text = denot match { - case NoDenotation => - panic("NoDenotation encountered in UserFacingPrinter") - case denot: MultiDenotation => - panic("MultiDenotation not allowed in UserFacingPrinter") - case _ => - toText(denot.symbol) - } - - override def toText(const: Constant): Text = Str(const.value.toString) - - override def toText(tp: Type): Text = tp match { - case tp: AnnotatedType => toText(tp.tpe) ~~ toText(tp.annot) - case tp: ConstantType => toText(tp.value) - case tp: TypeAlias => toText(tp.underlying) - case ExprType(result) => ":" ~~ toText(result) - case TypeBounds(lo, hi) => - { if (lo != defn.NothingType) toText(lo) ~~ ">: _" else Str("_") } ~~ - { if (hi != defn.AnyType) "<:" ~~ toText(hi) else Text() } - case tp: TypeRef => tp.info match { - case TypeAlias(alias) => toText(alias) - case _ => toText(tp.info) - } - case tp: ParamRef => { - val name = tp.paramName.unexpandedName.invariantName.toString - if (tp.isInstanceOf[TermParamRef]) name ~ ".type" - else name - } - case EtaExpansion(tycon) => toText(tycon) - case PolyType(params, res) => - "[" ~ Fluid(params.map(tl => toText(tl.toArg)).intersperse(Str(", "))) ~ "]" ~ toText(res) - case tp: MethodType => { - def paramText(name: TermName, tp: Type) = toText(name) ~ ": " ~ toText(tp) - changePrec(GlobalPrec) { - (if (tp.isImplicit) "(implicit " else "(") ~ - Text((tp.paramNames, tp.paramInfos).zipped map paramText, ", ") ~ - (if (tp.resultType.isInstanceOf[MethodType]) ")" else "): ") ~ - toText(tp.resultType) - } - } - case AppliedType(tycon, args) => { - def toTextInfixType(tycon: Type, args: List[Type]): Text = { - // TODO: blatant copy from `RefinedPrinter` - val l :: r :: Nil = args - val isRightAssoc = tycon.typeSymbol.name.endsWith(":") - val leftArg = if (isRightAssoc && l.isInfixType) "(" ~ toText(l) ~ ")" else toText(l) - val rightArg = if (!isRightAssoc && r.isInfixType) "(" ~ toText(r) ~ ")" else toText(r) - leftArg ~~ atPrec(DotPrec) { tycon.toText(this) } ~~ rightArg - } - if (tp.isInfixType) toTextInfixType(tycon, args) - else { - toText(tycon) ~ "[" ~ Fluid(args.reverse.map(toText).intersperse(Str(", "))) ~ "]" - } - } - case tp: ClassInfo => { - if (wellKnownPkg(tp.cls.owner)) - nameString(tp.cls.name) - else { - def printPkg(sym: ClassSymbol): Text = - if (sym.owner == defn.RootClass || wrappedName(sym.owner)) - nameString(sym.name.stripModuleClassSuffix) - else - printPkg(sym.owner.asClass) ~ "." ~ toText(sym) - - printPkg(tp.cls.owner.asClass) ~ "." ~ nameString(tp.cls.name) - } - } - } - - override lazy val plain = new PlainPrinter(_ctx) -}