From 38cc8980e9ee4f47c612b6b485e04198fd864eb4 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Tue, 6 Nov 2018 16:47:26 +0000 Subject: [PATCH 1/6] Rename TASTy reflection method to reflect/reify --- .../dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala | 8 ++++---- library/src/scala/tasty/reflect/QuotedOps.scala | 9 ++++++--- library/src/scala/tasty/util/ConstantExtractor.scala | 2 +- tests/neg/tasty-macro-assert/quoted_1.scala | 4 ++-- .../Yretain-trees/tasty-definitions-2/Macro_1.scala | 2 +- .../Yretain-trees/tasty-definitions-3/Macro_1.scala | 2 +- .../Yretain-trees/tasty-extractors-owners/quoted_1.scala | 2 +- .../Yretain-trees/tasty-load-tree-1/quoted_1.scala | 2 +- .../Yretain-trees/tasty-load-tree-2/quoted_1.scala | 2 +- tests/run-separate-compilation/i5119/Macro_1.scala | 2 +- tests/run-separate-compilation/i5119b/Macro_1.scala | 2 +- .../tasty-argument-tree-1/quoted_1.scala | 2 +- .../tasty-custom-show/quoted_1.scala | 2 +- tests/run-separate-compilation/tasty-eval/quoted_1.scala | 2 +- .../tasty-extractors-1/quoted_1.scala | 2 +- .../tasty-extractors-2/quoted_1.scala | 2 +- .../tasty-extractors-3/quoted_1.scala | 2 +- .../tasty-extractors-types/quoted_1.scala | 2 +- .../tasty-indexed-map/quoted_1.scala | 4 ++-- .../tasty-macro-assert/quoted_1.scala | 6 +++--- .../tasty-subtyping/quoted_1.scala | 4 ++-- .../xml-interpolation-1/XmlQuote_1.scala | 6 +++--- .../xml-interpolation-2/XmlQuote_1.scala | 7 ++++--- 23 files changed, 41 insertions(+), 37 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala index bcb599180c8d..cb3c557c190b 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala @@ -8,16 +8,16 @@ import dotty.tools.dotc.reporting.diagnostic.MessageContainer trait QuotedOpsImpl extends scala.tasty.reflect.QuotedOps with TastyCoreImpl { def QuotedExprDeco[T](x: scala.quoted.Expr[T]): QuotedExprAPI = new QuotedExprAPI { - def toTasty(implicit ctx: Context): Term = PickledQuotes.quotedExprToTree(x) + def reflect(implicit ctx: Context): Term = PickledQuotes.quotedExprToTree(x) } def QuotedTypeDeco[T](x: scala.quoted.Type[T]): QuotedTypeAPI = new QuotedTypeAPI { - def toTasty(implicit ctx: Context): TypeTree = PickledQuotes.quotedTypeToTree(x) + def reflect(implicit ctx: Context): TypeTree = PickledQuotes.quotedTypeToTree(x) } def TermToQuoteDeco(term: Term): TermToQuotedAPI = new TermToQuotedAPI { - def toExpr[T: scala.quoted.Type](implicit ctx: Context): scala.quoted.Expr[T] = { + def reify[T: scala.quoted.Type](implicit ctx: Context): scala.quoted.Expr[T] = { typecheck(ctx) new scala.quoted.Exprs.TastyTreeExpr(term).asInstanceOf[scala.quoted.Expr[T]] } @@ -28,7 +28,7 @@ trait QuotedOpsImpl extends scala.tasty.reflect.QuotedOps with TastyCoreImpl { ctx0.typerState.setReporter(new Reporter { def doReport(m: MessageContainer)(implicit ctx: Context): Unit = () }) - val tp = QuotedTypeDeco(implicitly[scala.quoted.Type[T]]).toTasty + val tp = QuotedTypeDeco(implicitly[scala.quoted.Type[T]]).reflect ctx0.typer.typed(term, tp.tpe) if (ctx0.reporter.hasErrors) { val stack = new Exception().getStackTrace diff --git a/library/src/scala/tasty/reflect/QuotedOps.scala b/library/src/scala/tasty/reflect/QuotedOps.scala index e5d5214b3082..a2dc29500b08 100644 --- a/library/src/scala/tasty/reflect/QuotedOps.scala +++ b/library/src/scala/tasty/reflect/QuotedOps.scala @@ -4,17 +4,20 @@ package scala.tasty.reflect trait QuotedOps extends TastyCore { trait QuotedExprAPI { - def toTasty(implicit ctx: Context): Term + /** View this expression `Expr[T]` as a `Term` */ + def reflect(implicit ctx: Context): Term } implicit def QuotedExprDeco[T](expr: quoted.Expr[T]): QuotedExprAPI trait QuotedTypeAPI { - def toTasty(implicit ctx: Context): TypeTree + /** View this expression `Type[T]` as a `TypeTree` */ + def reflect(implicit ctx: Context): TypeTree } implicit def QuotedTypeDeco[T](tpe: quoted.Type[T]): QuotedTypeAPI trait TermToQuotedAPI { - def toExpr[T: scala.quoted.Type](implicit ctx: Context): scala.quoted.Expr[T] + /** Convert `Term` to an `Expr[T]` and check that it conforms to `T` */ + def reify[T: scala.quoted.Type](implicit ctx: Context): scala.quoted.Expr[T] } implicit def TermToQuoteDeco(term: Term): TermToQuotedAPI diff --git a/library/src/scala/tasty/util/ConstantExtractor.scala b/library/src/scala/tasty/util/ConstantExtractor.scala index def23d175d13..ba5f59cac77e 100644 --- a/library/src/scala/tasty/util/ConstantExtractor.scala +++ b/library/src/scala/tasty/util/ConstantExtractor.scala @@ -25,6 +25,6 @@ class ConstantExtractor[T <: Tasty with Singleton](val tasty: T) { case Term.Inlined(_, Nil, e) => const(e) case _ => None } - const(expr.toTasty) + const(expr.reflect) } } diff --git a/tests/neg/tasty-macro-assert/quoted_1.scala b/tests/neg/tasty-macro-assert/quoted_1.scala index 59c7d29a4378..7431e5336c51 100644 --- a/tests/neg/tasty-macro-assert/quoted_1.scala +++ b/tests/neg/tasty-macro-assert/quoted_1.scala @@ -17,7 +17,7 @@ object Asserts { def impl(cond: Expr[Boolean])(implicit tasty: Tasty): Expr[Unit] = { import tasty._ - val tree = cond.toTasty + val tree = cond.reflect def isOps(tpe: TypeOrBounds): Boolean = tpe match { case Type.SymRef(IsDefSymbol(sym), _) => sym.name == "Ops" // TODO check that the parent is Asserts @@ -34,7 +34,7 @@ object Asserts { tree match { case Term.Inlined(_, Nil, Term.Apply(Term.Select(OpsTree(left), op, _), right :: Nil)) => - '(assertTrue(~left.toExpr[Boolean])) // Buggy code. To generate the errors + '(assertTrue(~left.reify[Boolean])) // Buggy code. To generate the errors case _ => '(assertTrue(~cond)) } diff --git a/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala b/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala index 2764c8609800..0341e3304f86 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala @@ -13,7 +13,7 @@ object Foo { case IsValSymbol(sym) => sym.tree.show.toExpr case IsBindSymbol(sym) => sym.tree.show.toExpr } - x.toTasty match { + x.reflect match { case Term.Inlined(None, Nil, arg) => definitionString(arg) case arg => definitionString(arg) // TODO should all by name parameters be in an inline node? } diff --git a/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala b/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala index f4ad6dd432fc..e5fb7d24f9e1 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala @@ -13,7 +13,7 @@ object Foo { case IsValSymbol(sym) => sym.tree.show.toExpr case IsBindSymbol(sym) => sym.tree.show.toExpr } - x.toTasty match { + x.reflect match { case Term.Inlined(None, Nil, arg) => definitionString(arg) case arg => definitionString(arg) // TODO should all by name parameters be in an inline node? } diff --git a/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala b/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala index d15bdc32e1e0..a26886af835f 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala @@ -41,7 +41,7 @@ object Macros { } } - val tree = x.toTasty + val tree = x.reflect output.traverseTree(tree) '(print(~buff.result().toExpr)) } diff --git a/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala b/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala index c86cfd34c63a..2caf476ee9ed 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala @@ -17,7 +17,7 @@ object Foo { case _ => '("NO DEFINTION") } - x.toTasty match { + x.reflect match { case Term.Inlined(None, Nil, arg) => definitionString(arg) case arg => definitionString(arg) // TODO should all by name parameters be in an inline node } diff --git a/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala b/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala index 93288b453058..98d628873bd7 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala @@ -17,7 +17,7 @@ object Foo { case _ => '("NO DEFINTION") } - x.toTasty match { + x.reflect match { case Term.Inlined(None, Nil, arg) => definitionString(arg) case arg => definitionString(arg) // TODO should all by name parameters be in an inline node } diff --git a/tests/run-separate-compilation/i5119/Macro_1.scala b/tests/run-separate-compilation/i5119/Macro_1.scala index bbcd4da86104..70b94d0cd852 100644 --- a/tests/run-separate-compilation/i5119/Macro_1.scala +++ b/tests/run-separate-compilation/i5119/Macro_1.scala @@ -8,6 +8,6 @@ object Macro { implicit inline def XmlQuote(sc: => StringContext): StringContextOps = new StringContextOps(sc) def impl(sc: Expr[StringContext], args: Expr[Seq[Any]])(implicit tasty: Tasty): Expr[String] = { import tasty._ - (sc.toTasty.underlyingArgument.show + "\n" + args.toTasty.underlyingArgument.show).toExpr + (sc.reflect.underlyingArgument.show + "\n" + args.reflect.underlyingArgument.show).toExpr } } diff --git a/tests/run-separate-compilation/i5119b/Macro_1.scala b/tests/run-separate-compilation/i5119b/Macro_1.scala index 4521a5ca9317..7c31b07aee20 100644 --- a/tests/run-separate-compilation/i5119b/Macro_1.scala +++ b/tests/run-separate-compilation/i5119b/Macro_1.scala @@ -7,7 +7,7 @@ object Macro { def impl(arg1: Expr[Any], arg2: Expr[Any])(implicit tasty: Tasty): Expr[String] = { import tasty._ - (arg1.toTasty.underlyingArgument.show + "\n" + arg2.toTasty.underlyingArgument.show).toExpr + (arg1.reflect.underlyingArgument.show + "\n" + arg2.reflect.underlyingArgument.show).toExpr } } diff --git a/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala b/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala index 4bd8ece04268..161517579872 100644 --- a/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala @@ -7,7 +7,7 @@ object Macros { def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { import tasty._ - val tree = x.toTasty + val tree = x.reflect '{ println() println("tree: " + ~tree.show.toExpr) diff --git a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala index b886e985c577..07dab1d099b6 100644 --- a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala @@ -34,7 +34,7 @@ object Macros { } } - val tree = x.toTasty + val tree = x.reflect output.traverseTree(tree) '(print(~buff.result().toExpr)) } diff --git a/tests/run-separate-compilation/tasty-eval/quoted_1.scala b/tests/run-separate-compilation/tasty-eval/quoted_1.scala index db8c8adc0734..63d98a346db1 100644 --- a/tests/run-separate-compilation/tasty-eval/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-eval/quoted_1.scala @@ -22,7 +22,7 @@ object Macros { override def value(e: Expr[Int])(implicit tasty: Tasty): Option[Int] = { import tasty._ - e.toTasty.tpe match { + e.reflect.tpe match { case Type.SymRef(IsValSymbol(sym), pre) => sym.tree.tpt.tpe match { case Type.ConstantType(Constant.Int(i)) => Some(i) diff --git a/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala index 0e2b7efefe9d..b6023c627e2b 100644 --- a/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala @@ -10,7 +10,7 @@ object Macros { def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { import tasty._ - val tree = x.toTasty + val tree = x.reflect val treeStr = tree.show val treeTpeStr = tree.tpe.show diff --git a/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala index 7a7d06bbe63b..776084414448 100644 --- a/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala @@ -10,7 +10,7 @@ object Macros { def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { import tasty._ - val tree = x.toTasty + val tree = x.reflect val treeStr = tree.show val treeTpeStr = tree.tpe.show diff --git a/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala index bf44ed17535b..2847fa7bbb76 100644 --- a/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala @@ -20,7 +20,7 @@ object Macros { } } - val tree = x.toTasty + val tree = x.reflect traverser.traverseTree(tree) '(print(~buff.result().toExpr)) } diff --git a/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala index 96ff9bff8d33..596a29758ce1 100644 --- a/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala @@ -10,7 +10,7 @@ object Macros { def impl[T](x: Type[T])(implicit tasty: Tasty): Expr[Unit] = { import tasty._ - val tree = x.toTasty + val tree = x.reflect '{ println(~tree.show.toExpr) println(~tree.tpe.show.toExpr) diff --git a/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala b/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala index dcb71d96de90..5a30dd1cdfa8 100644 --- a/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala @@ -38,8 +38,8 @@ object Index { case _ => Nil } - val key = name(k.toTasty.tpe) - val keys = name(h.toTasty.tpe) :: names(t.toTasty.tpe) + val key = name(k.reflect.tpe) + val keys = name(h.reflect.tpe) :: names(t.reflect.tpe) val index = keys.indexOf(key) diff --git a/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala b/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala index a3cb5ab55d34..8b4977f004be 100644 --- a/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala @@ -17,7 +17,7 @@ object Asserts { def impl(cond: Expr[Boolean])(implicit tasty: Tasty): Expr[Unit] = { import tasty._ - val tree = cond.toTasty + val tree = cond.reflect def isOps(tpe: TypeOrBounds): Boolean = tpe match { case Type.SymRef(IsDefSymbol(sym), _) => sym.name == "Ops"// TODO check that the parent is Asserts @@ -35,8 +35,8 @@ object Asserts { tree match { case Term.Inlined(_, Nil, Term.Apply(Term.Select(OpsTree(left), op, _), right :: Nil)) => op match { - case "===" => '(assertEquals(~left.toExpr[Any], ~right.toExpr[Any])) - case "!==" => '(assertNotEquals(~left.toExpr[Any], ~right.toExpr[Any])) + case "===" => '(assertEquals(~left.reify[Any], ~right.reify[Any])) + case "!==" => '(assertNotEquals(~left.reify[Any], ~right.reify[Any])) } case _ => '(assertTrue(~cond)) diff --git a/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala b/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala index 0573a0e9b9f9..ad69513e2d13 100644 --- a/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala @@ -12,13 +12,13 @@ object Macros { def isTypeEqualImpl[T, U](t: Type[T], u: Type[U])(implicit tasty: Tasty): Expr[Boolean] = { import tasty._ - val isTypeEqual = t.toTasty.tpe =:= u.toTasty.tpe + val isTypeEqual = t.reflect.tpe =:= u.reflect.tpe isTypeEqual.toExpr } def isSubTypeOfImpl[T, U](t: Type[T], u: Type[U])(implicit tasty: Tasty): Expr[Boolean] = { import tasty._ - val isTypeEqual = t.toTasty.tpe <:< u.toTasty.tpe + val isTypeEqual = t.reflect.tpe <:< u.reflect.tpe isTypeEqual.toExpr } } diff --git a/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala b/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala index a011d6e6c41b..6f2103620eb3 100644 --- a/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala +++ b/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala @@ -27,7 +27,7 @@ object XmlQuote { def liftListOfAny(lst: List[Term]): Expr[List[Any]] = lst match { case x :: xs => - val head = x.toExpr[Any] + val head = x.reify[Any] val tail = liftListOfAny(xs) '{ ~head :: ~tail } case Nil => '(Nil) @@ -45,7 +45,7 @@ object XmlQuote { tree.symbol.fullName == "scala.StringContext$.apply" // XmlQuote.SCOps(StringContext.apply([p0, ...]: String*) - val parts = receiver.toTasty.underlyingArgument match { + val parts = receiver.reflect.underlyingArgument match { case Apply(conv, List(Apply(fun, List(Typed(Repeated(values), _))))) if isSCOpsConversion(conv) && isStringContextApply(fun) && @@ -56,7 +56,7 @@ object XmlQuote { } // [a0, ...]: Any* - val Typed(Repeated(args0), _) = args.toTasty.underlyingArgument + val Typed(Repeated(args0), _) = args.reflect.underlyingArgument val string = parts.mkString("??") '(new Xml(~string.toExpr, ~liftListOfAny(args0))) diff --git a/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala b/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala index 6b7ca930b4ea..ec73260a607f 100644 --- a/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala +++ b/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala @@ -1,3 +1,4 @@ + import scala.quoted._ import scala.tasty.Tasty @@ -38,7 +39,7 @@ object XmlQuote { } // XmlQuote.SCOps(StringContext.apply([p0, ...]: String*) - val parts: List[String] = stripTyped(receiver.toTasty.underlying) match { + val parts: List[String] = stripTyped(receiver.reflect.underlying) match { case Apply(conv, List(ctx1)) if isSCOpsConversion(conv) => ctx1 match { case Apply(fun, List(Typed(Repeated(values), _))) if isStringContextApply(fun) => @@ -53,13 +54,13 @@ object XmlQuote { } // [a0, ...]: Any* - val args2: Expr[List[Any]] = args.toTasty.underlyingArgument match { + val args2: Expr[List[Any]] = args.reflect.underlyingArgument match { case Typed(Repeated(args0), _) => // statically known args, make list directly def liftListOfAny(lst: List[Expr[Any]]): Expr[List[Any]] = lst match { case x :: xs => '{ ~x :: ~liftListOfAny(xs) } case Nil => '(Nil) } - liftListOfAny(args0.map(_.toExpr[Any])) + liftListOfAny(args0.map(_.reify[Any])) case _ => '((~args).toList) From 057ac1c884aace0af7e0547d736098d3341f7ac6 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Tue, 6 Nov 2018 22:12:11 +0000 Subject: [PATCH 2/6] Rename tasty.Tasty to tasty.Reflection --- .../dotc/consumetasty/TastyConsumerPhase.scala | 6 +++--- .../dotty/tools/dotc/core/Definitions.scala | 8 ++++---- .../dotc/decompiler/DecompilationPrinter.scala | 4 ++-- .../dotty/tools/dotc/quoted/QuoteDriver.scala | 4 ++-- .../dotc/tastyreflect/CaseDefOpsImpl.scala | 2 +- .../dotc/tastyreflect/ConstantOpsImpl.scala | 2 +- .../dotc/tastyreflect/ContextOpsImpl.scala | 2 +- .../tools/dotc/tastyreflect/IdOpsImpl.scala | 2 +- .../tastyreflect/ImportSelectorOpsImpl.scala | 2 +- .../dotc/tastyreflect/PatternOpsImpl.scala | 2 +- .../dotc/tastyreflect/PositionOpsImpl.scala | 2 +- .../tools/dotc/tastyreflect/PrintersImpl.scala | 2 +- .../dotc/tastyreflect/QuotedOpsImpl.scala | 4 ++-- ...CoreImpl.scala => ReflectionCoreImpl.scala} | 2 +- .../{TastyImpl.scala => ReflectionImpl.scala} | 6 +++--- .../dotc/tastyreflect/SettingsOpsImpl.scala | 2 +- .../dotc/tastyreflect/SignatureOpsImpl.scala | 2 +- .../tastyreflect/StandardDefinitions.scala | 2 +- .../dotc/tastyreflect/SymbolOpsImpl.scala | 2 +- .../tools/dotc/tastyreflect/TreeOpsImpl.scala | 2 +- .../tastyreflect/TypeOrBoundsOpsImpl.scala | 2 +- .../TypeOrBoundsTreesOpsImpl.scala | 2 +- .../dotty/tools/dotc/transform/Splicer.scala | 6 +++--- .../dotty/tools/dotc/transform/Staging.scala | 2 +- .../src/dotty/tools/dotc/typer/Implicits.scala | 4 ++-- .../tasty/{Tasty.scala => Reflection.scala} | 8 ++++---- .../src/scala/tasty/file/TastyConsumer.scala | 4 ++-- .../src/scala/tasty/reflect/CaseDefOps.scala | 2 +- .../src/scala/tasty/reflect/ConstantOps.scala | 2 +- .../src/scala/tasty/reflect/ContextOps.scala | 2 +- library/src/scala/tasty/reflect/IdOps.scala | 2 +- .../tasty/reflect/ImportSelectorOps.scala | 2 +- .../src/scala/tasty/reflect/PatternOps.scala | 2 +- .../src/scala/tasty/reflect/PositionOps.scala | 2 +- library/src/scala/tasty/reflect/Printers.scala | 8 ++++---- .../src/scala/tasty/reflect/QuotedOps.scala | 2 +- .../{TastyCore.scala => ReflectionCore.scala} | 2 +- .../src/scala/tasty/reflect/SettingsOps.scala | 2 +- .../src/scala/tasty/reflect/SignatureOps.scala | 2 +- .../tasty/reflect/StandardDefinitions.scala | 2 +- .../src/scala/tasty/reflect/SymbolOps.scala | 2 +- library/src/scala/tasty/reflect/TreeOps.scala | 2 +- .../scala/tasty/reflect/TypeOrBoundsOps.scala | 2 +- .../tasty/reflect/TypeOrBoundsTreeOps.scala | 2 +- .../scala/tasty/util/ConstantExtractor.scala | 8 ++++---- library/src/scala/tasty/util/Show.scala | 18 +++++++++--------- .../src/scala/tasty/util/ShowExtractors.scala | 8 ++++---- .../src/scala/tasty/util/ShowSourceCode.scala | 10 +++++----- .../src/scala/tasty/util/TreeAccumulator.scala | 6 +++--- .../src/scala/tasty/util/TreeTraverser.scala | 6 +++--- semanticdb/src/dotty/semanticdb/Main.scala | 2 +- .../dotty/semanticdb/SemanticdbConsumer.scala | 10 +++++----- semanticdb/test/dotty/semanticdb/Tests.scala | 2 +- tests/neg/tasty-macro-assert/quoted_1.scala | 4 ++-- .../fatal-warnings/tasty-parent-unapply.scala | 6 +++--- .../pos-with-compiler/tasty/definitions.scala | 6 +++--- tests/pos/i4449.scala | 6 +++--- .../tasty-definitions-2/Macro_1.scala | 4 ++-- .../tasty-definitions-3/Macro_1.scala | 4 ++-- .../tasty-extractors-owners/quoted_1.scala | 6 +++--- .../tasty-load-tree-1/quoted_1.scala | 4 ++-- .../tasty-load-tree-2/quoted_1.scala | 4 ++-- .../i4515b/Macro_1.scala | 4 ++-- .../i5119/Macro_1.scala | 6 +++--- .../i5119b/Macro_1.scala | 6 +++--- .../tasty-argument-tree-1/quoted_1.scala | 4 ++-- .../tasty-custom-show/quoted_1.scala | 14 +++++++------- .../tasty-definitions-1/quoted_1.scala | 4 ++-- .../tasty-eval/quoted_1.scala | 10 +++++----- .../tasty-extractors-1/quoted_1.scala | 4 ++-- .../tasty-extractors-2/quoted_1.scala | 4 ++-- .../tasty-extractors-3/quoted_1.scala | 8 ++++---- .../quoted_1.scala | 6 +++--- .../tasty-extractors-types/quoted_1.scala | 4 ++-- .../Macro_1.scala | 10 +++++----- .../tasty-getfile/Macro_1.scala | 6 +++--- .../tasty-implicit-fun-context-2/Macro_1.scala | 8 ++++---- .../tasty-indexed-map/quoted_1.scala | 4 ++-- .../tasty-linenumber-2/quoted_1.scala | 4 ++-- .../tasty-linenumber/quoted_1.scala | 4 ++-- .../tasty-location/quoted_1.scala | 4 ++-- .../tasty-macro-assert/quoted_1.scala | 4 ++-- .../tasty-positioned/quoted_1.scala | 4 ++-- .../tasty-subtyping/quoted_1.scala | 8 ++++---- .../xml-interpolation-1/XmlQuote_1.scala | 8 ++++---- .../xml-interpolation-2/XmlQuote_1.scala | 8 ++++---- .../tasty-consumer/Test.scala | 10 +++++----- .../quoted_1.scala | 8 ++++---- 88 files changed, 203 insertions(+), 203 deletions(-) rename compiler/src/dotty/tools/dotc/tastyreflect/{TastyCoreImpl.scala => ReflectionCoreImpl.scala} (96%) rename compiler/src/dotty/tools/dotc/tastyreflect/{TastyImpl.scala => ReflectionImpl.scala} (79%) rename library/src/scala/tasty/{Tasty.scala => Reflection.scala} (76%) rename library/src/scala/tasty/reflect/{TastyCore.scala => ReflectionCore.scala} (99%) diff --git a/compiler/src/dotty/tools/dotc/consumetasty/TastyConsumerPhase.scala b/compiler/src/dotty/tools/dotc/consumetasty/TastyConsumerPhase.scala index 9bab9b4361ce..d57249090eae 100644 --- a/compiler/src/dotty/tools/dotc/consumetasty/TastyConsumerPhase.scala +++ b/compiler/src/dotty/tools/dotc/consumetasty/TastyConsumerPhase.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.consumetasty import dotty.tools.dotc.core.Contexts._ import dotty.tools.dotc.core.Phases.Phase -import dotty.tools.dotc.tastyreflect.TastyImpl +import dotty.tools.dotc.tastyreflect.ReflectionImpl import scala.tasty.file.TastyConsumer @@ -11,8 +11,8 @@ class TastyConsumerPhase(consumer: TastyConsumer) extends Phase { override def phaseName: String = "tastyConsumer" override def run(implicit ctx: Context): Unit = { - val tasty = new TastyImpl(ctx) - consumer(tasty)(ctx.compilationUnit.tpdTree) + val reflect = new ReflectionImpl(ctx) + consumer(reflect)(ctx.compilationUnit.tpdTree) } } diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala index 16009425a725..ce1103752523 100644 --- a/compiler/src/dotty/tools/dotc/core/Definitions.scala +++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala @@ -691,11 +691,11 @@ class Definitions { def Unpickler_liftedExpr: TermSymbol = ctx.requiredMethod("scala.runtime.quoted.Unpickler.liftedExpr") def Unpickler_unpickleType: TermSymbol = ctx.requiredMethod("scala.runtime.quoted.Unpickler.unpickleType") - lazy val TastyTastyType: TypeRef = ctx.requiredClassRef("scala.tasty.Tasty") - def TastyTastyClass(implicit ctx: Context): ClassSymbol = TastyTastyType.symbol.asClass + lazy val TastyReflectionType: TypeRef = ctx.requiredClassRef("scala.tasty.Reflection") + def TastyReflectionClass(implicit ctx: Context): ClassSymbol = TastyReflectionType.symbol.asClass - lazy val TastyTastyModule: TermSymbol = ctx.requiredModule("scala.tasty.Tasty") - lazy val TastyTasty_macroContext: TermSymbol = TastyTastyModule.requiredMethod("macroContext") + lazy val TastyReflectionModule: TermSymbol = ctx.requiredModule("scala.tasty.Reflection") + lazy val TastyReflection_macroContext: TermSymbol = TastyReflectionModule.requiredMethod("macroContext") lazy val EqType: TypeRef = ctx.requiredClassRef("scala.Eq") def EqClass(implicit ctx: Context): ClassSymbol = EqType.symbol.asClass diff --git a/compiler/src/dotty/tools/dotc/decompiler/DecompilationPrinter.scala b/compiler/src/dotty/tools/dotc/decompiler/DecompilationPrinter.scala index 741a448098ab..afa06ff9a115 100644 --- a/compiler/src/dotty/tools/dotc/decompiler/DecompilationPrinter.scala +++ b/compiler/src/dotty/tools/dotc/decompiler/DecompilationPrinter.scala @@ -6,7 +6,7 @@ import java.io.{OutputStream, PrintStream} import dotty.tools.dotc.core.Contexts._ import dotty.tools.dotc.core.Phases.Phase import dotty.tools.dotc.core.tasty.TastyPrinter -import dotty.tools.dotc.tastyreflect.TastyImpl +import dotty.tools.dotc.tastyreflect.ReflectionImpl import dotty.tools.io.File /** Phase that prints the trees in all loaded compilation units. @@ -41,7 +41,7 @@ class DecompilationPrinter extends Phase { } else { val unitFile = unit.source.toString.replace("\\", "/").replace(".class", ".tasty") out.println(s"/** Decompiled from $unitFile */") - out.println(new TastyImpl(ctx).showSourceCode.showTree(unit.tpdTree)(ctx)) + out.println(new ReflectionImpl(ctx).showSourceCode.showTree(unit.tpdTree)(ctx)) } } } diff --git a/compiler/src/dotty/tools/dotc/quoted/QuoteDriver.scala b/compiler/src/dotty/tools/dotc/quoted/QuoteDriver.scala index ccc2a33aa43d..faf48ae9e966 100644 --- a/compiler/src/dotty/tools/dotc/quoted/QuoteDriver.scala +++ b/compiler/src/dotty/tools/dotc/quoted/QuoteDriver.scala @@ -3,7 +3,7 @@ package dotty.tools.dotc.quoted import dotty.tools.dotc.ast.tpd import dotty.tools.dotc.Driver import dotty.tools.dotc.core.Contexts.{Context, ContextBase, FreshContext} -import dotty.tools.dotc.tastyreflect.TastyImpl +import dotty.tools.dotc.tastyreflect.ReflectionImpl import dotty.tools.io.{AbstractFile, Directory, PlainDirectory, VirtualDirectory} import dotty.tools.repl.AbstractFileClassLoader @@ -47,7 +47,7 @@ class QuoteDriver extends Driver { val tree1 = if (ctx.settings.YshowRawQuoteTrees.value) tree else (new TreeCleaner).transform(tree) - new TastyImpl(ctx).showSourceCode.showTree(tree1) + new ReflectionImpl(ctx).showSourceCode.showTree(tree1) } withTree(expr, show, settings) } diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala index 0ad6f123be72..ac0b57077585 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala @@ -1,7 +1,7 @@ package dotty.tools.dotc.tastyreflect -trait CaseDefOpsImpl extends scala.tasty.reflect.CaseDefOps with TastyCoreImpl with Helpers { +trait CaseDefOpsImpl extends scala.tasty.reflect.CaseDefOps with ReflectionCoreImpl with Helpers { def CaseDefDeco(caseDef: CaseDef): CaseDefAPI = new CaseDefAPI { def pattern(implicit ctx: Context): Pattern = caseDef.pat diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala index fdb4e5472580..bd5f86a569f2 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala @@ -3,7 +3,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.core.Constants -trait ConstantOpsImpl extends scala.tasty.reflect.ConstantOps with TastyCoreImpl { +trait ConstantOpsImpl extends scala.tasty.reflect.ConstantOps with ReflectionCoreImpl { def ConstantDeco(const: Constant): ConstantAPI = new ConstantAPI { def value: Any = const.value diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala index 923af0575807..ea9c359de01c 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.util.{Positions, SourcePosition} -trait ContextOpsImpl extends scala.tasty.reflect.ContextOps with TastyCoreImpl { +trait ContextOpsImpl extends scala.tasty.reflect.ContextOps with ReflectionCoreImpl { val rootContext: Context diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala index 391d4c73a5b4..994d22203957 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.core.Decorators._ -trait IdOpsImpl extends scala.tasty.reflect.IdOps with TastyCoreImpl { +trait IdOpsImpl extends scala.tasty.reflect.IdOps with ReflectionCoreImpl { def IdDeco(id: Id): IdAPI = new IdAPI { def pos(implicit ctx: Context): Position = id.pos diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala index 6d499574d8a2..0d2e9a32bc46 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala @@ -3,7 +3,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.ast.{Trees, untpd} import dotty.tools.dotc.core.StdNames.nme -trait ImportSelectorOpsImpl extends scala.tasty.reflect.ImportSelectorOps with TastyCoreImpl { +trait ImportSelectorOpsImpl extends scala.tasty.reflect.ImportSelectorOps with ReflectionCoreImpl { object SimpleSelector extends SimpleSelectorExtractor { def unapply(x: ImportSelector)(implicit ctx: Context): Option[Id] = x match { diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala index 30110a5db0b3..6de65588bb19 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala @@ -3,7 +3,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.ast.{Trees, tpd} import dotty.tools.dotc.core.Decorators._ -trait PatternOpsImpl extends scala.tasty.reflect.PatternOps with TastyCoreImpl { +trait PatternOpsImpl extends scala.tasty.reflect.PatternOps with ReflectionCoreImpl { // ----- Patterns ------------------------------------------------- diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala index 28febff4b2e2..05f4ca2bb5f4 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala @@ -1,6 +1,6 @@ package dotty.tools.dotc.tastyreflect -trait PositionOpsImpl extends scala.tasty.reflect.PositionOps with TastyCoreImpl { +trait PositionOpsImpl extends scala.tasty.reflect.PositionOps with ReflectionCoreImpl { def PositionDeco(pos: Position): PositionAPI = new PositionAPI { def start: Int = pos.start diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala index e65a7cdbe5f0..af576182a5d8 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.tastyreflect import scala.tasty.util.{Show, ShowExtractors, ShowSourceCode} -trait PrintersImpl extends scala.tasty.reflect.Printers with scala.tasty.reflect.TastyCore { tasty: TastyImpl => +trait PrintersImpl extends scala.tasty.reflect.Printers with scala.tasty.reflect.ReflectionCore { tasty: ReflectionImpl => def showExtractors: Show[tasty.type] = new ShowExtractors[tasty.type](this) diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala index cb3c557c190b..7fd0642ced89 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala @@ -5,7 +5,7 @@ import dotty.tools.dotc.core.quoted.PickledQuotes import dotty.tools.dotc.reporting.Reporter import dotty.tools.dotc.reporting.diagnostic.MessageContainer -trait QuotedOpsImpl extends scala.tasty.reflect.QuotedOps with TastyCoreImpl { +trait QuotedOpsImpl extends scala.tasty.reflect.QuotedOps with ReflectionCoreImpl { def QuotedExprDeco[T](x: scala.quoted.Expr[T]): QuotedExprAPI = new QuotedExprAPI { def reflect(implicit ctx: Context): Term = PickledQuotes.quotedExprToTree(x) @@ -33,7 +33,7 @@ trait QuotedOpsImpl extends scala.tasty.reflect.QuotedOps with TastyCoreImpl { if (ctx0.reporter.hasErrors) { val stack = new Exception().getStackTrace def filter(elem: StackTraceElement) = - elem.getClassName.startsWith("dotty.tools.dotc.tasty.TastyImpl") || + elem.getClassName.startsWith("dotty.tools.dotc.tasty.ReflectionImpl") || !elem.getClassName.startsWith("dotty.tools.dotc") throw new scala.tasty.TastyTypecheckError( s"""Error during tasty reflection while typing term diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TastyCoreImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionCoreImpl.scala similarity index 96% rename from compiler/src/dotty/tools/dotc/tastyreflect/TastyCoreImpl.scala rename to compiler/src/dotty/tools/dotc/tastyreflect/ReflectionCoreImpl.scala index 529102ddd8e4..cc20918b27d8 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TastyCoreImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionCoreImpl.scala @@ -5,7 +5,7 @@ import dotty.tools.dotc.ast.{tpd, untpd} import dotty.tools.dotc.core.Constants import dotty.tools.dotc.core.Types -trait TastyCoreImpl extends scala.tasty.reflect.TastyCore { +trait ReflectionCoreImpl extends scala.tasty.reflect.ReflectionCore { type Context = core.Contexts.Context diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala similarity index 79% rename from compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala rename to compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala index 736f92093575..3a84154331fd 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala @@ -2,9 +2,9 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.core._ -class TastyImpl(val rootContext: Contexts.Context) - extends scala.tasty.Tasty - with TastyCoreImpl +class ReflectionImpl(val rootContext: Contexts.Context) + extends scala.tasty.Reflection + with ReflectionCoreImpl with CaseDefOpsImpl with ConstantOpsImpl with ContextOpsImpl diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala index 867478ab646b..97ca0c81b01e 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala @@ -1,6 +1,6 @@ package dotty.tools.dotc.tastyreflect -trait SettingsOpsImpl extends scala.tasty.reflect.SettingsOps with TastyCoreImpl { +trait SettingsOpsImpl extends scala.tasty.reflect.SettingsOps with ReflectionCoreImpl { def settings(implicit ctx: Context): Settings = ctx.settings diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala index 0099732d3797..45e93d2e48f5 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala @@ -1,6 +1,6 @@ package dotty.tools.dotc.tastyreflect -trait SignatureOpsImpl extends scala.tasty.reflect.SignatureOps with TastyCoreImpl { +trait SignatureOpsImpl extends scala.tasty.reflect.SignatureOps with ReflectionCoreImpl { object Signature extends SignatureExtractor { def unapply(x: Signature)(implicit ctx: Context): Option[(List[String], String)] = { diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/StandardDefinitions.scala b/compiler/src/dotty/tools/dotc/tastyreflect/StandardDefinitions.scala index f8597b71d79e..55ac75d678ac 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/StandardDefinitions.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/StandardDefinitions.scala @@ -4,7 +4,7 @@ import dotty.tools.dotc.core.Symbols._ trait StandardDefinitions extends scala.tasty.reflect.StandardDefinitions { - tasty: TastyImpl => + tasty: ReflectionImpl => private implicit def ctx: Context = rootContext diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala index a01cdc224bc7..057a34289250 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala @@ -4,7 +4,7 @@ package tastyreflect import dotty.tools.dotc.core.Flags import dotty.tools.dotc.core.Symbols._ -trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with TastyCoreImpl { +trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with ReflectionCoreImpl { def SymbolDeco(symbol: Symbol): SymbolAPI = new SymbolAPI { diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala index 6c92380b84f9..0e6cf00c758d 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala @@ -6,7 +6,7 @@ import dotty.tools.dotc.core.Decorators._ import dotty.tools.dotc.core._ import dotty.tools.dotc.tastyreflect.FromSymbol.{definitionFromSym, packageDefFromSym} -trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with TastyCoreImpl with Helpers { +trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with ReflectionCoreImpl with Helpers { def TreeDeco(tree: Tree): TreeAPI = new TreeAPI { def pos(implicit ctx: Context): Position = tree.pos diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala index 6ff1a7147082..936156c87656 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.core.{Names, Types} -trait TypeOrBoundsOpsImpl extends scala.tasty.reflect.TypeOrBoundsOps with TastyCoreImpl { +trait TypeOrBoundsOpsImpl extends scala.tasty.reflect.TypeOrBoundsOps with ReflectionCoreImpl { // ===== Types ==================================================== diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala index abbf0ec9eb2f..089f608809aa 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala @@ -6,7 +6,7 @@ import dotty.tools.dotc.core.StdNames.nme import dotty.tools.dotc.core.Types -trait TypeOrBoundsTreesOpsImpl extends scala.tasty.reflect.TypeOrBoundsTreeOps with TastyCoreImpl { +trait TypeOrBoundsTreesOpsImpl extends scala.tasty.reflect.TypeOrBoundsTreeOps with ReflectionCoreImpl { // ----- TypeOrBoundsTree ------------------------------------------------ diff --git a/compiler/src/dotty/tools/dotc/transform/Splicer.scala b/compiler/src/dotty/tools/dotc/transform/Splicer.scala index b9bde36415f2..e1cc8fa34062 100644 --- a/compiler/src/dotty/tools/dotc/transform/Splicer.scala +++ b/compiler/src/dotty/tools/dotc/transform/Splicer.scala @@ -18,7 +18,7 @@ import dotty.tools.dotc.core.Types._ import dotty.tools.dotc.core.Symbols._ import dotty.tools.dotc.core.{NameKinds, TypeErasure} import dotty.tools.dotc.core.Constants.Constant -import dotty.tools.dotc.tastyreflect.TastyImpl +import dotty.tools.dotc.tastyreflect.ReflectionImpl import scala.util.control.NonFatal import dotty.tools.dotc.util.SourcePosition @@ -107,7 +107,7 @@ object Splicer { args.toSeq protected def interpretTastyContext()(implicit env: Env): Object = { - new TastyImpl(ctx) { + new ReflectionImpl(ctx) { override def rootPosition: SourcePosition = pos } } @@ -307,7 +307,7 @@ object Splicer { case Literal(Constant(value)) => interpretLiteral(value) - case _ if tree.symbol == defn.TastyTasty_macroContext => + case _ if tree.symbol == defn.TastyReflection_macroContext => interpretTastyContext() case Call(fn, args) => diff --git a/compiler/src/dotty/tools/dotc/transform/Staging.scala b/compiler/src/dotty/tools/dotc/transform/Staging.scala index f2255d53179c..0d027fb135df 100644 --- a/compiler/src/dotty/tools/dotc/transform/Staging.scala +++ b/compiler/src/dotty/tools/dotc/transform/Staging.scala @@ -240,7 +240,7 @@ class Staging extends MacroTransformWithImplicits { case Some(l) => l == level || level == -1 && ( - sym == defn.TastyTasty_macroContext || + sym == defn.TastyReflection_macroContext || // here we assume that Splicer.canBeSpliced was true before going to level -1, // this implies that all non-inline arguments are quoted and that the following two cases are checked // on inline parameters or type parameters. diff --git a/compiler/src/dotty/tools/dotc/typer/Implicits.scala b/compiler/src/dotty/tools/dotc/typer/Implicits.scala index 5b8a0aa4d152..9f9ca160e950 100644 --- a/compiler/src/dotty/tools/dotc/typer/Implicits.scala +++ b/compiler/src/dotty/tools/dotc/typer/Implicits.scala @@ -625,7 +625,7 @@ trait Implicits { self: Typer => } def synthesizedTastyContext(formal: Type): Tree = - if (ctx.inInlineMethod || enclosingInlineds.nonEmpty) ref(defn.TastyTasty_macroContext) + if (ctx.inInlineMethod || enclosingInlineds.nonEmpty) ref(defn.TastyReflection_macroContext) else EmptyTree /** If `formal` is of the form Eq[T, U], where no `Eq` instance exists for @@ -698,7 +698,7 @@ trait Implicits { self: Typer => else trySpecialCase(defn.ClassTagClass, synthesizedClassTag, trySpecialCase(defn.QuotedTypeClass, synthesizedTypeTag, - trySpecialCase(defn.TastyTastyClass, synthesizedTastyContext, + trySpecialCase(defn.TastyReflectionClass, synthesizedTastyContext, trySpecialCase(defn.EqClass, synthesizedEq, failed)))) } } diff --git a/library/src/scala/tasty/Tasty.scala b/library/src/scala/tasty/Reflection.scala similarity index 76% rename from library/src/scala/tasty/Tasty.scala rename to library/src/scala/tasty/Reflection.scala index c022535757fd..413a43107ac0 100644 --- a/library/src/scala/tasty/Tasty.scala +++ b/library/src/scala/tasty/Reflection.scala @@ -2,8 +2,8 @@ package scala.tasty import scala.tasty.reflect._ -abstract class Tasty - extends TastyCore +abstract class Reflection + extends ReflectionCore with CaseDefOps with ConstantOps with ContextOps @@ -21,7 +21,7 @@ abstract class Tasty with TypeOrBoundsTreeOps with TypeOrBoundsOps -object Tasty { +object Reflection { /** Compiler tasty context available in a top level ~ of an inline macro */ - def macroContext: Tasty = throw new Exception("Not in inline macro.") + def macroContext: Reflection = throw new Exception("Not in inline macro.") } diff --git a/library/src/scala/tasty/file/TastyConsumer.scala b/library/src/scala/tasty/file/TastyConsumer.scala index 89baabd6868f..50ab240436f2 100644 --- a/library/src/scala/tasty/file/TastyConsumer.scala +++ b/library/src/scala/tasty/file/TastyConsumer.scala @@ -1,7 +1,7 @@ package scala.tasty.file -import scala.tasty.Tasty +import scala.tasty.Reflection trait TastyConsumer { - def apply(tasty: Tasty)(root: tasty.Tree): Unit + def apply(reflect: Reflection)(root: reflect.Tree): Unit } diff --git a/library/src/scala/tasty/reflect/CaseDefOps.scala b/library/src/scala/tasty/reflect/CaseDefOps.scala index 29be9898d3ce..3cb629d56799 100644 --- a/library/src/scala/tasty/reflect/CaseDefOps.scala +++ b/library/src/scala/tasty/reflect/CaseDefOps.scala @@ -2,7 +2,7 @@ package scala.tasty package reflect /** Tasty reflect case definition */ -trait CaseDefOps extends TastyCore { +trait CaseDefOps extends ReflectionCore { trait CaseDefAPI { def pattern(implicit ctx: Context): Pattern diff --git a/library/src/scala/tasty/reflect/ConstantOps.scala b/library/src/scala/tasty/reflect/ConstantOps.scala index 8bb58cf0c976..d1da1a1614c9 100644 --- a/library/src/scala/tasty/reflect/ConstantOps.scala +++ b/library/src/scala/tasty/reflect/ConstantOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait ConstantOps extends TastyCore { +trait ConstantOps extends ReflectionCore { trait ConstantAPI { def value: Any diff --git a/library/src/scala/tasty/reflect/ContextOps.scala b/library/src/scala/tasty/reflect/ContextOps.scala index 7aec769d2b98..de5c95366c9b 100644 --- a/library/src/scala/tasty/reflect/ContextOps.scala +++ b/library/src/scala/tasty/reflect/ContextOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait ContextOps extends TastyCore { +trait ContextOps extends ReflectionCore { trait ContextAPI { def owner: Symbol diff --git a/library/src/scala/tasty/reflect/IdOps.scala b/library/src/scala/tasty/reflect/IdOps.scala index a42945cba95b..8c2fe62c51ea 100644 --- a/library/src/scala/tasty/reflect/IdOps.scala +++ b/library/src/scala/tasty/reflect/IdOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait IdOps extends TastyCore { +trait IdOps extends ReflectionCore { trait IdAPI { def pos(implicit ctx: Context): Position diff --git a/library/src/scala/tasty/reflect/ImportSelectorOps.scala b/library/src/scala/tasty/reflect/ImportSelectorOps.scala index 7ecde2ace1bb..3dc33e785095 100644 --- a/library/src/scala/tasty/reflect/ImportSelectorOps.scala +++ b/library/src/scala/tasty/reflect/ImportSelectorOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait ImportSelectorOps extends TastyCore { +trait ImportSelectorOps extends ReflectionCore { val SimpleSelector: SimpleSelectorExtractor abstract class SimpleSelectorExtractor { diff --git a/library/src/scala/tasty/reflect/PatternOps.scala b/library/src/scala/tasty/reflect/PatternOps.scala index 3881b34c315e..302355b0b855 100644 --- a/library/src/scala/tasty/reflect/PatternOps.scala +++ b/library/src/scala/tasty/reflect/PatternOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait PatternOps extends TastyCore { +trait PatternOps extends ReflectionCore { trait PatternAPI { def tpe(implicit ctx: Context): Type diff --git a/library/src/scala/tasty/reflect/PositionOps.scala b/library/src/scala/tasty/reflect/PositionOps.scala index 2630b1188073..077a22312dd0 100644 --- a/library/src/scala/tasty/reflect/PositionOps.scala +++ b/library/src/scala/tasty/reflect/PositionOps.scala @@ -1,6 +1,6 @@ package scala.tasty.reflect -trait PositionOps extends TastyCore { +trait PositionOps extends ReflectionCore { trait PositionAPI { def start: Int diff --git a/library/src/scala/tasty/reflect/Printers.scala b/library/src/scala/tasty/reflect/Printers.scala index 9b68c9aab7bf..ce2e599d6fc3 100644 --- a/library/src/scala/tasty/reflect/Printers.scala +++ b/library/src/scala/tasty/reflect/Printers.scala @@ -3,15 +3,15 @@ package reflect import scala.tasty.util.Show -trait Printers { tasty: Tasty => +trait Printers { reflect: Reflection => // TASTy 🎂 needed to for the path dependency `tasty.type` to make sure the // implicit printers of different instances of Tasty are not used. /** Printer that prints the tree as extractors (enabled by default) */ - implicit def showExtractors: Show[tasty.type] + implicit def showExtractors: Show[reflect.type] /** Printer that prints the tree as source code */ - def showSourceCode: Show[tasty.type] + def showSourceCode: Show[reflect.type] /** Adds `show` as an extension method of a `Tree` */ implicit def TreeShowDeco(tree: Tree): ShowAPI @@ -39,7 +39,7 @@ trait Printers { tasty: Tasty => /** Shows the string representation based on an implicit instance of `Show[tasty.type]` * See: `showExtractors` and `showSourceCode` */ - def show(implicit ctx: Context, s: Show[tasty.type]): String + def show(implicit ctx: Context, s: Show[reflect.type]): String } } diff --git a/library/src/scala/tasty/reflect/QuotedOps.scala b/library/src/scala/tasty/reflect/QuotedOps.scala index a2dc29500b08..5f6fd1b0b68f 100644 --- a/library/src/scala/tasty/reflect/QuotedOps.scala +++ b/library/src/scala/tasty/reflect/QuotedOps.scala @@ -1,7 +1,7 @@ package scala.tasty.reflect /** Extension methods on scala.quoted.{Expr|Type} to convert to scala.tasty.Tasty objects */ -trait QuotedOps extends TastyCore { +trait QuotedOps extends ReflectionCore { trait QuotedExprAPI { /** View this expression `Expr[T]` as a `Term` */ diff --git a/library/src/scala/tasty/reflect/TastyCore.scala b/library/src/scala/tasty/reflect/ReflectionCore.scala similarity index 99% rename from library/src/scala/tasty/reflect/TastyCore.scala rename to library/src/scala/tasty/reflect/ReflectionCore.scala index e932c67fc929..f9c18eed6d9e 100644 --- a/library/src/scala/tasty/reflect/TastyCore.scala +++ b/library/src/scala/tasty/reflect/ReflectionCore.scala @@ -109,7 +109,7 @@ package scala.tasty.reflect * * ``` */ -trait TastyCore { +trait ReflectionCore { /** Compilation context */ type Context diff --git a/library/src/scala/tasty/reflect/SettingsOps.scala b/library/src/scala/tasty/reflect/SettingsOps.scala index 98ed30f8c381..8db2930e3325 100644 --- a/library/src/scala/tasty/reflect/SettingsOps.scala +++ b/library/src/scala/tasty/reflect/SettingsOps.scala @@ -1,6 +1,6 @@ package scala.tasty.reflect -trait SettingsOps extends TastyCore { +trait SettingsOps extends ReflectionCore { /** Compiler settings */ def settings(implicit ctx: Context): Settings diff --git a/library/src/scala/tasty/reflect/SignatureOps.scala b/library/src/scala/tasty/reflect/SignatureOps.scala index 34884cccc8df..7ee34e213cb3 100644 --- a/library/src/scala/tasty/reflect/SignatureOps.scala +++ b/library/src/scala/tasty/reflect/SignatureOps.scala @@ -1,6 +1,6 @@ package scala.tasty.reflect -trait SignatureOps extends TastyCore { +trait SignatureOps extends ReflectionCore { val Signature: SignatureExtractor abstract class SignatureExtractor { diff --git a/library/src/scala/tasty/reflect/StandardDefinitions.scala b/library/src/scala/tasty/reflect/StandardDefinitions.scala index e707e36da58f..cb713f27114c 100644 --- a/library/src/scala/tasty/reflect/StandardDefinitions.scala +++ b/library/src/scala/tasty/reflect/StandardDefinitions.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait StandardDefinitions extends TastyCore { +trait StandardDefinitions extends ReflectionCore { /** A value containing all standard definitions in [[DefinitionsApi]] * @group Definitions diff --git a/library/src/scala/tasty/reflect/SymbolOps.scala b/library/src/scala/tasty/reflect/SymbolOps.scala index 72719c0b1555..9193378298c5 100644 --- a/library/src/scala/tasty/reflect/SymbolOps.scala +++ b/library/src/scala/tasty/reflect/SymbolOps.scala @@ -2,7 +2,7 @@ package scala.tasty package reflect /** Tasty reflect symbol */ -trait SymbolOps extends TastyCore { +trait SymbolOps extends ReflectionCore { // Symbol diff --git a/library/src/scala/tasty/reflect/TreeOps.scala b/library/src/scala/tasty/reflect/TreeOps.scala index dcea72e3eb75..4389a5aa00b1 100644 --- a/library/src/scala/tasty/reflect/TreeOps.scala +++ b/library/src/scala/tasty/reflect/TreeOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait TreeOps extends TastyCore { +trait TreeOps extends ReflectionCore { trait TreeAPI { def pos(implicit ctx: Context): Position diff --git a/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala b/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala index 946467ec0644..245b1c5c8c2b 100644 --- a/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala +++ b/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait TypeOrBoundsOps extends TastyCore { +trait TypeOrBoundsOps extends ReflectionCore { // ----- Types ---------------------------------------------------- diff --git a/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala b/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala index 66e2feaef005..726d7f9024a5 100644 --- a/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala +++ b/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait TypeOrBoundsTreeOps extends TastyCore { +trait TypeOrBoundsTreeOps extends ReflectionCore { trait TypeOrBoundsTreeAPI { def tpe(implicit ctx: Context): TypeOrBounds diff --git a/library/src/scala/tasty/util/ConstantExtractor.scala b/library/src/scala/tasty/util/ConstantExtractor.scala index ba5f59cac77e..82dbc4834678 100644 --- a/library/src/scala/tasty/util/ConstantExtractor.scala +++ b/library/src/scala/tasty/util/ConstantExtractor.scala @@ -1,13 +1,13 @@ package scala.tasty.util import scala.quoted.Expr -import scala.tasty.Tasty +import scala.tasty.Reflection /** * Usage: * * ``` - * val Constant = new ConstantExtractor(tasty) + * val Constant = new ConstantExtractor(reflect) * * (x: Expr[B]) match { * case Constant(value) => ... @@ -15,8 +15,8 @@ import scala.tasty.Tasty * } * ``` */ -class ConstantExtractor[T <: Tasty with Singleton](val tasty: T) { - import tasty._ +class ConstantExtractor[R <: Reflection with Singleton](val reflect: Reflection) { + import reflect._ def unapply[T](expr: Expr[T]): Option[T] = { def const(tree: Term): Option[T] = tree match { diff --git a/library/src/scala/tasty/util/Show.scala b/library/src/scala/tasty/util/Show.scala index 0be3a11b9c77..f424db8af561 100644 --- a/library/src/scala/tasty/util/Show.scala +++ b/library/src/scala/tasty/util/Show.scala @@ -1,21 +1,21 @@ package scala.tasty.util -import scala.tasty.Tasty +import scala.tasty.Reflection -abstract class Show[T <: Tasty with Singleton](val tasty: T) { +abstract class Show[R <: Reflection with Singleton](val reflect: R) { - def showTree(tree: tasty.Tree)(implicit ctx: tasty.Context): String + def showTree(tree: reflect.Tree)(implicit ctx: reflect.Context): String - def showCaseDef(caseDef: tasty.CaseDef)(implicit ctx: tasty.Context): String + def showCaseDef(caseDef: reflect.CaseDef)(implicit ctx: reflect.Context): String - def showPattern(pattern: tasty.Pattern)(implicit ctx: tasty.Context): String + def showPattern(pattern: reflect.Pattern)(implicit ctx: reflect.Context): String - def showTypeOrBoundsTree(tpt: tasty.TypeOrBoundsTree)(implicit ctx: tasty.Context): String + def showTypeOrBoundsTree(tpt: reflect.TypeOrBoundsTree)(implicit ctx: reflect.Context): String - def showTypeOrBounds(tpe: tasty.TypeOrBounds)(implicit ctx: tasty.Context): String + def showTypeOrBounds(tpe: reflect.TypeOrBounds)(implicit ctx: reflect.Context): String - def showConstant(const: tasty.Constant)(implicit ctx: tasty.Context): String + def showConstant(const: reflect.Constant)(implicit ctx: reflect.Context): String - def showSymbol(symbol: tasty.Symbol)(implicit ctx: tasty.Context): String + def showSymbol(symbol: reflect.Symbol)(implicit ctx: reflect.Context): String } diff --git a/library/src/scala/tasty/util/ShowExtractors.scala b/library/src/scala/tasty/util/ShowExtractors.scala index 2e770e3d66f5..5011d7cfa7e7 100644 --- a/library/src/scala/tasty/util/ShowExtractors.scala +++ b/library/src/scala/tasty/util/ShowExtractors.scala @@ -1,16 +1,16 @@ package scala.tasty.util -import scala.tasty.Tasty +import scala.tasty.Reflection -class ShowExtractors[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty0) { - import tasty.{rootContext => _, _} +class ShowExtractors[R <: Reflection with Singleton](reclect0: R) extends Show[R](reclect0) { + import reflect.{rootContext => _, _} def showTree(tree: Tree)(implicit ctx: Context): String = new Buffer().visitTree(tree).result() def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = new Buffer().visitCaseDef(caseDef).result() - def showPattern(pattern: tasty.Pattern)(implicit ctx: tasty.Context): String = + def showPattern(pattern: Pattern)(implicit ctx: Context): String = new Buffer().visitPattern(pattern).result() def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String = diff --git a/library/src/scala/tasty/util/ShowSourceCode.scala b/library/src/scala/tasty/util/ShowSourceCode.scala index 2a47b063e9f0..5db944787027 100644 --- a/library/src/scala/tasty/util/ShowSourceCode.scala +++ b/library/src/scala/tasty/util/ShowSourceCode.scala @@ -4,12 +4,12 @@ package util import scala.annotation.switch import scala.tasty.util.SyntaxHighlightUtils._ -class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty0) { - import tasty.{rootContext => _, _} +class ShowSourceCode[R <: Reflection with Singleton](reflect0: R) extends Show[R](reflect0) { + import reflect.{rootContext => _, _} private[this] val color: Boolean = { - import tasty.rootContext - tasty.settings.color + import reflect.rootContext + reflect.settings.color } def showTree(tree: Tree)(implicit ctx: Context): String = @@ -1169,7 +1169,7 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty } } - // TODO Provide some of these in scala.tasty.Tasty.scala and implement them using checks on symbols for performance + // TODO Provide some of these in scala.tasty.Reflect.scala and implement them using checks on symbols for performance private object Types { object JavaLangObject { diff --git a/library/src/scala/tasty/util/TreeAccumulator.scala b/library/src/scala/tasty/util/TreeAccumulator.scala index 5090888a27bb..a0065cd750c7 100644 --- a/library/src/scala/tasty/util/TreeAccumulator.scala +++ b/library/src/scala/tasty/util/TreeAccumulator.scala @@ -1,9 +1,9 @@ package scala.tasty.util -import scala.tasty.Tasty +import scala.tasty.Reflection -abstract class TreeAccumulator[X, T <: Tasty with Singleton](val tasty: T) { - import tasty.{rootContext => _, _} +abstract class TreeAccumulator[X, R <: Reflection with Singleton](val reflect: R) { + import reflect.{rootContext => _, _} // Ties the knot of the traversal: call `foldOver(x, tree))` to dive in the `tree` node. def foldTree(x: X, tree: Tree)(implicit ctx: Context): X diff --git a/library/src/scala/tasty/util/TreeTraverser.scala b/library/src/scala/tasty/util/TreeTraverser.scala index ce23814a74bf..0479c049418a 100644 --- a/library/src/scala/tasty/util/TreeTraverser.scala +++ b/library/src/scala/tasty/util/TreeTraverser.scala @@ -1,9 +1,9 @@ package scala.tasty.util -import scala.tasty.Tasty +import scala.tasty.Reflection -abstract class TreeTraverser[T <: Tasty with Singleton](tasty0: T) extends TreeAccumulator[Unit, T](tasty0) { - import tasty.{rootContext => _, _} +abstract class TreeTraverser[R <: Reflection with Singleton](reflect0: R) extends TreeAccumulator[Unit, R](reflect0) { + import reflect.{rootContext => _, _} def traverseTree(tree: Tree)(implicit ctx: Context): Unit = traverseTreeChildren(tree) def traverseTypeTree(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = traverseTypeTreeChildren(tree) diff --git a/semanticdb/src/dotty/semanticdb/Main.scala b/semanticdb/src/dotty/semanticdb/Main.scala index 987619e8af7a..003a7fe58da0 100644 --- a/semanticdb/src/dotty/semanticdb/Main.scala +++ b/semanticdb/src/dotty/semanticdb/Main.scala @@ -1,6 +1,6 @@ package dotty.semanticdb -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.tasty.util.TreeTraverser import scala.tasty.file._ diff --git a/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala b/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala index 02663dc48af7..4b04aa6cd062 100644 --- a/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala +++ b/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala @@ -1,14 +1,14 @@ package dotty.semanticdb -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.tasty.file.TastyConsumer import scala.tasty.util.TreeTraverser class SemanticdbConsumer extends TastyConsumer { - final def apply(tasty: Tasty)(root: tasty.Tree): Unit = { - import tasty._ - object Traverser extends TreeTraverser[tasty.type](tasty) { + final def apply(reflect: Reflection)(root: reflect.Tree): Unit = { + import reflect._ + object Traverser extends TreeTraverser[reflect.type](reflect) { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = tree match { case IsDefinition(tree) => @@ -19,7 +19,7 @@ class SemanticdbConsumer extends TastyConsumer { } } - Traverser.traverseTree(root)(tasty.rootContext) + Traverser.traverseTree(root)(reflect.rootContext) } def println(x: Any): Unit = Predef.println(x) diff --git a/semanticdb/test/dotty/semanticdb/Tests.scala b/semanticdb/test/dotty/semanticdb/Tests.scala index faa7e64ce70b..00c649a886e1 100644 --- a/semanticdb/test/dotty/semanticdb/Tests.scala +++ b/semanticdb/test/dotty/semanticdb/Tests.scala @@ -1,6 +1,6 @@ package dotty.semanticdb -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.tasty.util.TreeTraverser import scala.tasty.file._ diff --git a/tests/neg/tasty-macro-assert/quoted_1.scala b/tests/neg/tasty-macro-assert/quoted_1.scala index 7431e5336c51..fb5b9e182a0a 100644 --- a/tests/neg/tasty-macro-assert/quoted_1.scala +++ b/tests/neg/tasty-macro-assert/quoted_1.scala @@ -14,8 +14,8 @@ object Asserts { inline def macroAssert(cond: => Boolean): Unit = ~impl('(cond)) - def impl(cond: Expr[Boolean])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl(cond: Expr[Boolean])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val tree = cond.reflect diff --git a/tests/pos-special/fatal-warnings/tasty-parent-unapply.scala b/tests/pos-special/fatal-warnings/tasty-parent-unapply.scala index 3f294be0b5ee..56d780bb1a0a 100644 --- a/tests/pos-special/fatal-warnings/tasty-parent-unapply.scala +++ b/tests/pos-special/fatal-warnings/tasty-parent-unapply.scala @@ -1,12 +1,12 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection object Macros { - def impl(tasty: Tasty): Unit = { - import tasty._ + def impl(reflect: Reflection): Unit = { + import reflect._ def foo(tree: Tree, term: Term, typeTree: TypeTree, parent: TermOrTypeTree) = { diff --git a/tests/pos-with-compiler/tasty/definitions.scala b/tests/pos-with-compiler/tasty/definitions.scala index 1f27c1b10137..d54edfbba574 100644 --- a/tests/pos-with-compiler/tasty/definitions.scala +++ b/tests/pos-with-compiler/tasty/definitions.scala @@ -343,7 +343,7 @@ abstract class Tasty { } // The concrete implementation - hidden from users. -object TastyImpl extends Tasty { +object ReflectionImpl extends Tasty { import definitions._ import dotty.tools.dotc._ import ast.tpd @@ -399,7 +399,7 @@ object TastyImpl extends Tasty { val tasty: Tasty - this val is implemented reflectively, loading TastyImpl on demand. TastyImpl in turn + this val is implemented reflectively, loading ReflectionImpl on demand. ReflectionImpl in turn depends on `tools.dotc`. */ @@ -411,7 +411,7 @@ object TastyImpl extends Tasty { This still does full information hiding, but should be almost as fast as native access. -object TastyImpl extends TastyAST { +object ReflectionImpl extends TastyAST { import definitions._ import dotty.tools.dotc._ import ast.tpd diff --git a/tests/pos/i4449.scala b/tests/pos/i4449.scala index f3cb11ff45fc..29325a202cc2 100644 --- a/tests/pos/i4449.scala +++ b/tests/pos/i4449.scala @@ -1,7 +1,7 @@ class TreeAccumulator2 { - def foo(tasty: Tasty2)(tree: Any): Unit = { - import tasty._ + def foo(reflect: Reflection2)(tree: Any): Unit = { + import reflect._ tree match { case A() => case B() => @@ -12,7 +12,7 @@ class TreeAccumulator2 { } -abstract class Tasty2 { +abstract class Reflection2 { type X type Y diff --git a/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala b/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala index 0341e3304f86..62be04b91933 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-definitions-2/Macro_1.scala @@ -6,8 +6,8 @@ object Foo { inline def inspectBody(i: => Int): String = ~inspectBodyImpl('(i)) - def inspectBodyImpl(x: Expr[Int])(implicit tasty: Tasty): Expr[String] = { - import tasty._ + def inspectBodyImpl(x: Expr[Int])(implicit reflect: Reflection): Expr[String] = { + import reflect._ def definitionString(tree: Tree): Expr[String] = tree.symbol match { case IsDefSymbol(sym) => sym.tree.show.toExpr case IsValSymbol(sym) => sym.tree.show.toExpr diff --git a/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala b/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala index e5fb7d24f9e1..506f7b74f0d8 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-definitions-3/Macro_1.scala @@ -6,8 +6,8 @@ object Foo { inline def inspectBody(i: => Int): String = ~inspectBodyImpl('(i)) - def inspectBodyImpl(x: Expr[Int])(implicit tasty: Tasty): Expr[String] = { - import tasty._ + def inspectBodyImpl(x: Expr[Int])(implicit reflect: Reflection): Expr[String] = { + import reflect._ def definitionString(tree: Tree): Expr[String] = tree.symbol match { case IsDefSymbol(sym) => sym.tree.show.toExpr case IsValSymbol(sym) => sym.tree.show.toExpr diff --git a/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala b/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala index a26886af835f..ff5cf8db4a11 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala @@ -8,8 +8,8 @@ object Macros { implicit inline def printOwners[T](x: => T): Unit = ~impl('(x)) - def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl[T](x: Expr[T])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val buff = new StringBuilder @@ -22,7 +22,7 @@ object Macros { } } - val output = new TreeTraverser(tasty) { + val output = new TreeTraverser(reflect) { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = { tree match { case IsDefinition(tree @ DefDef(name, _, _, _, _)) => diff --git a/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala b/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala index 2caf476ee9ed..dd0360319535 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-load-tree-1/quoted_1.scala @@ -7,8 +7,8 @@ object Foo { inline def inspectBody(i: => Int): String = ~inspectBodyImpl('(i)) - def inspectBodyImpl(x: Expr[Int])(implicit tasty: Tasty): Expr[String] = { - import tasty._ + def inspectBodyImpl(x: Expr[Int])(implicit reflect: Reflection): Expr[String] = { + import reflect._ def definitionString(tree: Tree): Expr[String] = tree.symbol match { case IsClassSymbol(sym) => sym.tree.show.toExpr diff --git a/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala b/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala index 98d628873bd7..1ba9b56a6a04 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-load-tree-2/quoted_1.scala @@ -7,8 +7,8 @@ object Foo { inline def inspectBody(i: => Int): String = ~inspectBodyImpl('(i)) - def inspectBodyImpl(x: Expr[Int])(implicit tasty: Tasty): Expr[String] = { - import tasty._ + def inspectBodyImpl(x: Expr[Int])(implicit reflect: Reflection): Expr[String] = { + import reflect._ def definitionString(tree: Tree): Expr[String] = tree.symbol match { case IsClassSymbol(sym) => sym.tree.show.toExpr diff --git a/tests/run-separate-compilation/i4515b/Macro_1.scala b/tests/run-separate-compilation/i4515b/Macro_1.scala index 26c98d341391..176dc147ea08 100644 --- a/tests/run-separate-compilation/i4515b/Macro_1.scala +++ b/tests/run-separate-compilation/i4515b/Macro_1.scala @@ -1,6 +1,6 @@ -import scala.tasty.Tasty +import scala.tasty.Reflection object Macro { inline def foo: Unit = ~fooImpl - def fooImpl(implicit tasty: Tasty): quoted.Expr[Unit] = '() + def fooImpl(implicit reflect: Reflection): quoted.Expr[Unit] = '() } diff --git a/tests/run-separate-compilation/i5119/Macro_1.scala b/tests/run-separate-compilation/i5119/Macro_1.scala index 70b94d0cd852..c067c82f1d18 100644 --- a/tests/run-separate-compilation/i5119/Macro_1.scala +++ b/tests/run-separate-compilation/i5119/Macro_1.scala @@ -1,13 +1,13 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection object Macro { class StringContextOps(sc: => StringContext) { inline def ff(args: => Any*): String = ~Macro.impl('(sc), '(args)) } implicit inline def XmlQuote(sc: => StringContext): StringContextOps = new StringContextOps(sc) - def impl(sc: Expr[StringContext], args: Expr[Seq[Any]])(implicit tasty: Tasty): Expr[String] = { - import tasty._ + def impl(sc: Expr[StringContext], args: Expr[Seq[Any]])(implicit reflect: Reflection): Expr[String] = { + import reflect._ (sc.reflect.underlyingArgument.show + "\n" + args.reflect.underlyingArgument.show).toExpr } } diff --git a/tests/run-separate-compilation/i5119b/Macro_1.scala b/tests/run-separate-compilation/i5119b/Macro_1.scala index 7c31b07aee20..e15f2fc677fd 100644 --- a/tests/run-separate-compilation/i5119b/Macro_1.scala +++ b/tests/run-separate-compilation/i5119b/Macro_1.scala @@ -1,12 +1,12 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection object Macro { inline def ff(arg1: Any, arg2: Any): String = ~Macro.impl('(arg1), '(arg2)) - def impl(arg1: Expr[Any], arg2: Expr[Any])(implicit tasty: Tasty): Expr[String] = { - import tasty._ + def impl(arg1: Expr[Any], arg2: Expr[Any])(implicit reflect: Reflection): Expr[String] = { + import reflect._ (arg1.reflect.underlyingArgument.show + "\n" + arg2.reflect.underlyingArgument.show).toExpr } diff --git a/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala b/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala index 161517579872..4a18f4d99c52 100644 --- a/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-argument-tree-1/quoted_1.scala @@ -5,8 +5,8 @@ object Macros { inline def inspect[T](x: T): Unit = ~impl('(x)) - def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl[T](x: Expr[T])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val tree = x.reflect '{ println() diff --git a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala index 07dab1d099b6..a994850098cf 100644 --- a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala @@ -1,6 +1,6 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.tasty.util.{TreeTraverser, Show} object Macros { @@ -8,15 +8,15 @@ object Macros { implicit inline def printOwners[T](x: => T): Unit = ~impl('(x)) - def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl[T](x: Expr[T])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val buff = new StringBuilder - val output = new TreeTraverser(tasty) { + val output = new TreeTraverser(reflect) { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = { // Use custom Show[_] here - implicit val printer = new DummyShow(tasty) + implicit val printer = new DummyShow(reflect) tree match { case IsDefinition(tree @ DefDef(name, _, _, _, _)) => buff.append(name) @@ -41,8 +41,8 @@ object Macros { } -class DummyShow[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty0) { - import tasty._ +class DummyShow[R <: Reflection with Singleton](reflect0: R) extends Show[R](reflect0) { + import reflect._ def showTree(tree: Tree)(implicit ctx: Context): String = "Tree" def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = "CaseDef" def showPattern(pattern: Pattern)(implicit ctx: Context): String = "Pattern" diff --git a/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala b/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala index 39adaffa0303..4983a8cf3a27 100644 --- a/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala @@ -7,8 +7,8 @@ object Macros { inline def testDefinitions(): Unit = ~testDefinitionsImpl - def testDefinitionsImpl(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def testDefinitionsImpl(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val buff = List.newBuilder[String] def printout(x: => String): Unit = { diff --git a/tests/run-separate-compilation/tasty-eval/quoted_1.scala b/tests/run-separate-compilation/tasty-eval/quoted_1.scala index 63d98a346db1..99d4df0757e1 100644 --- a/tests/run-separate-compilation/tasty-eval/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-eval/quoted_1.scala @@ -8,19 +8,19 @@ object Macros { implicit inline def foo(i: Int): String = ~impl('(i)) - def impl(i: Expr[Int])(implicit tasty: Tasty): Expr[String] = { + def impl(i: Expr[Int])(implicit reflect: Reflection): Expr[String] = { value(i).toString.toExpr } - inline implicit def value[X](e: Expr[X])(implicit tasty: Tasty, ev: Valuable[X]): Option[X] = ev.value(e) + inline implicit def value[X](e: Expr[X])(implicit reflect: Reflection, ev: Valuable[X]): Option[X] = ev.value(e) trait Valuable[X] { - def value(e: Expr[X])(implicit tasty: Tasty): Option[X] + def value(e: Expr[X])(implicit reflect: Reflection): Option[X] } implicit def intIsEvalable: Valuable[Int] = new Valuable[Int] { - override def value(e: Expr[Int])(implicit tasty: Tasty): Option[Int] = { - import tasty._ + override def value(e: Expr[Int])(implicit reflect: Reflection): Option[Int] = { + import reflect._ e.reflect.tpe match { case Type.SymRef(IsValSymbol(sym), pre) => diff --git a/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala index b6023c627e2b..88608af144a2 100644 --- a/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-1/quoted_1.scala @@ -7,8 +7,8 @@ object Macros { implicit inline def printTree[T](x: => T): Unit = ~impl('(x)) - def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl[T](x: Expr[T])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val tree = x.reflect val treeStr = tree.show diff --git a/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala index 776084414448..429ee760ad6c 100644 --- a/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-2/quoted_1.scala @@ -7,8 +7,8 @@ object Macros { implicit inline def printTree[T](x: => T): Unit = ~impl('(x)) - def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl[T](x: Expr[T])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val tree = x.reflect diff --git a/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala index 2847fa7bbb76..b7681076608c 100644 --- a/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala @@ -1,6 +1,6 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.tasty.util.TreeTraverser object Macros { @@ -8,11 +8,11 @@ object Macros { implicit inline def printTypes[T](x: => T): Unit = ~impl('(x)) - def impl[T](x: Expr[T])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl[T](x: Expr[T])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val buff = new StringBuilder - val traverser = new TreeTraverser(tasty) { + val traverser = new TreeTraverser(reflect) { override def traverseTypeTree(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = { buff.append(tree.tpe.show) buff.append("\n\n") diff --git a/tests/run-separate-compilation/tasty-extractors-constants-1/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-constants-1/quoted_1.scala index 46e4f5bf26e2..d9b6f1ead5f7 100644 --- a/tests/run-separate-compilation/tasty-extractors-constants-1/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-constants-1/quoted_1.scala @@ -7,13 +7,13 @@ object Macros { implicit inline def testMacro: Unit = ~impl - def impl(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val buff = new StringBuilder def stagedPrintln(x: Any): Unit = buff append java.util.Objects.toString(x) append "\n" - val Constant = new ConstantExtractor(tasty) + val Constant = new ConstantExtractor(reflect) 3.toExpr match { case Constant(n) => stagedPrintln(n) } '(4) match { case Constant(n) => stagedPrintln(n) } diff --git a/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala index 596a29758ce1..8d73656cf6d4 100644 --- a/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala @@ -7,8 +7,8 @@ object Macros { implicit inline def printType[T]: Unit = ~impl('[T]) - def impl[T](x: Type[T])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl[T](x: Type[T])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val tree = x.reflect '{ diff --git a/tests/run-separate-compilation/tasty-getfile-implicit-fun-context/Macro_1.scala b/tests/run-separate-compilation/tasty-getfile-implicit-fun-context/Macro_1.scala index c588d45985e2..51b1eeced766 100644 --- a/tests/run-separate-compilation/tasty-getfile-implicit-fun-context/Macro_1.scala +++ b/tests/run-separate-compilation/tasty-getfile-implicit-fun-context/Macro_1.scala @@ -1,17 +1,17 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection object SourceFiles { - type Macro[X] = implicit Tasty => Expr[X] - def tastyContext(implicit ctx: Tasty): Tasty = ctx + type Macro[X] = implicit Reflection => Expr[X] + def tastyContext(implicit ctx: Reflection): Reflection = ctx implicit inline def getThisFile: String = ~getThisFileImpl def getThisFileImpl: Macro[String] = { - val tasty = tastyContext - import tasty._ + val reflect = tastyContext + import reflect._ rootContext.source.getFileName.toString.toExpr } diff --git a/tests/run-separate-compilation/tasty-getfile/Macro_1.scala b/tests/run-separate-compilation/tasty-getfile/Macro_1.scala index ad20322d7977..8a4e0dca1c1b 100644 --- a/tests/run-separate-compilation/tasty-getfile/Macro_1.scala +++ b/tests/run-separate-compilation/tasty-getfile/Macro_1.scala @@ -1,13 +1,13 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection object SourceFiles { implicit inline def getThisFile: String = ~getThisFileImpl - private def getThisFileImpl(implicit tasty: Tasty): Expr[String] = { - import tasty._ + private def getThisFileImpl(implicit reflect: Reflection): Expr[String] = { + import reflect._ rootContext.source.getFileName.toString.toExpr } diff --git a/tests/run-separate-compilation/tasty-implicit-fun-context-2/Macro_1.scala b/tests/run-separate-compilation/tasty-implicit-fun-context-2/Macro_1.scala index 4cafc46592bb..38778a12a183 100644 --- a/tests/run-separate-compilation/tasty-implicit-fun-context-2/Macro_1.scala +++ b/tests/run-separate-compilation/tasty-implicit-fun-context-2/Macro_1.scala @@ -1,15 +1,15 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection object Foo { - type Macro[X] = implicit Tasty => Expr[X] - type Tastier[X] = implicit Tasty => X + type Macro[X] = implicit Reflection => Expr[X] + type Tastier[X] = implicit Reflection => X implicit inline def foo: String = ~fooImpl - def fooImpl(implicit tasty: Tasty): implicit Tasty => Tastier[implicit Tasty => Macro[String]] = { + def fooImpl(implicit reflect: Reflection): implicit Reflection => Tastier[implicit Reflection => Macro[String]] = { '("abc") } diff --git a/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala b/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala index 5a30dd1cdfa8..5f93dec2ed4f 100644 --- a/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-indexed-map/quoted_1.scala @@ -26,8 +26,8 @@ object Index { implicit inline def succ[K, H, T](implicit prev: => Index[K, T]): Index[K, (H, T)] = ~succImpl[K, H, T] - def succImpl[K, H, T](implicit tasty: Tasty, k: Type[K], h: Type[H], t: Type[T]): Expr[Index[K, (H, T)]] = { - import tasty._ + def succImpl[K, H, T](implicit reflect: Reflection, k: Type[K], h: Type[H], t: Type[T]): Expr[Index[K, (H, T)]] = { + import reflect._ def name(tp: TypeOrBounds): String = tp match { case Type.ConstantType(Constant.String(str)) => str diff --git a/tests/run-separate-compilation/tasty-linenumber-2/quoted_1.scala b/tests/run-separate-compilation/tasty-linenumber-2/quoted_1.scala index a3d1dddb428c..164a326e9040 100644 --- a/tests/run-separate-compilation/tasty-linenumber-2/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-linenumber-2/quoted_1.scala @@ -10,8 +10,8 @@ object LineNumber { implicit inline def line: LineNumber = ~lineImpl - def lineImpl(implicit tasty: Tasty): Expr[LineNumber] = { - import tasty._ + def lineImpl(implicit reflect: Reflection): Expr[LineNumber] = { + import reflect._ '(new LineNumber(~rootPosition.startLine.toExpr)) } diff --git a/tests/run-separate-compilation/tasty-linenumber/quoted_1.scala b/tests/run-separate-compilation/tasty-linenumber/quoted_1.scala index 5314c80f44cb..1e4df5b9637b 100644 --- a/tests/run-separate-compilation/tasty-linenumber/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-linenumber/quoted_1.scala @@ -11,8 +11,8 @@ object LineNumber { implicit inline def line[T >: Unit <: Unit]: LineNumber = ~lineImpl('[T]) - def lineImpl(x: Type[Unit])(implicit tasty: Tasty): Expr[LineNumber] = { - import tasty._ + def lineImpl(x: Type[Unit])(implicit reflect: Reflection): Expr[LineNumber] = { + import reflect._ '(new LineNumber(~rootPosition.startLine.toExpr)) } diff --git a/tests/run-separate-compilation/tasty-location/quoted_1.scala b/tests/run-separate-compilation/tasty-location/quoted_1.scala index dc551eb92cac..ddcf0e5a5e96 100644 --- a/tests/run-separate-compilation/tasty-location/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-location/quoted_1.scala @@ -8,8 +8,8 @@ object Location { implicit inline def location: Location = ~impl - def impl(implicit tasty: Tasty): Expr[Location] = { - import tasty._ + def impl(implicit reflect: Reflection): Expr[Location] = { + import reflect._ def listOwnerNames(sym: Symbol, acc: List[String]): List[String] = if (sym == definitions.RootClass || sym == definitions.EmptyPackageClass) acc diff --git a/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala b/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala index 8b4977f004be..ffc46a6323f0 100644 --- a/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-macro-assert/quoted_1.scala @@ -14,8 +14,8 @@ object Asserts { inline def macroAssert(cond: => Boolean): Unit = ~impl('(cond)) - def impl(cond: Expr[Boolean])(implicit tasty: Tasty): Expr[Unit] = { - import tasty._ + def impl(cond: Expr[Boolean])(implicit reflect: Reflection): Expr[Unit] = { + import reflect._ val tree = cond.reflect diff --git a/tests/run-separate-compilation/tasty-positioned/quoted_1.scala b/tests/run-separate-compilation/tasty-positioned/quoted_1.scala index ef74d6f599ff..070453104e45 100644 --- a/tests/run-separate-compilation/tasty-positioned/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-positioned/quoted_1.scala @@ -11,8 +11,8 @@ object Positioned { implicit inline def apply[T](x: => T): Positioned[T] = ~impl('(x)) - def impl[T](x: Expr[T])(implicit ev: Type[T], tasty: Tasty): Expr[Positioned[T]] = { - import tasty.{Position => _, _} + def impl[T](x: Expr[T])(implicit ev: Type[T], reflect: Reflection): Expr[Positioned[T]] = { + import reflect.{Position => _, _} val pos = rootPosition val path = pos.sourceFile.toString.toExpr diff --git a/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala b/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala index ad69513e2d13..24209a7eed77 100644 --- a/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-subtyping/quoted_1.scala @@ -10,14 +10,14 @@ object Macros { inline def isSubTypeOf[T, U]: Boolean = ~isSubTypeOfImpl('[T], '[U]) - def isTypeEqualImpl[T, U](t: Type[T], u: Type[U])(implicit tasty: Tasty): Expr[Boolean] = { - import tasty._ + def isTypeEqualImpl[T, U](t: Type[T], u: Type[U])(implicit reflect: Reflection): Expr[Boolean] = { + import reflect._ val isTypeEqual = t.reflect.tpe =:= u.reflect.tpe isTypeEqual.toExpr } - def isSubTypeOfImpl[T, U](t: Type[T], u: Type[U])(implicit tasty: Tasty): Expr[Boolean] = { - import tasty._ + def isSubTypeOfImpl[T, U](t: Type[T], u: Type[U])(implicit reflect: Reflection): Expr[Boolean] = { + import reflect._ val isTypeEqual = t.reflect.tpe <:< u.reflect.tpe isTypeEqual.toExpr } diff --git a/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala b/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala index 6f2103620eb3..c57de5b73768 100644 --- a/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala +++ b/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala @@ -1,5 +1,5 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.language.implicitConversions @@ -12,8 +12,8 @@ object XmlQuote { } def impl(receiver: Expr[SCOps], args: Expr[Seq[Any]]) - (implicit tasty: Tasty): Expr[Xml] = { - import tasty._ + (implicit reflect: Reflection): Expr[Xml] = { + import reflect._ import Term._ def abort(msg: String): Nothing = @@ -22,7 +22,7 @@ object XmlQuote { // for debugging purpose def pp(tree: Tree): Unit = { println(tree.show) - println(tasty.showSourceCode.showTree(tree)) + println(reflect.showSourceCode.showTree(tree)) } def liftListOfAny(lst: List[Term]): Expr[List[Any]] = lst match { diff --git a/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala b/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala index ec73260a607f..36644cf04433 100644 --- a/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala +++ b/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala @@ -1,7 +1,7 @@ import scala.quoted._ -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.language.implicitConversions @@ -15,14 +15,14 @@ object XmlQuote { implicit inline def SCOps(ctx: => StringContext): SCOps = new SCOps(ctx) def impl(receiver: Expr[SCOps], args: Expr[Seq[Any]]) - (implicit tasty: Tasty): Expr[Xml] = { - import tasty._ + (implicit reflect: Reflection): Expr[Xml] = { + import reflect._ import Term._ // for debugging purpose def pp(tree: Tree): Unit = { println(tree.show) - println(tasty.showSourceCode.showTree(tree)) + println(reflect.showSourceCode.showTree(tree)) } def isSCOpsConversion(tree: Term) = diff --git a/tests/run-with-compiler/tasty-consumer/Test.scala b/tests/run-with-compiler/tasty-consumer/Test.scala index 3cbb57aa07e3..4c3eeda61410 100644 --- a/tests/run-with-compiler/tasty-consumer/Test.scala +++ b/tests/run-with-compiler/tasty-consumer/Test.scala @@ -1,4 +1,4 @@ -import scala.tasty.Tasty +import scala.tasty.Reflection import scala.tasty.util.TreeTraverser import scala.tasty.file._ @@ -10,9 +10,9 @@ object Test { class DBConsumer extends TastyConsumer { - final def apply(tasty: Tasty)(root: tasty.Tree): Unit = { - import tasty._ - object Traverser extends TreeTraverser[tasty.type](tasty) { + final def apply(reflect: Reflection)(root: reflect.Tree): Unit = { + import reflect._ + object Traverser extends TreeTraverser[reflect.type](reflect) { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = tree match { case IsDefinition(tree) => @@ -23,7 +23,7 @@ class DBConsumer extends TastyConsumer { } } - Traverser.traverseTree(root)(tasty.rootContext) + Traverser.traverseTree(root)(reflect.rootContext) } } diff --git a/tests/run-with-compiler/tasty-extractors-constants-2/quoted_1.scala b/tests/run-with-compiler/tasty-extractors-constants-2/quoted_1.scala index bf129b786c6c..d3e1ecdba402 100644 --- a/tests/run-with-compiler/tasty-extractors-constants-2/quoted_1.scala +++ b/tests/run-with-compiler/tasty-extractors-constants-2/quoted_1.scala @@ -8,7 +8,7 @@ object Macros { inline def testMacro: Unit = ~impl - def impl(implicit tasty: Tasty): Expr[Unit] = { + def impl(implicit reflect: Reflection): Expr[Unit] = { // 2 is a lifted constant val show1 = power(2.toExpr, 3.0.toExpr).show val run1 = power(2.toExpr, 3.0.toExpr).run @@ -43,10 +43,10 @@ object Macros { } } - def power(n: Expr[Int], x: Expr[Double])(implicit tasty: Tasty): Expr[Double] = { - import tasty._ + def power(n: Expr[Int], x: Expr[Double])(implicit reflect: Reflection): Expr[Double] = { + import reflect._ - val Constant = new ConstantExtractor(tasty) + val Constant = new ConstantExtractor(reflect) n match { case Constant(n1) => powerCode(n1, x) case _ => '{ dynamicPower(~n, ~x) } From 950c633bab044a2a35f398632c93f92aa2c26e09 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Wed, 7 Nov 2018 01:02:29 +0000 Subject: [PATCH 3/6] Rename tasty.Show to tasty.Printer Aslo add `showCode` on Tree, TypeTree, ... --- .../dotc/tastyreflect/PrintersImpl.scala | 29 ++++++++++++------- .../src/scala/tasty/reflect/Printers.scala | 21 ++++---------- ...tractors.scala => ExtractorsPrinter.scala} | 2 +- .../tasty/util/{Show.scala => Printer.scala} | 2 +- ...urceCode.scala => SourceCodePrinter.scala} | 2 +- .../tasty-custom-show/quoted_1.scala | 10 +++---- .../xml-interpolation-1/XmlQuote_1.scala | 2 +- .../xml-interpolation-2/XmlQuote_1.scala | 2 +- 8 files changed, 34 insertions(+), 36 deletions(-) rename library/src/scala/tasty/util/{ShowExtractors.scala => ExtractorsPrinter.scala} (99%) rename library/src/scala/tasty/util/{Show.scala => Printer.scala} (89%) rename library/src/scala/tasty/util/{ShowSourceCode.scala => SourceCodePrinter.scala} (99%) diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala index af576182a5d8..a61e5ca22e82 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala @@ -1,46 +1,53 @@ package dotty.tools.dotc.tastyreflect -import scala.tasty.util.{Show, ShowExtractors, ShowSourceCode} +import scala.tasty.util.{Printer, ExtractorsPrinter, SourceCodePrinter} -trait PrintersImpl extends scala.tasty.reflect.Printers with scala.tasty.reflect.ReflectionCore { tasty: ReflectionImpl => +trait PrintersImpl extends scala.tasty.reflect.Printers with scala.tasty.reflect.ReflectionCore { reflect: ReflectionImpl => - def showExtractors: Show[tasty.type] = new ShowExtractors[tasty.type](this) + def showExtractors: Printer[reflect.type] = new ExtractorsPrinter[reflect.type](this) - def showSourceCode: Show[tasty.type] = new ShowSourceCode[tasty.type](this) + def showSourceCode: Printer[reflect.type] = new SourceCodePrinter[reflect.type](this) /** Adds `show` as an extension method of a `Tree` */ def TreeShowDeco(tree: Tree): ShowAPI = new ShowAPI { - def show(implicit ctx: Context, s: Show[tasty.type]): String = s.showTree(tree) + def show(implicit ctx: Context): String = showExtractors.showTree(tree) + def showCode(implicit ctx: Context): String = showSourceCode.showTree(tree) } /** Adds `show` as an extension method of a `TypeOrBoundsTree` */ def TypeOrBoundsTreeShowDeco(tpt: TypeOrBoundsTree): ShowAPI = new ShowAPI { - def show(implicit ctx: Context, s: Show[tasty.type]): String = s.showTypeOrBoundsTree(tpt) + def show(implicit ctx: Context): String = showExtractors.showTypeOrBoundsTree(tpt) + def showCode(implicit ctx: Context): String = showSourceCode.showTypeOrBoundsTree(tpt) } /** Adds `show` as an extension method of a `TypeOrBounds` */ def TypeOrBoundsShowDeco(tpe: TypeOrBounds): ShowAPI = new ShowAPI { - def show(implicit ctx: Context, s: Show[tasty.type]): String = s.showTypeOrBounds(tpe) + def show(implicit ctx: Context): String = showExtractors.showTypeOrBounds(tpe) + def showCode(implicit ctx: Context): String = showSourceCode.showTypeOrBounds(tpe) } /** Adds `show` as an extension method of a `CaseDef` */ def CaseDefShowDeco(caseDef: CaseDef): ShowAPI = new ShowAPI { - def show(implicit ctx: Context, s: Show[tasty.type]): String = s.showCaseDef(caseDef) + def show(implicit ctx: Context): String = showExtractors.showCaseDef(caseDef) + def showCode(implicit ctx: Context): String = showSourceCode.showCaseDef(caseDef) } /** Adds `show` as an extension method of a `Pattern` */ def PatternShowDeco(pattern: Pattern): ShowAPI = new ShowAPI { - def show(implicit ctx: Context, s: Show[tasty.type]): String = s.showPattern(pattern) + def show(implicit ctx: Context): String = showExtractors.showPattern(pattern) + def showCode(implicit ctx: Context): String = showSourceCode.showPattern(pattern) } /** Adds `show` as an extension method of a `Constant` */ def ConstantShowDeco(const: Constant): ShowAPI = new ShowAPI { - def show(implicit ctx: Context, s: Show[tasty.type]): String = s.showConstant(const) + def show(implicit ctx: Context): String = showExtractors.showConstant(const) + def showCode(implicit ctx: Context): String = showSourceCode.showConstant(const) } /** Adds `show` as an extension method of a `Symbol` */ def SymbolShowDeco(symbol: Symbol): ShowAPI = new ShowAPI { - def show(implicit ctx: Context, s: Show[tasty.type]): String = s.showSymbol(symbol) + def show(implicit ctx: Context): String = showExtractors.showSymbol(symbol) + def showCode(implicit ctx: Context): String = showSourceCode.showSymbol(symbol) } } diff --git a/library/src/scala/tasty/reflect/Printers.scala b/library/src/scala/tasty/reflect/Printers.scala index ce2e599d6fc3..4ad38c1b4ff6 100644 --- a/library/src/scala/tasty/reflect/Printers.scala +++ b/library/src/scala/tasty/reflect/Printers.scala @@ -1,17 +1,7 @@ package scala.tasty package reflect -import scala.tasty.util.Show - -trait Printers { reflect: Reflection => - // TASTy 🎂 needed to for the path dependency `tasty.type` to make sure the - // implicit printers of different instances of Tasty are not used. - - /** Printer that prints the tree as extractors (enabled by default) */ - implicit def showExtractors: Show[reflect.type] - - /** Printer that prints the tree as source code */ - def showSourceCode: Show[reflect.type] +trait Printers extends ReflectionCore { /** Adds `show` as an extension method of a `Tree` */ implicit def TreeShowDeco(tree: Tree): ShowAPI @@ -36,10 +26,11 @@ trait Printers { reflect: Reflection => /** Define `show` as method */ trait ShowAPI { - /** Shows the string representation based on an implicit instance of `Show[tasty.type]` - * See: `showExtractors` and `showSourceCode` - */ - def show(implicit ctx: Context, s: Show[reflect.type]): String + /** Shows the tree as extractors */ + def show(implicit ctx: Context): String + + /** Shows the tree as source code */ + def showCode(implicit ctx: Context): String } } diff --git a/library/src/scala/tasty/util/ShowExtractors.scala b/library/src/scala/tasty/util/ExtractorsPrinter.scala similarity index 99% rename from library/src/scala/tasty/util/ShowExtractors.scala rename to library/src/scala/tasty/util/ExtractorsPrinter.scala index 5011d7cfa7e7..9f9f56868a18 100644 --- a/library/src/scala/tasty/util/ShowExtractors.scala +++ b/library/src/scala/tasty/util/ExtractorsPrinter.scala @@ -2,7 +2,7 @@ package scala.tasty.util import scala.tasty.Reflection -class ShowExtractors[R <: Reflection with Singleton](reclect0: R) extends Show[R](reclect0) { +class ExtractorsPrinter[R <: Reflection with Singleton](reclect0: R) extends Printer[R](reclect0) { import reflect.{rootContext => _, _} def showTree(tree: Tree)(implicit ctx: Context): String = diff --git a/library/src/scala/tasty/util/Show.scala b/library/src/scala/tasty/util/Printer.scala similarity index 89% rename from library/src/scala/tasty/util/Show.scala rename to library/src/scala/tasty/util/Printer.scala index f424db8af561..46bc0a21a6b2 100644 --- a/library/src/scala/tasty/util/Show.scala +++ b/library/src/scala/tasty/util/Printer.scala @@ -2,7 +2,7 @@ package scala.tasty.util import scala.tasty.Reflection -abstract class Show[R <: Reflection with Singleton](val reflect: R) { +abstract class Printer[R <: Reflection with Singleton](val reflect: R) { def showTree(tree: reflect.Tree)(implicit ctx: reflect.Context): String diff --git a/library/src/scala/tasty/util/ShowSourceCode.scala b/library/src/scala/tasty/util/SourceCodePrinter.scala similarity index 99% rename from library/src/scala/tasty/util/ShowSourceCode.scala rename to library/src/scala/tasty/util/SourceCodePrinter.scala index 5db944787027..e626ea254129 100644 --- a/library/src/scala/tasty/util/ShowSourceCode.scala +++ b/library/src/scala/tasty/util/SourceCodePrinter.scala @@ -4,7 +4,7 @@ package util import scala.annotation.switch import scala.tasty.util.SyntaxHighlightUtils._ -class ShowSourceCode[R <: Reflection with Singleton](reflect0: R) extends Show[R](reflect0) { +class SourceCodePrinter[R <: Reflection with Singleton](reflect0: R) extends Printer[R](reflect0) { import reflect.{rootContext => _, _} private[this] val color: Boolean = { diff --git a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala index a994850098cf..78adc166e75f 100644 --- a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala @@ -1,7 +1,7 @@ import scala.quoted._ import scala.tasty.Reflection -import scala.tasty.util.{TreeTraverser, Show} +import scala.tasty.util.{TreeTraverser, Printer} object Macros { @@ -16,17 +16,17 @@ object Macros { val output = new TreeTraverser(reflect) { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = { // Use custom Show[_] here - implicit val printer = new DummyShow(reflect) + val printer = new DummyShow(reflect) tree match { case IsDefinition(tree @ DefDef(name, _, _, _, _)) => buff.append(name) buff.append("\n") - buff.append(tree.show) + buff.append(printer.showTree(tree)) buff.append("\n\n") case IsDefinition(tree @ ValDef(name, _, _)) => buff.append(name) buff.append("\n") - buff.append(tree.show) + buff.append(printer.showTree(tree)) buff.append("\n\n") case _ => } @@ -41,7 +41,7 @@ object Macros { } -class DummyShow[R <: Reflection with Singleton](reflect0: R) extends Show[R](reflect0) { +class DummyShow[R <: Reflection with Singleton](reflect0: R) extends Printer[R](reflect0) { import reflect._ def showTree(tree: Tree)(implicit ctx: Context): String = "Tree" def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = "CaseDef" diff --git a/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala b/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala index c57de5b73768..928ed8ceab78 100644 --- a/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala +++ b/tests/run-separate-compilation/xml-interpolation-1/XmlQuote_1.scala @@ -22,7 +22,7 @@ object XmlQuote { // for debugging purpose def pp(tree: Tree): Unit = { println(tree.show) - println(reflect.showSourceCode.showTree(tree)) + println(tree.showCode) } def liftListOfAny(lst: List[Term]): Expr[List[Any]] = lst match { diff --git a/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala b/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala index 36644cf04433..70f101bbb47a 100644 --- a/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala +++ b/tests/run-separate-compilation/xml-interpolation-2/XmlQuote_1.scala @@ -22,7 +22,7 @@ object XmlQuote { // for debugging purpose def pp(tree: Tree): Unit = { println(tree.show) - println(reflect.showSourceCode.showTree(tree)) + println(tree.showCode) } def isSCOpsConversion(tree: Term) = From 5071ee8fd06ac4b3aed9c86a96e58ac11340408d Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Wed, 7 Nov 2018 02:53:52 +0000 Subject: [PATCH 4/6] Refactor TreeAcumulator to simplify use Remove the need to handle path dependent tasty.Reflection --- library/src/scala/tasty/Reflection.scala | 1 + .../src/scala/tasty/reflect/TreeUtils.scala | 141 ++++++++++++++++++ .../scala/tasty/util/TreeAccumulator.scala | 113 -------------- .../src/scala/tasty/util/TreeTraverser.scala | 23 --- semanticdb/src/dotty/semanticdb/Main.scala | 1 - .../dotty/semanticdb/SemanticdbConsumer.scala | 3 +- semanticdb/test/dotty/semanticdb/Tests.scala | 1 - .../tasty-extractors-owners/quoted_1.scala | 3 +- .../tasty-custom-show/quoted_1.scala | 4 +- .../tasty-definitions-1/quoted_1.scala | 1 - .../tasty-eval/quoted_1.scala | 1 - .../tasty-extractors-3/quoted_1.scala | 3 +- .../tasty-extractors-types/quoted_1.scala | 1 - .../tasty-consumer/Test.scala | 3 +- 14 files changed, 148 insertions(+), 151 deletions(-) create mode 100644 library/src/scala/tasty/reflect/TreeUtils.scala delete mode 100644 library/src/scala/tasty/util/TreeAccumulator.scala delete mode 100644 library/src/scala/tasty/util/TreeTraverser.scala diff --git a/library/src/scala/tasty/Reflection.scala b/library/src/scala/tasty/Reflection.scala index 413a43107ac0..48532b69d3ba 100644 --- a/library/src/scala/tasty/Reflection.scala +++ b/library/src/scala/tasty/Reflection.scala @@ -18,6 +18,7 @@ abstract class Reflection with StandardDefinitions with SymbolOps with TreeOps + with TreeUtils with TypeOrBoundsTreeOps with TypeOrBoundsOps diff --git a/library/src/scala/tasty/reflect/TreeUtils.scala b/library/src/scala/tasty/reflect/TreeUtils.scala new file mode 100644 index 000000000000..acf9e4fbd2c9 --- /dev/null +++ b/library/src/scala/tasty/reflect/TreeUtils.scala @@ -0,0 +1,141 @@ +package scala.tasty +package reflect + +/** Tasty reflect case definition */ +trait TreeUtils + extends ReflectionCore + with CaseDefOps + with PatternOps + with SymbolOps + with TreeOps + with TypeOrBoundsTreeOps { + + abstract class TreeAccumulator[X] { + + // Ties the knot of the traversal: call `foldOver(x, tree))` to dive in the `tree` node. + def foldTree(x: X, tree: Tree)(implicit ctx: Context): X + def foldTypeTree(x: X, tree: TypeOrBoundsTree)(implicit ctx: Context): X + def foldCaseDef(x: X, tree: CaseDef)(implicit ctx: Context): X + def foldPattern(x: X, tree: Pattern)(implicit ctx: Context): X + + def foldTrees(x: X, trees: Iterable[Tree])(implicit ctx: Context): X = (x /: trees)(foldTree) + def foldTypeTrees(x: X, trees: Iterable[TypeOrBoundsTree])(implicit ctx: Context): X = (x /: trees)(foldTypeTree) + def foldCaseDefs(x: X, trees: Iterable[CaseDef])(implicit ctx: Context): X = (x /: trees)(foldCaseDef) + def foldPatterns(x: X, trees: Iterable[Pattern])(implicit ctx: Context): X = (x /: trees)(foldPattern) + private def foldParents(x: X, trees: Iterable[TermOrTypeTree])(implicit ctx: Context): X = (x /: trees)(foldOverTermOrTypeTree) + + def foldOverTree(x: X, tree: Tree)(implicit ctx: Context): X = { + def localCtx(definition: Definition): Context = definition.symbol.localContext + tree match { + case Term.Ident(_) => + x + case Term.Select(qualifier, _, _) => + foldTree(x, qualifier) + case Term.This(qual) => + x + case Term.Super(qual, _) => + foldTree(x, qual) + case Term.Apply(fun, args) => + foldTrees(foldTree(x, fun), args) + case Term.TypeApply(fun, args) => + foldTypeTrees(foldTree(x, fun), args) + case Term.Literal(const) => + x + case Term.New(tpt) => + foldTypeTree(x, tpt) + case Term.Typed(expr, tpt) => + foldTypeTree(foldTree(x, expr), tpt) + case Term.NamedArg(_, arg) => + foldTree(x, arg) + case Term.Assign(lhs, rhs) => + foldTree(foldTree(x, lhs), rhs) + case Term.Block(stats, expr) => + foldTree(foldTrees(x, stats), expr) + case Term.If(cond, thenp, elsep) => + foldTree(foldTree(foldTree(x, cond), thenp), elsep) + case Term.Lambda(meth, tpt) => + val a = foldTree(x, meth) + tpt.fold(a)(b => foldTypeTree(a, b)) + case Term.Match(selector, cases) => + foldCaseDefs(foldTree(x, selector), cases) + case Term.Return(expr) => + foldTree(x, expr) + case Term.Try(block, handler, finalizer) => + foldTrees(foldCaseDefs(foldTree(x, block), handler), finalizer) + case Term.Repeated(elems) => + foldTrees(x, elems) + case Term.Inlined(call, bindings, expansion) => + foldTree(foldTrees(x, bindings), expansion) + case IsDefinition(vdef @ ValDef(_, tpt, rhs)) => + implicit val ctx = localCtx(vdef) + foldTrees(foldTypeTree(x, tpt), rhs) + case IsDefinition(ddef @ DefDef(_, tparams, vparamss, tpt, rhs)) => + implicit val ctx = localCtx(ddef) + foldTrees(foldTypeTree((foldTrees(x, tparams) /: vparamss)(foldTrees), tpt), rhs) + case IsDefinition(tdef @ TypeDef(_, rhs)) => + implicit val ctx = localCtx(tdef) + foldTypeTree(x, rhs) + case IsDefinition(cdef @ ClassDef(_, constr, parents, self, body)) => + implicit val ctx = localCtx(cdef) + foldTrees(foldTrees(foldParents(foldTree(x, constr), parents), self), body) + case Import(expr, selectors) => + foldTree(x, expr) + case IsPackageClause(clause @ PackageClause(pid, stats)) => + foldTrees(foldTree(x, pid), stats)(clause.symbol.localContext) + } + } + + def foldOverTypeTree(x: X, tree: TypeOrBoundsTree)(implicit ctx: Context): X = tree match { + case TypeTree.Synthetic() => x + case TypeTree.Ident(_) => x + case TypeTree.Select(qualifier, _) => foldTree(x, qualifier) + case TypeTree.Project(qualifier, _) => foldTypeTree(x, qualifier) + case TypeTree.Singleton(ref) => foldTree(x, ref) + case TypeTree.And(left, right) => foldTypeTree(foldTypeTree(x, left), right) + case TypeTree.Or(left, right) => foldTypeTree(foldTypeTree(x, left), right) + case TypeTree.Refined(tpt, refinements) => foldTrees(foldTypeTree(x, tpt), refinements) + case TypeTree.Applied(tpt, args) => foldTypeTrees(foldTypeTree(x, tpt), args) + case TypeTree.ByName(result) => foldTypeTree(x, result) + case TypeTree.Annotated(arg, annot) => foldTree(foldTypeTree(x, arg), annot) + case TypeBoundsTree(lo, hi) => foldTypeTree(foldTypeTree(x, lo), hi) + } + + def foldOverCaseDef(x: X, tree: CaseDef)(implicit ctx: Context): X = tree match { + case CaseDef(pat, guard, body) => foldTree(foldTrees(foldPattern(x, pat), guard), body) + } + + def foldOverPattern(x: X, tree: Pattern)(implicit ctx: Context): X = tree match { + case Pattern.Value(v) => foldTree(x, v) + case Pattern.Bind(_, body) => foldPattern(x, body) + case Pattern.Unapply(fun, implicits, patterns) => foldPatterns(foldTrees(foldTree(x, fun), implicits), patterns) + case Pattern.Alternative(patterns) => foldPatterns(x, patterns) + case Pattern.TypeTest(tpt) => foldTypeTree(x, tpt) + } + + private def foldOverTermOrTypeTree(x: X, tree: TermOrTypeTree)(implicit ctx: Context): X = tree match { + case IsTerm(termOrTypeTree) => foldOverTree(x, termOrTypeTree) + case IsTypeTree(termOrTypeTree) => foldOverTypeTree(x, termOrTypeTree) + } + + } + + abstract class TreeTraverser extends TreeAccumulator[Unit] { + + def traverseTree(tree: Tree)(implicit ctx: Context): Unit = traverseTreeChildren(tree) + def traverseTypeTree(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = traverseTypeTreeChildren(tree) + def traverseCaseDef(tree: CaseDef)(implicit ctx: Context): Unit = traverseCaseDefChildren(tree) + def traversePattern(tree: Pattern)(implicit ctx: Context): Unit = traversePatternChildren(tree) + + def foldTree(x: Unit, tree: Tree)(implicit ctx: Context): Unit = traverseTree(tree) + def foldTypeTree(x: Unit, tree: TypeOrBoundsTree)(implicit ctx: Context) = traverseTypeTree(tree) + def foldCaseDef(x: Unit, tree: CaseDef)(implicit ctx: Context) = traverseCaseDef(tree) + def foldPattern(x: Unit, tree: Pattern)(implicit ctx: Context) = traversePattern(tree) + + protected def traverseTreeChildren(tree: Tree)(implicit ctx: Context): Unit = foldOverTree((), tree) + protected def traverseTypeTreeChildren(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = foldOverTypeTree((), tree) + protected def traverseCaseDefChildren(tree: CaseDef)(implicit ctx: Context): Unit = foldOverCaseDef((), tree) + protected def traversePatternChildren(tree: Pattern)(implicit ctx: Context): Unit = foldOverPattern((), tree) + + } + +} diff --git a/library/src/scala/tasty/util/TreeAccumulator.scala b/library/src/scala/tasty/util/TreeAccumulator.scala deleted file mode 100644 index a0065cd750c7..000000000000 --- a/library/src/scala/tasty/util/TreeAccumulator.scala +++ /dev/null @@ -1,113 +0,0 @@ -package scala.tasty.util - -import scala.tasty.Reflection - -abstract class TreeAccumulator[X, R <: Reflection with Singleton](val reflect: R) { - import reflect.{rootContext => _, _} - - // Ties the knot of the traversal: call `foldOver(x, tree))` to dive in the `tree` node. - def foldTree(x: X, tree: Tree)(implicit ctx: Context): X - def foldTypeTree(x: X, tree: TypeOrBoundsTree)(implicit ctx: Context): X - def foldCaseDef(x: X, tree: CaseDef)(implicit ctx: Context): X - def foldPattern(x: X, tree: Pattern)(implicit ctx: Context): X - - def foldTrees(x: X, trees: Iterable[Tree])(implicit ctx: Context): X = (x /: trees)(foldTree) - def foldTypeTrees(x: X, trees: Iterable[TypeOrBoundsTree])(implicit ctx: Context): X = (x /: trees)(foldTypeTree) - def foldCaseDefs(x: X, trees: Iterable[CaseDef])(implicit ctx: Context): X = (x /: trees)(foldCaseDef) - def foldPatterns(x: X, trees: Iterable[Pattern])(implicit ctx: Context): X = (x /: trees)(foldPattern) - private def foldParents(x: X, trees: Iterable[TermOrTypeTree])(implicit ctx: Context): X = (x /: trees)(foldOverTermOrTypeTree) - - def foldOverTree(x: X, tree: Tree)(implicit ctx: Context): X = { - def localCtx(definition: Definition): Context = definition.symbol.localContext - tree match { - case Term.Ident(_) => - x - case Term.Select(qualifier, _, _) => - foldTree(x, qualifier) - case Term.This(qual) => - x - case Term.Super(qual, _) => - foldTree(x, qual) - case Term.Apply(fun, args) => - foldTrees(foldTree(x, fun), args) - case Term.TypeApply(fun, args) => - foldTypeTrees(foldTree(x, fun), args) - case Term.Literal(const) => - x - case Term.New(tpt) => - foldTypeTree(x, tpt) - case Term.Typed(expr, tpt) => - foldTypeTree(foldTree(x, expr), tpt) - case Term.NamedArg(_, arg) => - foldTree(x, arg) - case Term.Assign(lhs, rhs) => - foldTree(foldTree(x, lhs), rhs) - case Term.Block(stats, expr) => - foldTree(foldTrees(x, stats), expr) - case Term.If(cond, thenp, elsep) => - foldTree(foldTree(foldTree(x, cond), thenp), elsep) - case Term.Lambda(meth, tpt) => - val a = foldTree(x, meth) - tpt.fold(a)(b => foldTypeTree(a, b)) - case Term.Match(selector, cases) => - foldCaseDefs(foldTree(x, selector), cases) - case Term.Return(expr) => - foldTree(x, expr) - case Term.Try(block, handler, finalizer) => - foldTrees(foldCaseDefs(foldTree(x, block), handler), finalizer) - case Term.Repeated(elems) => - foldTrees(x, elems) - case Term.Inlined(call, bindings, expansion) => - foldTree(foldTrees(x, bindings), expansion) - case IsDefinition(vdef @ ValDef(_, tpt, rhs)) => - implicit val ctx = localCtx(vdef) - foldTrees(foldTypeTree(x, tpt), rhs) - case IsDefinition(ddef @ DefDef(_, tparams, vparamss, tpt, rhs)) => - implicit val ctx = localCtx(ddef) - foldTrees(foldTypeTree((foldTrees(x, tparams) /: vparamss)(foldTrees), tpt), rhs) - case IsDefinition(tdef @ TypeDef(_, rhs)) => - implicit val ctx = localCtx(tdef) - foldTypeTree(x, rhs) - case IsDefinition(cdef @ ClassDef(_, constr, parents, self, body)) => - implicit val ctx = localCtx(cdef) - foldTrees(foldTrees(foldParents(foldTree(x, constr), parents), self), body) - case Import(expr, selectors) => - foldTree(x, expr) - case IsPackageClause(clause @ PackageClause(pid, stats)) => - foldTrees(foldTree(x, pid), stats)(clause.symbol.localContext) - } - } - - def foldOverTypeTree(x: X, tree: TypeOrBoundsTree)(implicit ctx: Context): X = tree match { - case TypeTree.Synthetic() => x - case TypeTree.Ident(_) => x - case TypeTree.Select(qualifier, _) => foldTree(x, qualifier) - case TypeTree.Project(qualifier, _) => foldTypeTree(x, qualifier) - case TypeTree.Singleton(ref) => foldTree(x, ref) - case TypeTree.And(left, right) => foldTypeTree(foldTypeTree(x, left), right) - case TypeTree.Or(left, right) => foldTypeTree(foldTypeTree(x, left), right) - case TypeTree.Refined(tpt, refinements) => foldTrees(foldTypeTree(x, tpt), refinements) - case TypeTree.Applied(tpt, args) => foldTypeTrees(foldTypeTree(x, tpt), args) - case TypeTree.ByName(result) => foldTypeTree(x, result) - case TypeTree.Annotated(arg, annot) => foldTree(foldTypeTree(x, arg), annot) - case TypeBoundsTree(lo, hi) => foldTypeTree(foldTypeTree(x, lo), hi) - } - - def foldOverCaseDef(x: X, tree: CaseDef)(implicit ctx: Context): X = tree match { - case CaseDef(pat, guard, body) => foldTree(foldTrees(foldPattern(x, pat), guard), body) - } - - def foldOverPattern(x: X, tree: Pattern)(implicit ctx: Context): X = tree match { - case Pattern.Value(v) => foldTree(x, v) - case Pattern.Bind(_, body) => foldPattern(x, body) - case Pattern.Unapply(fun, implicits, patterns) => foldPatterns(foldTrees(foldTree(x, fun), implicits), patterns) - case Pattern.Alternative(patterns) => foldPatterns(x, patterns) - case Pattern.TypeTest(tpt) => foldTypeTree(x, tpt) - } - - private def foldOverTermOrTypeTree(x: X, tree: TermOrTypeTree)(implicit ctx: Context): X = tree match { - case IsTerm(termOrTypeTree) => foldOverTree(x, termOrTypeTree) - case IsTypeTree(termOrTypeTree) => foldOverTypeTree(x, termOrTypeTree) - } - -} diff --git a/library/src/scala/tasty/util/TreeTraverser.scala b/library/src/scala/tasty/util/TreeTraverser.scala deleted file mode 100644 index 0479c049418a..000000000000 --- a/library/src/scala/tasty/util/TreeTraverser.scala +++ /dev/null @@ -1,23 +0,0 @@ -package scala.tasty.util - -import scala.tasty.Reflection - -abstract class TreeTraverser[R <: Reflection with Singleton](reflect0: R) extends TreeAccumulator[Unit, R](reflect0) { - import reflect.{rootContext => _, _} - - def traverseTree(tree: Tree)(implicit ctx: Context): Unit = traverseTreeChildren(tree) - def traverseTypeTree(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = traverseTypeTreeChildren(tree) - def traverseCaseDef(tree: CaseDef)(implicit ctx: Context): Unit = traverseCaseDefChildren(tree) - def traversePattern(tree: Pattern)(implicit ctx: Context): Unit = traversePatternChildren(tree) - - def foldTree(x: Unit, tree: Tree)(implicit ctx: Context): Unit = traverseTree(tree) - def foldTypeTree(x: Unit, tree: TypeOrBoundsTree)(implicit ctx: Context) = traverseTypeTree(tree) - def foldCaseDef(x: Unit, tree: CaseDef)(implicit ctx: Context) = traverseCaseDef(tree) - def foldPattern(x: Unit, tree: Pattern)(implicit ctx: Context) = traversePattern(tree) - - protected def traverseTreeChildren(tree: Tree)(implicit ctx: Context): Unit = foldOverTree((), tree) - protected def traverseTypeTreeChildren(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = foldOverTypeTree((), tree) - protected def traverseCaseDefChildren(tree: CaseDef)(implicit ctx: Context): Unit = foldOverCaseDef((), tree) - protected def traversePatternChildren(tree: Pattern)(implicit ctx: Context): Unit = foldOverPattern((), tree) - -} diff --git a/semanticdb/src/dotty/semanticdb/Main.scala b/semanticdb/src/dotty/semanticdb/Main.scala index 003a7fe58da0..9fe05a8c1572 100644 --- a/semanticdb/src/dotty/semanticdb/Main.scala +++ b/semanticdb/src/dotty/semanticdb/Main.scala @@ -1,7 +1,6 @@ package dotty.semanticdb import scala.tasty.Reflection -import scala.tasty.util.TreeTraverser import scala.tasty.file._ object Main { diff --git a/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala b/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala index 4b04aa6cd062..2f7b543cde52 100644 --- a/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala +++ b/semanticdb/src/dotty/semanticdb/SemanticdbConsumer.scala @@ -2,13 +2,12 @@ package dotty.semanticdb import scala.tasty.Reflection import scala.tasty.file.TastyConsumer -import scala.tasty.util.TreeTraverser class SemanticdbConsumer extends TastyConsumer { final def apply(reflect: Reflection)(root: reflect.Tree): Unit = { import reflect._ - object Traverser extends TreeTraverser[reflect.type](reflect) { + object Traverser extends TreeTraverser { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = tree match { case IsDefinition(tree) => diff --git a/semanticdb/test/dotty/semanticdb/Tests.scala b/semanticdb/test/dotty/semanticdb/Tests.scala index 00c649a886e1..980a78d949d9 100644 --- a/semanticdb/test/dotty/semanticdb/Tests.scala +++ b/semanticdb/test/dotty/semanticdb/Tests.scala @@ -1,7 +1,6 @@ package dotty.semanticdb import scala.tasty.Reflection -import scala.tasty.util.TreeTraverser import scala.tasty.file._ import org.junit.Test diff --git a/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala b/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala index ff5cf8db4a11..452d440f3d3c 100644 --- a/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala +++ b/tests/run-custom-args/Yretain-trees/tasty-extractors-owners/quoted_1.scala @@ -1,7 +1,6 @@ import scala.quoted._ import scala.tasty._ -import scala.tasty.util.TreeTraverser object Macros { @@ -22,7 +21,7 @@ object Macros { } } - val output = new TreeTraverser(reflect) { + val output = new TreeTraverser { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = { tree match { case IsDefinition(tree @ DefDef(name, _, _, _, _)) => diff --git a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala index 78adc166e75f..131551c0a589 100644 --- a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala @@ -1,7 +1,7 @@ import scala.quoted._ import scala.tasty.Reflection -import scala.tasty.util.{TreeTraverser, Printer} +import scala.tasty.util.Printer object Macros { @@ -13,7 +13,7 @@ object Macros { val buff = new StringBuilder - val output = new TreeTraverser(reflect) { + val output = new TreeTraverser { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = { // Use custom Show[_] here val printer = new DummyShow(reflect) diff --git a/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala b/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala index 4983a8cf3a27..6382461d5b3e 100644 --- a/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-definitions-1/quoted_1.scala @@ -1,7 +1,6 @@ import scala.quoted._ import scala.tasty._ -import scala.tasty.util.TreeTraverser object Macros { diff --git a/tests/run-separate-compilation/tasty-eval/quoted_1.scala b/tests/run-separate-compilation/tasty-eval/quoted_1.scala index 99d4df0757e1..38c76795467e 100644 --- a/tests/run-separate-compilation/tasty-eval/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-eval/quoted_1.scala @@ -1,7 +1,6 @@ import scala.quoted._ import scala.tasty._ -import scala.tasty.util.TreeTraverser object Macros { diff --git a/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala index b7681076608c..1d0c579ccf65 100644 --- a/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-3/quoted_1.scala @@ -1,7 +1,6 @@ import scala.quoted._ import scala.tasty.Reflection -import scala.tasty.util.TreeTraverser object Macros { @@ -12,7 +11,7 @@ object Macros { import reflect._ val buff = new StringBuilder - val traverser = new TreeTraverser(reflect) { + val traverser = new TreeTraverser { override def traverseTypeTree(tree: TypeOrBoundsTree)(implicit ctx: Context): Unit = { buff.append(tree.tpe.show) buff.append("\n\n") diff --git a/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala b/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala index 8d73656cf6d4..33239ae84fab 100644 --- a/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-extractors-types/quoted_1.scala @@ -1,7 +1,6 @@ import scala.quoted._ import scala.tasty._ -import scala.tasty.util.TreeTraverser object Macros { diff --git a/tests/run-with-compiler/tasty-consumer/Test.scala b/tests/run-with-compiler/tasty-consumer/Test.scala index 4c3eeda61410..6bfcb94d453a 100644 --- a/tests/run-with-compiler/tasty-consumer/Test.scala +++ b/tests/run-with-compiler/tasty-consumer/Test.scala @@ -1,5 +1,4 @@ import scala.tasty.Reflection -import scala.tasty.util.TreeTraverser import scala.tasty.file._ object Test { @@ -12,7 +11,7 @@ class DBConsumer extends TastyConsumer { final def apply(reflect: Reflection)(root: reflect.Tree): Unit = { import reflect._ - object Traverser extends TreeTraverser[reflect.type](reflect) { + object Traverser extends TreeTraverser { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = tree match { case IsDefinition(tree) => From 863816348517c1d35ff1f7f967a591d5c417e74c Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Wed, 7 Nov 2018 03:45:49 +0000 Subject: [PATCH 5/6] Refactor Printer to simplify use Remove the need to handle path dependent tasty.Reflection --- .../dotc/tastyreflect/PrintersImpl.scala | 6 +- .../dotc/tastyreflect/SettingsOpsImpl.scala | 6 +- .../src/scala/tasty/reflect/Printers.scala | 1591 ++++++++++++++++- .../src/scala/tasty/reflect/SettingsOps.scala | 4 +- .../scala/tasty/util/ExtractorsPrinter.scala | 326 ---- library/src/scala/tasty/util/Printer.scala | 21 - .../scala/tasty/util/SourceCodePrinter.scala | 1239 ------------- .../tasty-custom-show/quoted_1.scala | 25 +- 8 files changed, 1610 insertions(+), 1608 deletions(-) delete mode 100644 library/src/scala/tasty/util/ExtractorsPrinter.scala delete mode 100644 library/src/scala/tasty/util/Printer.scala delete mode 100644 library/src/scala/tasty/util/SourceCodePrinter.scala diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala index a61e5ca22e82..2dff5f2613e8 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala @@ -1,12 +1,10 @@ package dotty.tools.dotc.tastyreflect -import scala.tasty.util.{Printer, ExtractorsPrinter, SourceCodePrinter} - trait PrintersImpl extends scala.tasty.reflect.Printers with scala.tasty.reflect.ReflectionCore { reflect: ReflectionImpl => - def showExtractors: Printer[reflect.type] = new ExtractorsPrinter[reflect.type](this) + def showExtractors: reflect.Printer = new reflect.ExtractorsPrinter - def showSourceCode: Printer[reflect.type] = new SourceCodePrinter[reflect.type](this) + def showSourceCode: reflect.Printer = new reflect.SourceCodePrinter /** Adds `show` as an extension method of a `Tree` */ def TreeShowDeco(tree: Tree): ShowAPI = new ShowAPI { diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala index 97ca0c81b01e..c6daa5e64dac 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala @@ -1,11 +1,11 @@ package dotty.tools.dotc.tastyreflect -trait SettingsOpsImpl extends scala.tasty.reflect.SettingsOps with ReflectionCoreImpl { +trait SettingsOpsImpl extends scala.tasty.reflect.SettingsOps with scala.tasty.reflect.ContextOps with ReflectionCoreImpl { - def settings(implicit ctx: Context): Settings = ctx.settings + def settings: Settings = rootContext.settings def SettingsDeco(settings: Settings): SettingsAPI = new SettingsAPI { - def color(implicit ctx: Context): Boolean = settings.color.value == "always" + def color: Boolean = settings.color.value == "always" } } diff --git a/library/src/scala/tasty/reflect/Printers.scala b/library/src/scala/tasty/reflect/Printers.scala index 4ad38c1b4ff6..66f3d936e14d 100644 --- a/library/src/scala/tasty/reflect/Printers.scala +++ b/library/src/scala/tasty/reflect/Printers.scala @@ -1,7 +1,26 @@ package scala.tasty package reflect -trait Printers extends ReflectionCore { +import scala.annotation.switch + +import scala.tasty.util.SyntaxHighlightUtils._ +import scala.tasty.util.Chars + +trait Printers + extends ReflectionCore + with CaseDefOps + with ConstantOps + with IdOps + with ImportSelectorOps + with PatternOps + with PositionOps + with SettingsOps + with SignatureOps + with StandardDefinitions + with SymbolOps + with TreeOps + with TypeOrBoundsTreeOps + with TypeOrBoundsOps { /** Adds `show` as an extension method of a `Tree` */ implicit def TreeShowDeco(tree: Tree): ShowAPI @@ -33,4 +52,1574 @@ trait Printers extends ReflectionCore { def showCode(implicit ctx: Context): String } + abstract class Printer { + + def showTree(tree: Tree)(implicit ctx: Context): String + + def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String + + def showPattern(pattern: Pattern)(implicit ctx: Context): String + + def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String + + def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String + + def showConstant(const: Constant)(implicit ctx: Context): String + + def showSymbol(symbol: Symbol)(implicit ctx: Context): String + + } + + class ExtractorsPrinter extends Printer { + + def showTree(tree: Tree)(implicit ctx: Context): String = + new Buffer().visitTree(tree).result() + def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = + new Buffer().visitCaseDef(caseDef).result() + + def showPattern(pattern: Pattern)(implicit ctx: Context): String = + new Buffer().visitPattern(pattern).result() + + def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String = + new Buffer().visitTypeTree(tpt).result() + + def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String = + new Buffer().visitType(tpe).result() + + def showConstant(const: Constant)(implicit ctx: Context): String = + new Buffer().visitConstant(const).result() + + def showSymbol(symbol: Symbol)(implicit ctx: Context): String = + new Buffer().visitSymbol(symbol).result() + + private class Buffer(implicit ctx: Context) { self => + + private val sb: StringBuilder = new StringBuilder + + def result(): String = sb.result() + + def visitTree(x: Tree): Buffer = x match { + case Term.Ident(name) => + this += "Term.Ident(\"" += name += "\")" + case Term.Select(qualifier, name, signature) => + this += "Term.Select(" += qualifier += ", \"" += name += "\", " += signature += ")" + case Term.This(qual) => + this += "Term.This(" += qual += ")" + case Term.Super(qual, mix) => + this += "Term.TypeApply(" += qual += ", " += mix += ")" + case Term.Apply(fun, args) => + this += "Term.Apply(" += fun += ", " ++= args += ")" + case Term.TypeApply(fun, args) => + this += "Term.TypeApply(" += fun += ", " ++= args += ")" + case Term.Literal(const) => + this += "Term.Literal(" += const += ")" + case Term.New(tpt) => + this += "Term.New(" += tpt += ")" + case Term.Typed(expr, tpt) => + this += "Term.Typed(" += expr += ", " += tpt += ")" + case Term.NamedArg(name, arg) => + this += "Term.NamedArg(\"" += name += "\", " += arg += ")" + case Term.Assign(lhs, rhs) => + this += "Term.Assign(" += lhs += ", " += rhs += ")" + case Term.Block(stats, expr) => + this += "Term.Block(" ++= stats += ", " += expr += ")" + case Term.If(cond, thenp, elsep) => + this += "Term.If(" += cond += ", " += thenp += ", " += elsep += ")" + case Term.Lambda(meth, tpt) => + this += "Term.Lambda(" += meth += ", " += tpt += ")" + case Term.Match(selector, cases) => + this += "Term.Match(" += selector += ", " ++= cases += ")" + case Term.Return(expr) => + this += "Term.Return(" += expr += ")" + case Term.While(cond, body) => + this += "Term.While(" += cond += ", " += body += ")" + case Term.Try(block, handlers, finalizer) => + this += "Term.Try(" += block += ", " ++= handlers += ", " += finalizer += ")" + case Term.Repeated(elems) => + this += "Term.Repeated(" ++= elems += ")" + case Term.Inlined(call, bindings, expansion) => + this += "Term.Inlined(" + visitOption(call, visitTermOrTypeTree) + this += ", " ++= bindings += ", " += expansion += ")" + case ValDef(name, tpt, rhs) => + this += "ValDef(\"" += name += "\", " += tpt += ", " += rhs += ")" + case DefDef(name, typeParams, paramss, returnTpt, rhs) => + this += "DefDef(\"" += name += "\", " ++= typeParams += ", " +++= paramss += ", " += returnTpt += ", " += rhs += ")" + case TypeDef(name, rhs) => + this += "TypeDef(\"" += name += "\", " += rhs += ")" + case ClassDef(name, constr, parents, self, body) => + this += "ClassDef(\"" += name += "\", " += constr += ", " + visitList[TermOrTypeTree](parents, visitTermOrTypeTree) + this += ", " += self += ", " ++= body += ")" + case PackageDef(name, owner) => + this += "PackageDef(\"" += name += "\", " += owner += ")" + case Import(expr, selectors) => + this += "Import(" += expr += ", " ++= selectors += ")" + case PackageClause(pid, stats) => + this += "PackageClause(" += pid += ", " ++= stats += ")" + } + + def visitTypeTree(x: TypeOrBoundsTree): Buffer = x match { + case TypeTree.Synthetic() => + this += "TypeTree.Synthetic()" + case TypeTree.Ident(name) => + this += "TypeTree.Ident(\"" += name += "\")" + case TypeTree.Select(qualifier, name) => + this += "TypeTree.Select(" += qualifier += ", \"" += name += "\")" + case TypeTree.Project(qualifier, name) => + this += "TypeTree.Project(" += qualifier += ", \"" += name += "\")" + case TypeTree.Singleton(ref) => + this += "TypeTree.Singleton(" += ref += ")" + case TypeTree.And(left, right) => + this += "TypeTree.And(" += left += ", " += right += ")" + case TypeTree.Or(left, right) => + this += "TypeTree.Or(" += left += ", " += right += ")" + case TypeTree.Refined(tpt, refinements) => + this += "TypeTree.Refined(" += tpt += ", " ++= refinements += ")" + case TypeTree.Applied(tpt, args) => + this += "TypeTree.Applied(" += tpt += ", " ++= args += ")" + case TypeTree.ByName(result) => + this += "TypeTree.ByName(" += result += ")" + case TypeTree.Annotated(arg, annot) => + this += "TypeTree.Annotated(" += arg += ", " += annot += ")" + case TypeTree.TypeLambdaTree(tparams, body) => + this += "TypeTree.LambdaTypeTree(" ++= tparams += ", " += body += ")" + case TypeTree.Bind(name, bounds) => + this += "TypeTree.Bind(" += name += ", " += bounds += ")" + case TypeTree.Block(aliases, tpt) => + this += "TypeTree.Block(" ++= aliases += ", " += tpt += ")" + case TypeBoundsTree(lo, hi) => + this += "TypeBoundsTree(" += lo += ", " += hi += ")" + case SyntheticBounds() => + this += s"SyntheticBounds()" + } + + def visitCaseDef(x: CaseDef): Buffer = { + val CaseDef(pat, guard, body) = x + this += "CaseDef(" += pat += ", " += guard += ", " += body += ")" + } + + def visitPattern(x: Pattern): Buffer = x match { + case Pattern.Value(v) => + this += "Pattern.Value(" += v += ")" + case Pattern.Bind(name, body) => + this += "Pattern.Bind(\"" += name += "\", " += body += ")" + case Pattern.Unapply(fun, implicits, patterns) => + this += "Pattern.Unapply(" += fun += ", " ++= implicits += ", " ++= patterns += ")" + case Pattern.Alternative(patterns) => + this += "Pattern.Alternative(" ++= patterns += ")" + case Pattern.TypeTest(tpt) => + this += "Pattern.TypeTest(" += tpt += ")" + } + + def visitTermOrTypeTree(x: TermOrTypeTree): Buffer = x match { + case IsTerm(termOrTypeTree) => this += termOrTypeTree + case IsTypeTree(termOrTypeTree) => this += termOrTypeTree + } + + def visitConstant(x: Constant): Buffer = x match { + case Constant.Unit() => this += "Constant.Unit()" + case Constant.Null() => this += "Constant.Null()" + case Constant.Boolean(value) => this += "Constant.Boolean(" += value += ")" + case Constant.Byte(value) => this += "Constant.Byte(" += value += ")" + case Constant.Short(value) => this += "Constant.Short(" += value += ")" + case Constant.Char(value) => this += "Constant.Char(" += value += ")" + case Constant.Int(value) => this += "Constant.Int(" += value.toString += ")" + case Constant.Long(value) => this += "Constant.Long(" += value += ")" + case Constant.Float(value) => this += "Constant.Float(" += value += ")" + case Constant.Double(value) => this += "Constant.Double(" += value += ")" + case Constant.String(value) => this += "Constant.String(\"" += value += "\")" + case Constant.ClassTag(value) => this += "Constant.ClassTag(" += value += ")" + case Constant.Symbol(value) => this += "Constant.Symbol('" += value.name += ")" + } + + def visitType(x: TypeOrBounds): Buffer = x match { + case Type.ConstantType(value) => + this += "Type.ConstantType(" += value += ")" + case Type.SymRef(sym, qual) => + this += "Type.SymRef(" += sym += ", " += qual += ")" + case Type.TermRef(name, qual) => + this += "Type.TermRef(\"" += name += "\", " += qual += ")" + case Type.TypeRef(name, qual) => + this += "Type.TypeRef(\"" += name += "\", " += qual += ")" + case Type.Refinement(parent, name, info) => + this += "Type.Refinement(" += parent += ", " += name += ", " += info += ")" + case Type.AppliedType(tycon, args) => + this += "Type.AppliedType(" += tycon += ", " ++= args += ")" + case Type.AnnotatedType(underlying, annot) => + this += "Type.AnnotatedType(" += underlying += ", " += annot += ")" + case Type.AndType(left, right) => + this += "Type.AndType(" += left += ", " += right += ")" + case Type.OrType(left, right) => + this += "Type.OrType(" += left += ", " += right += ")" + case Type.ByNameType(underlying) => + this += "Type.ByNameType(" += underlying += ")" + case Type.ParamRef(binder, idx) => + this += "Type.ParamRef(" += binder += ", " += idx += ")" + case Type.ThisType(tp) => + this += "Type.ThisType(" += tp += ")" + case Type.SuperType(thistpe, supertpe) => + this += "Type.SuperType(" += thistpe += ", " += supertpe += ")" + case Type.RecursiveThis(binder) => + this += "Type.RecursiveThis(" += binder += ")" + case Type.RecursiveType(underlying) => + this += "Type.RecursiveType(" += underlying += ")" + case Type.MethodType(argNames, argTypes, resType) => + this += "Type.MethodType(" ++= argNames += ", " ++= argTypes += ", " += resType += ")" + case Type.PolyType(argNames, argBounds, resType) => + this += "Type.PolyType(" ++= argNames += ", " ++= argBounds += ", " += resType += ")" + case Type.TypeLambda(argNames, argBounds, resType) => + // resType is not printed to avoid cycles + this += "Type.TypeLambda(" ++= argNames += ", " ++= argBounds += ", _)" + case TypeBounds(lo, hi) => + this += "TypeBounds(" += lo += ", " += hi += ")" + case NoPrefix() => + this += "NoPrefix()" + } + + def visitId(x: Id): Buffer = { + val Id(name) = x + this += "Id(\"" += name += "\")" + } + + def visitSignature(sig: Signature): Buffer = { + val Signature(params, res) = sig + this += "Signature(" ++= params += ", " += res += ")" + } + + def visitImportSelector(sel: ImportSelector): Buffer = sel match { + case SimpleSelector(id) => this += "SimpleSelector(" += id += ")" + case RenameSelector(id1, id2) => this += "RenameSelector(" += id1 += ", " += id2 += ")" + case OmitSelector(id) => this += "OmitSelector(" += id += ")" + } + + def visitSymbol(x: Symbol): Buffer = x match { + case IsPackageSymbol(x) => this += "IsPackageSymbol(<" += x.fullName += ">)" + case IsClassSymbol(x) => this += "IsClassSymbol(<" += x.fullName += ">)" + case IsDefSymbol(x) => this += "IsDefSymbol(<" += x.fullName += ">)" + case IsValSymbol(x) => this += "IsValSymbol(<" += x.fullName += ">)" + case IsTypeSymbol(x) => this += "IsTypeSymbol(<" += x.fullName += ">)" + case NoSymbol() => this += "NoSymbol()" + } + + def +=(x: Boolean): Buffer = { sb.append(x); this } + def +=(x: Byte): Buffer = { sb.append(x); this } + def +=(x: Short): Buffer = { sb.append(x); this } + def +=(x: Int): Buffer = { sb.append(x); this } + def +=(x: Long): Buffer = { sb.append(x); this } + def +=(x: Float): Buffer = { sb.append(x); this } + def +=(x: Double): Buffer = { sb.append(x); this } + def +=(x: Char): Buffer = { sb.append(x); this } + def +=(x: String): Buffer = { sb.append(x); this } + + def ++=(xs: List[String]): Buffer = visitList[String](xs, +=) + + private implicit class TreeOps(buff: Buffer) { + def +=(x: Tree): Buffer = { visitTree(x); buff } + def +=(x: Option[Tree]): Buffer = { visitOption(x, visitTree); buff } + def ++=(x: List[Tree]): Buffer = { visitList(x, visitTree); buff } + def +++=(x: List[List[Tree]]): Buffer = { visitList(x, ++=); buff } + } + + private implicit class CaseDefOps(buff: Buffer) { + def +=(x: CaseDef): Buffer = { visitCaseDef(x); buff } + def ++=(x: List[CaseDef]): Buffer = { visitList(x, visitCaseDef); buff } + } + + private implicit class PatternOps(buff: Buffer) { + def +=(x: Pattern): Buffer = { visitPattern(x); buff } + def ++=(x: List[Pattern]): Buffer = { visitList(x, visitPattern); buff } + } + + private implicit class ConstantOps(buff: Buffer) { + def +=(x: Constant): Buffer = { visitConstant(x); buff } + } + + private implicit class TypeTreeOps(buff: Buffer) { + def +=(x: TypeOrBoundsTree): Buffer = { visitTypeTree(x); buff } + def +=(x: Option[TypeOrBoundsTree]): Buffer = { visitOption(x, visitTypeTree); buff } + def ++=(x: List[TypeOrBoundsTree]): Buffer = { visitList(x, visitTypeTree); buff } + } + + private implicit class TypeOps(buff: Buffer) { + def +=(x: TypeOrBounds): Buffer = { visitType(x); buff } + def ++=(x: List[TypeOrBounds]): Buffer = { visitList(x, visitType); buff } + } + + private implicit class IdOps(buff: Buffer) { + def +=(x: Id): Buffer = { visitId(x); buff } + def +=(x: Option[Id]): Buffer = { visitOption(x, visitId); buff } + } + + private implicit class SignatureOps(buff: Buffer) { + def +=(x: Option[Signature]): Buffer = { visitOption(x, visitSignature); buff } + } + + private implicit class ImportSelectorOps(buff: Buffer) { + def ++=(x: List[ImportSelector]): Buffer = { visitList(x, visitImportSelector); buff } + } + + private implicit class SymbolOps(buff: Buffer) { + def +=(x: Symbol): Buffer = { visitSymbol(x); buff } + } + + private def visitOption[U](opt: Option[U], visit: U => Buffer): Buffer = opt match { + case Some(x) => + this += "Some(" + visit(x) + this += ")" + case _ => + this += "None" + } + + private def visitList[U](list: List[U], visit: U => Buffer): Buffer = list match { + case x0 :: xs => + this += "List(" + visit(x0) + def visitNext(xs: List[U]): Unit = xs match { + case y :: ys => + this += ", " + visit(y) + visitNext(ys) + case Nil => + } + visitNext(xs) + this += ")" + case Nil => + this += "Nil" + } + } + + } + + class SourceCodePrinter extends Printer { + + private[this] val color: Boolean = settings.color + + def showTree(tree: Tree)(implicit ctx: Context): String = + (new Buffer).printTree(tree).result() + + def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = + (new Buffer).printCaseDef(caseDef).result() + + def showPattern(pattern: Pattern)(implicit ctx: Context): String = + (new Buffer).printPattern(pattern).result() + + def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String = + (new Buffer).printTypeOrBoundsTree(tpt).result() + + def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String = + (new Buffer).printTypeOrBound(tpe).result() + + def showConstant(const: Constant)(implicit ctx: Context): String = + (new Buffer).printConstant(const).result() + + def showSymbol(symbol: Symbol)(implicit ctx: Context): String = + symbol.fullName + + private class Buffer(implicit ctx: Context) { + + private[this] val sb: StringBuilder = new StringBuilder + + private[this] var indent: Int = 0 + def indented(printIndented: => Unit): Unit = { + indent += 1 + printIndented + indent -= 1 + } + + def inParens(body: => Unit): Buffer = { + this += "(" + body + this += ")" + } + + def inSquare(body: => Unit): Buffer = { + this += "[" + body + this += "]" + } + + def inBlock(body: => Unit): Buffer = { + this += " {" + indented { + this += lineBreak() + body + } + this += lineBreak() += "}" + } + + def result(): String = sb.result() + + def lineBreak(): String = "\n" + (" " * indent) + def doubleLineBreak(): String = "\n\n" + (" " * indent) + + def printTree(tree: Tree): Buffer = tree match { + case PackageObject(body)=> + printTree(body) // Print package object + + case PackageClause(Term.Ident(name), (inner @ PackageClause(_, _)) :: Nil) if name != "" && PackageObject.unapply(inner).isEmpty => + // print inner package as `package outer.inner { ... }` + printTree(inner) + + case tree @ PackageClause(name, stats) => + val stats1 = stats.collect { + case IsPackageClause(stat) => stat + case IsDefinition(stat) if !(stat.symbol.flags.isObject && stat.symbol.flags.isLazy) => stat + case stat @ Import(_, _) => stat + } + name match { + case Term.Ident("") => + printTrees(stats1, lineBreak()) + case _ => + this += "package " + printType(name.tpe) + inBlock(printTrees(stats1, lineBreak())) + } + + case Import(expr, selectors) => + this += "import " + printTree(expr) + this += "." + printImportSelectors(selectors) + + case IsClassDef(cdef @ ClassDef(name, DefDef(_, targs, argss, _, _), parents, self, stats)) => + printDefAnnotations(cdef) + + val flags = cdef.symbol.flags + if (flags.isImplicit) this += highlightKeyword("implicit ", color) + if (flags.isSealed) this += highlightKeyword("sealed ", color) + if (flags.isFinal && !flags.isObject) this += highlightKeyword("final ", color) + if (flags.isCase) this += highlightKeyword("case ", color) + + if (name == "package$") { + this += highlightKeyword("package object ", color) += highlightTypeDef(cdef.symbol.owner.name.stripSuffix("$"), color) + } + else if (flags.isObject) this += highlightKeyword("object ", color) += highlightTypeDef(name.stripSuffix("$"), color) + else if (flags.isTrait) this += highlightKeyword("trait ", color) += highlightTypeDef(name, color) + else if (flags.isAbstract) this += highlightKeyword("abstract class ", color) += highlightTypeDef(name, color) + else this += highlightKeyword("class ", color) += highlightTypeDef(name, color) + + if (!flags.isObject) { + printTargsDefs(targs) + val it = argss.iterator + while (it.hasNext) + printArgsDefs(it.next()) + } + + val parents1 = parents.filter { + case IsTerm(Term.Apply(Term.Select(Term.New(tpt), _, _), _)) => !Types.JavaLangObject.unapply(tpt.tpe) + case IsTypeTree(TypeTree.Select(Term.Select(Term.Ident("_root_"), "scala", _), "Product")) => false + case _ => true + } + if (parents1.nonEmpty) + this += highlightKeyword(" extends ", color) + + def printParent(parent: TermOrTypeTree): Unit = parent match { + case IsTypeTree(parent) => + printTypeTree(parent) + case IsTerm(Term.TypeApply(fun, targs)) => + printParent(fun) + inSquare(printTypeOrBoundsTrees(targs, ", ")) + case IsTerm(Term.Apply(fun, args)) => + printParent(fun) + inParens(printTrees(args, ", ")) + case IsTerm(Term.Select(Term.New(tpt), _, _)) => + printTypeTree(tpt) + case IsTerm(parent) => + throw new MatchError(parent.show) + } + + def printSeparated(list: List[TermOrTypeTree]): Unit = list match { + case Nil => + case x :: Nil => printParent(x) + case x :: xs => + printParent(x) + this += highlightKeyword(" with ", color) + printSeparated(xs) + } + printSeparated(parents1) + + def keepDefinition(d: Definition): Boolean = { + val flags = d.symbol.flags + def isCaseClassUnOverridableMethod: Boolean = { + // Currently the compiler does not allow overriding some of the methods generated for case classes + d.symbol.flags.isSynthetic && + (d match { + case DefDef("apply" | "unapply", _, _, _, _) if d.symbol.owner.flags.isObject => true + case DefDef(n, _, _, _, _) if d.symbol.owner.flags.isCase => + n == "copy" || + n.matches("copy\\$default\\$[1-9][0-9]*") || // default parameters for the copy method + n.matches("_[1-9][0-9]*") // Getters from Product + case _ => false + }) + } + def isInnerModuleObject = d.symbol.flags.isLazy && d.symbol.flags.isObject + !flags.isParam && !flags.isParamAccessor && !flags.isFieldAccessor && !isCaseClassUnOverridableMethod && !isInnerModuleObject + } + val stats1 = stats.collect { + case IsDefinition(stat) if keepDefinition(stat) => stat + case stat @ Import(_, _) => stat + case IsTerm(stat) => stat + } + + def printBody(printSelf: Boolean) = { + this += " {" + indented { + if (printSelf) { + val Some(ValDef(name, tpt, _)) = self + indented { + val name1 = if (name == "_") "this" else name + this += " " += highlightValDef(name1, color) += ": " + printTypeTree(tpt) + this += " =>" + } + } + this += lineBreak() + printTrees(stats1, lineBreak()) + } + this += lineBreak() += "}" + } + self match { + case Some(ValDef(_, TypeTree.Singleton(_), _)) => + if (stats1.nonEmpty) + printBody(printSelf = false) + case Some(ValDef(_, _, _)) => + printBody(printSelf = true) + case _ => + if (stats1.nonEmpty) + printBody(printSelf = false) + } + this + + case IsTypeDef(tdef @ TypeDef(name, rhs)) => + printDefAnnotations(tdef) + this += highlightKeyword("type ", color) + printTargDef(tdef, isMember = true) + + case IsValDef(vdef @ ValDef(name, tpt, rhs)) => + printDefAnnotations(vdef) + + val flags = vdef.symbol.flags + if (flags.isImplicit) this += highlightKeyword("implicit ", color) + if (flags.isOverride) this += highlightKeyword("override ", color) + + printProtectedOrPrivate(vdef) + + if (flags.isLazy) this += highlightKeyword("lazy ", color) + if (vdef.symbol.flags.isMutable) this += highlightKeyword("var ", color) + else this += highlightKeyword("val ", color) + + this += highlightValDef(name, color) += ": " + printTypeTree(tpt) + rhs match { + case Some(tree) => + this += " = " + printTree(tree) + case None => + this + } + + case Term.While(cond, body) => + (cond, body) match { + case (Term.Block(Term.Block(Nil, body1) :: Nil, Term.Block(Nil, cond1)), Term.Literal(Constant.Unit())) => + this += highlightKeyword("do ", color) + printTree(body1) += highlightKeyword(" while ", color) + inParens(printTree(cond1)) + case _ => + this += highlightKeyword("while ", color) + inParens(printTree(cond)) += " " + printTree(body) + } + + case IsDefDef(ddef @ DefDef(name, targs, argss, tpt, rhs)) => + printDefAnnotations(ddef) + + val isConstructor = name == "" + + val flags = ddef.symbol.flags + if (flags.isImplicit) this += highlightKeyword("implicit ", color) + if (flags.isInline) this += highlightKeyword("inline ", color) + if (flags.isOverride) this += highlightKeyword("override ", color) + + printProtectedOrPrivate(ddef) + + this += highlightKeyword("def ", color) += highlightValDef((if (isConstructor) "this" else name), color) + printTargsDefs(targs) + val it = argss.iterator + while (it.hasNext) + printArgsDefs(it.next()) + if (!isConstructor) { + this += ": " + printTypeTree(tpt) + } + rhs match { + case Some(tree) => + this += " = " + printTree(tree) + case None => + } + this + + case IsTerm(tree @ Term.Ident(_)) => + printType(tree.tpe) + + case Term.Select(qual, name, sig) => + printTree(qual) + if (name != "" && name != "package") + this += "." += name + this + + case Term.Literal(const) => + printConstant(const) + + case Term.This(id) => + id match { + case Some(x) => + this += x.name.stripSuffix("$") += "." + case None => + } + this += "this" + + case Term.New(tpt) => + this += "new " + printTypeTree(tpt) + + case Term.NamedArg(name, arg) => + this += name += " = " + printTree(arg) + + case SpecialOp("throw", expr :: Nil) => + this += "throw " + printTree(expr) + + case Term.Apply(fn, args) => + fn match { + case Term.Select(Term.This(_), "", _) => this += "this" // call to constructor inside a constructor + case _ => printTree(fn) + } + val args1 = args match { + case init :+ Term.Typed(Term.Repeated(Nil), _) => init // drop empty var args at the end + case _ => args + } + + inParens(printTrees(args1, ", ")) + + case Term.TypeApply(fn, args) => + printTree(fn) + fn match { + case Term.Select(Term.New(TypeTree.Applied(_, _)), "", _) => + // type bounds already printed in `fn` + this + case _ => + inSquare(printTypeOrBoundsTrees(args, ", ")) + } + + case Term.Super(qual, idOpt) => + qual match { + case Term.This(Some(Id(name))) => this += name += "." + case Term.This(None) => + } + this += "super" + for (id <- idOpt) + inSquare(this += id.name) + this + + case Term.Typed(term, tpt) => + tpt.tpe match { + case Types.Repeated(_) => + term match { + case Term.Repeated(_) => + printTree(term) + case _ => + printTree(term) + this += ": " += highlightTypeDef("_*", color) + } + case _ => + inParens { + printTree(term) + this += (if (Chars.isOperatorPart(sb.last)) " : " else ": ") + def printTypeOrAnnots(tpe: Type): Unit = tpe match { + case Type.AnnotatedType(tp, annot) if tp == term.tpe => + printAnnotation(annot) + case Type.AnnotatedType(tp, annot) => + printTypeOrAnnots(tp) + this += " " + printAnnotation(annot) + case tpe => + printType(tpe) + } + printTypeOrAnnots(tpt.tpe) + } + } + + case Term.Assign(lhs, rhs) => + printTree(lhs) + this += " = " + printTree(rhs) + + case Term.Block(stats0, expr) => + val stats = stats0.filter { + case IsValDef(tree) => !tree.symbol.flags.isObject + case _ => true + } + + expr match { + case Term.Lambda(_, _) => + // Decompile lambda from { def annon$(...) = ...; closure(annon$, ...)} + assert(stats.size == 1) + val DefDef(_, _, args :: Nil, _, Some(rhs)) :: Nil = stats + inParens { + printArgsDefs(args) + this += " => " + printTree(rhs) + } + case _ => + this += "{" + indented { + printStats(stats, expr) + } + this += lineBreak() += "}" + } + + case Term.Inlined(call, bindings, expansion) => // FIXME: Don't print Inlined with empty calls? + this += "{ // inlined" + indented { + printStats(bindings, expansion) + } + this += lineBreak() += "}" + + case Term.Lambda(meth, tpt) => + // Printed in Term.Block branch + this + + case Term.If(cond, thenp, elsep) => + this += highlightKeyword("if ", color) + inParens(printTree(cond)) + this += " " + printTree(thenp) + this+= highlightKeyword(" else ", color) + printTree(elsep) + + case Term.Match(selector, cases) => + printTree(selector) + this += highlightKeyword(" match", color) + inBlock(printCases(cases, lineBreak())) + + case Term.Try(body, cases, finallyOpt) => + this += highlightKeyword("try ", color) + printTree(body) + if (cases.nonEmpty) { + this += highlightKeyword(" catch", color) + inBlock(printCases(cases, lineBreak())) + } + finallyOpt match { + case Some(t) => + this += highlightKeyword(" finally ", color) + printTree(t) + case None => + this + } + + case Term.Return(expr) => + this += "return " + printTree(expr) + + case Term.Repeated(elems) => + printTrees(elems, ", ") + + case _ => + throw new MatchError(tree.show) + + } + + def printStats(stats: List[Tree], expr: Tree): Unit = { + def printSeparator(next: Tree): Unit = { + // Avoid accidental application of opening `{` on next line with a double break + next match { + case Term.Block(_, _) => this += doubleLineBreak() + case Term.Inlined(_, _, _) => this += doubleLineBreak() + case Term.Select(qual, _, _) => printSeparator(qual) + case Term.Apply(fn, _) => printSeparator(fn) + case Term.TypeApply(fn, _) => printSeparator(fn) + case _ => this += lineBreak() + } + } + def printSeparated(list: List[Tree]): Unit = list match { + case Nil => + printTree(expr) + case x :: xs => + printTree(x) + printSeparator(if (xs.isEmpty) expr else xs.head) + printSeparated(xs) + } + + this += lineBreak() + printSeparated(stats) + } + + def printTrees(trees: List[Tree], sep: String): Buffer = { + def printSeparated(list: List[Tree]): Unit = list match { + case Nil => + case x :: Nil => printTree(x) + case x :: xs => + printTree(x) + this += sep + printSeparated(xs) + } + printSeparated(trees) + this + } + + def printImportSelectors(selectors: List[ImportSelector]): Buffer = { + def printSeparated(list: List[ImportSelector]): Unit = list match { + case Nil => + case x :: Nil => printImportSelector(x) + case x :: xs => + printImportSelector(x) + this += ", " + printSeparated(xs) + } + this += "{" + printSeparated(selectors) + this += "}" + } + + def printCases(cases: List[CaseDef], sep: String): Buffer = { + def printSeparated(list: List[CaseDef]): Unit = list match { + case Nil => + case x :: Nil => printCaseDef(x) + case x :: xs => + printCaseDef(x) + this += sep + printSeparated(xs) + } + printSeparated(cases) + this + } + + def printPatterns(cases: List[Pattern], sep: String): Buffer = { + def printSeparated(list: List[Pattern]): Unit = list match { + case Nil => + case x :: Nil => printPattern(x) + case x :: xs => + printPattern(x) + this += sep + printSeparated(xs) + } + printSeparated(cases) + this + } + + def printTypeOrBoundsTrees(typesTrees: List[TypeOrBoundsTree], sep: String): Buffer = { + def printSeparated(list: List[TypeOrBoundsTree]): Unit = list match { + case Nil => + case x :: Nil => printTypeOrBoundsTree(x) + case x :: xs => + printTypeOrBoundsTree(x) + this += sep + printSeparated(xs) + } + printSeparated(typesTrees) + this + } + + def printTypesOrBounds(types: List[TypeOrBounds], sep: String): Buffer = { + def printSeparated(list: List[TypeOrBounds]): Unit = list match { + case Nil => + case x :: Nil => printTypeOrBound(x) + case x :: xs => + printTypeOrBound(x) + this += sep + printSeparated(xs) + } + printSeparated(types) + this + } + + def printTargsDefs(targs: List[TypeDef]): Unit = { + if (!targs.isEmpty) { + def printSeparated(list: List[TypeDef]): Unit = list match { + case Nil => + case x :: Nil => printTargDef(x) + case x :: xs => + printTargDef(x) + this += ", " + printSeparated(xs) + } + + inSquare(printSeparated(targs)) + } + } + + def printTargDef(arg: TypeDef, isMember: Boolean = false): Buffer = { + this += arg.name + arg.rhs match { + case IsTypeBoundsTree(rhs) => printBoundsTree(rhs) + case rhs @ SyntheticBounds() => + printTypeOrBound(rhs.tpe) + case rhs @ TypeTree.TypeLambdaTree(tparams, body) => + def printParam(t: TypeOrBoundsTree): Unit = t match { + case IsTypeBoundsTree(t) => printBoundsTree(t) + case IsTypeTree(t) => printTypeTree(t) + } + def printSeparated(list: List[TypeDef]): Unit = list match { + case Nil => + case x :: Nil => + this += x.name + printParam(x.rhs) + case x :: xs => + this += x.name + printParam(x.rhs) + this += ", " + printSeparated(xs) + } + inSquare(printSeparated(tparams)) + if (isMember) { + this += " = " + printTypeOrBoundsTree(body) + } + else this + case IsTypeTree(rhs) => + this += " = " + printTypeTree(rhs) + } + } + + def printArgsDefs(args: List[ValDef]): Unit = inParens { + args match { + case Nil => + case arg :: _ => + if (arg.symbol.flags.isErased) this += "erased " + if (arg.symbol.flags.isImplicit) this += "implicit " + } + + def printSeparated(list: List[ValDef]): Unit = list match { + case Nil => + case x :: Nil => printParamDef(x) + case x :: xs => + printParamDef(x) + this += ", " + printSeparated(xs) + } + + printSeparated(args) + } + + def printAnnotations(trees: List[Term]): Buffer = { + def printSeparated(list: List[Term]): Unit = list match { + case Nil => + case x :: Nil => printAnnotation(x) + case x :: xs => + printAnnotation(x) + this += " " + printSeparated(xs) + } + printSeparated(trees) + this + } + + def printParamDef(arg: ValDef): Unit = { + val name = arg.name + arg.symbol.owner match { + case IsDefSymbol(sym) if sym.name == "" => + val ClassDef(_, _, _, _, body) = sym.owner.asClass.tree + body.collectFirst { + case IsValDef(vdef @ ValDef(`name`, _, _)) if vdef.symbol.flags.isParamAccessor => + if (!vdef.symbol.flags.isLocal) { + var printedPrefix = false + if (vdef.symbol.flags.isOverride) { + this += "override " + printedPrefix = true + } + printedPrefix |= printProtectedOrPrivate(vdef) + if (vdef.symbol.flags.isMutable) this += highlightValDef("var ", color) + else if (printedPrefix || !vdef.symbol.flags.isCaseAcessor) this += highlightValDef("val ", color) + else this // val not explicitly needed + } + } + case _ => + } + + this += highlightValDef(name, color) += ": " + printTypeTree(arg.tpt) + } + + def printCaseDef(caseDef: CaseDef): Buffer = { + this += highlightValDef("case ", color) + printPattern(caseDef.pattern) + caseDef.guard match { + case Some(t) => + this += " if " + printTree(t) + case None => + } + this += highlightValDef(" =>", color) + indented { + caseDef.rhs match { + case Term.Block(stats, expr) => + printStats(stats, expr) + case body => + this += lineBreak() + printTree(body) + } + } + this + } + + def printPattern(pattern: Pattern): Buffer = pattern match { + case Pattern.Value(v) => + v match { + case Term.Ident("_") => this += "_" + case _ => printTree(v) + } + + case Pattern.Bind(name, Pattern.Value(Term.Ident("_"))) => + this += name + + case Pattern.Bind(name, Pattern.TypeTest(tpt)) => + this += highlightValDef(name, color) += ": " + printTypeTree(tpt) + + case Pattern.Bind(name, pattern) => + this += name += " @ " + printPattern(pattern) + + case Pattern.Unapply(fun, implicits, patterns) => + fun match { + case Term.Select(extractor, "unapply" | "unapplySeq", _) => printTree(extractor) + case Term.TypeApply(Term.Select(extractor, "unapply" | "unapplySeq", _), _) => printTree(extractor) + case _ => throw new MatchError(fun.show) + } + inParens(printPatterns(patterns, ", ")) + + case Pattern.Alternative(trees) => + inParens(printPatterns(trees, " | ")) + + case Pattern.TypeTest(tpt) => + this += "_: " + printTypeOrBoundsTree(tpt) + + case _ => + throw new MatchError(pattern.show) + + } + + def printConstant(const: Constant): Buffer = const match { + case Constant.Unit() => this += highlightLiteral("()", color) + case Constant.Null() => this += highlightLiteral("null", color) + case Constant.Boolean(v) => this += highlightLiteral(v.toString, color) + case Constant.Byte(v) => this += highlightLiteral(v.toString, color) + case Constant.Short(v) => this += highlightLiteral(v.toString, color) + case Constant.Int(v) => this += highlightLiteral(v.toString, color) + case Constant.Long(v) => this += highlightLiteral(v.toString + "L", color) + case Constant.Float(v) => this += highlightLiteral(v.toString + "f", color) + case Constant.Double(v) => this += highlightLiteral(v.toString, color) + case Constant.Char(v) => this += highlightString('\'' + escapedChar(v) + '\'', color) + case Constant.String(v) => this += highlightString('"' + escapedString(v) + '"', color) + case Constant.ClassTag(v) => + this += "classOf" + inSquare(printType(v)) + case Constant.Symbol(v) => + this += highlightLiteral("'" + v.name, color) + } + + def printTypeOrBoundsTree(tpt: TypeOrBoundsTree): Buffer = tpt match { + case TypeBoundsTree(lo, hi) => + this += "_ >: " + printTypeTree(lo) + this += " <: " + printTypeTree(hi) + case tpt @ SyntheticBounds() => + printTypeOrBound(tpt.tpe) + case IsTypeTree(tpt) => + printTypeTree(tpt) + } + + def printTypeTree(tree: TypeTree): Buffer = tree match { + case TypeTree.Synthetic() => + // TODO try to move this logic into `printType` + def printTypeAndAnnots(tpe: Type): Buffer = tpe match { + case Type.AnnotatedType(tp, annot) => + printTypeAndAnnots(tp) + this += " " + printAnnotation(annot) + case Type.SymRef(IsClassSymbol(sym), _) if sym.fullName == "scala.runtime.Null$" || sym.fullName == "scala.runtime.Nothing$" => + // scala.runtime.Null$ and scala.runtime.Nothing$ are not modules, those are their actual names + printType(tpe) + case tpe @ Type.SymRef(IsClassSymbol(sym), _) if sym.name.endsWith("$") => + printType(tpe) + this += ".type" + case tpe => printType(tpe) + } + printTypeAndAnnots(tree.tpe) + + case TypeTree.Ident(name) => + printType(tree.tpe) + + case TypeTree.Select(qual, name) => + printTree(qual) += "." += highlightTypeDef(name, color) + + case TypeTree.Project(qual, name) => + printTypeTree(qual) += "#" += highlightTypeDef(name, color) + + case TypeTree.Singleton(ref) => + printTree(ref) + ref match { + case Term.Literal(_) => this + case _ => this += ".type" + } + + case TypeTree.Refined(tpt, refinements) => + printTypeTree(tpt) + inBlock(printTrees(refinements, "; ")) + + case TypeTree.Applied(tpt, args) => + printTypeTree(tpt) + inSquare(printTypeOrBoundsTrees(args, ", ")) + + case TypeTree.Annotated(tpt, annot) => + val Annotation(ref, args) = annot + ref.tpe match { + case Types.RepeatedAnnotation() => + val Types.Sequence(tp) = tpt.tpe + printType(tp) + this += highlightTypeDef("*", color) + case _ => + printTypeTree(tpt) + this += " " + printAnnotation(annot) + } + + case TypeTree.And(left, right) => + printTypeTree(left) + this += highlightTypeDef(" & ", color) + printTypeTree(right) + + case TypeTree.Or(left, right) => + printTypeTree(left) + this += highlightTypeDef(" | ", color) + printTypeTree(right) + + case TypeTree.ByName(result) => + this += highlightTypeDef("=> ", color) + printTypeTree(result) + + case TypeTree.TypeLambdaTree(tparams, body) => + printTargsDefs(tparams) + this += highlightTypeDef(" => ", color) + printTypeOrBoundsTree(body) + + case TypeTree.Bind(name, _) => + this += highlightTypeDef(name, color) + + case TypeTree.Block(aliases, tpt) => + inBlock { + printTrees(aliases, lineBreak()) + printTypeTree(tpt) + } + + case _ => + throw new MatchError(tree.show) + + } + + def printTypeOrBound(tpe: TypeOrBounds): Buffer = tpe match { + case tpe@TypeBounds(lo, hi) => + this += "_ >: " + printType(lo) + this += " <: " + printType(hi) + case IsType(tpe) => printType(tpe) + } + + def printType(tpe: Type): Buffer = tpe match { + case Type.ConstantType(const) => + printConstant(const) + + case Type.SymRef(sym, prefix) => + prefix match { + case Types.EmptyPrefix() => + case IsType(prefix @ Type.SymRef(IsClassSymbol(_), _)) => + printType(prefix) + this += "#" + case IsType(prefix) => + if (!sym.flags.isLocal) { + printType(prefix) + this += "." + } + } + this += highlightTypeDef(sym.name.stripSuffix("$"), color) + + case Type.TermRef(name, prefix) => + prefix match { + case Type.ThisType(Types.EmptyPackage()) => + this += highlightTypeDef(name, color) + case IsType(prefix) => + printType(prefix) + if (name != "package") + this += "." += highlightTypeDef(name, color) + this + case NoPrefix() => + this += highlightTypeDef(name, color) + } + + case Type.TypeRef(name, prefix) => + prefix match { + case NoPrefix() | Type.ThisType(Types.EmptyPackage()) => + case IsType(prefix) => printType(prefix) += "." + } + if (name.endsWith("$")) this += highlightTypeDef(name.stripSuffix("$"), color) += ".type" + else this += highlightTypeDef(name, color) + + case tpe @ Type.Refinement(_, _, _) => + printRefinement(tpe) + + case Type.AppliedType(tp, args) => + tp match { + case Type.TypeRef("", Types.ScalaPackage()) => + this += "_*" + case _ => + printType(tp) + inSquare(printTypesOrBounds(args, ", ")) + } + + case Type.AnnotatedType(tp, annot) => + val Annotation(ref, args) = annot + printType(tp) + this += " " + printAnnotation(annot) + + case Type.AndType(left, right) => + printType(left) + this += highlightTypeDef(" & ", color) + printType(right) + + case Type.OrType(left, right) => + printType(left) + this += highlightTypeDef(" | ", color) + printType(right) + + case Type.ByNameType(tp) => + this += highlightTypeDef(" => ", color) + printType(tp) + + case Type.ThisType(tp) => + tp match { + case Type.SymRef(cdef, _) if !cdef.flags.isObject => + printFullClassName(tp) + this += highlightTypeDef(".this", color) + case Type.TypeRef(name, prefix) if name.endsWith("$") => + prefix match { + case Types.EmptyPrefix() => + case _ => + printTypeOrBound(prefix) + this += "." + } + this += highlightTypeDef(name.stripSuffix("$"), color) + case _ => + printType(tp) + } + + case Type.SuperType(thistpe, supertpe) => + printType(supertpe) + this += highlightTypeDef(".super", color) + + case Type.TypeLambda(paramNames, tparams, body) => + inSquare(printMethodicTypeParams(paramNames, tparams)) + this += highlightTypeDef(" => ", color) + printTypeOrBound(body) + + case Type.ParamRef(lambda, idx) => + lambda match { + case Type.MethodType(params, _, _) => this += params(idx) + case Type.PolyType(params, _, _) => this += params(idx) + case Type.TypeLambda(params, _, _) => this += params(idx) + } + + case Type.RecursiveType(tpe) => + printType(tpe) + + case Type.RecursiveThis(_) => + this += highlightTypeDef("this", color) + + case _ => + throw new MatchError(tpe.show) + } + + def printImportSelector(sel: ImportSelector): Buffer = sel match { + case SimpleSelector(Id(name)) => this += name + case OmitSelector(Id(name)) => this += name += " => _" + case RenameSelector(Id(name), Id(newName)) => this += name += " => " += newName + } + + def printDefinitionName(sym: Definition): Buffer = sym match { + case ValDef(name, _, _) => this += highlightValDef(name, color) + case DefDef(name, _, _, _, _) => this += highlightValDef(name, color) + case ClassDef(name, _, _, _, _) => this += highlightTypeDef(name.stripSuffix("$"), color) + case TypeDef(name, _) => this += highlightTypeDef(name, color) + case PackageDef(name, _) => this += highlightTypeDef(name, color) + } + + def printAnnotation(annot: Term): Buffer = { + val Annotation(ref, args) = annot + this += "@" + printTypeTree(ref) + inParens(printTrees(args, ", ")) + } + + def printDefAnnotations(definition: Definition): Buffer = { + val annots = definition.symbol.annots.filter { + case Annotation(annot, _) => + annot.tpe match { + case Type.TypeRef(_, Type.SymRef(sym, _)) if sym.fullName == "scala.annotation.internal" => false + case Type.TypeRef("forceInline", Types.ScalaPackage()) => false + case _ => true + } + case x => throw new MatchError(x.show) + } + printAnnotations(annots) + if (annots.nonEmpty) this += " " + else this + } + + def printRefinement(tpe: Type): Buffer = { + def printMethodicType(tp: TypeOrBounds): Unit = tp match { + case tp @ Type.MethodType(paramNames, params, res) => + inParens(printMethodicTypeParams(paramNames, params)) + printMethodicType(res) + case tp @ Type.TypeLambda(paramNames, params, res) => + inSquare(printMethodicTypeParams(paramNames, params)) + printMethodicType(res) + case Type.ByNameType(t) => + this += ": " + printType(t) + case IsType(tp) => + this += ": " + printType(tp) + } + def rec(tp: Type): Unit = tp match { + case Type.Refinement(parent, name, info) => + rec(parent) + indented { + this += lineBreak() + info match { + case IsTypeBounds(info) => + this += highlightKeyword("type ", color) += highlightTypeDef(name, color) + printBounds(info) + case Type.ByNameType(_) | Type.MethodType(_, _, _) | Type.TypeLambda(_, _, _) => + this += highlightKeyword("def ", color) += highlightTypeDef(name, color) + printMethodicType(info) + case IsType(info) => + this += highlightKeyword("val ", color) += highlightValDef(name, color) + printMethodicType(info) + } + } + case tp => + printType(tp) + this += " {" + } + rec(tpe) + this += lineBreak() += "}" + } + + def printMethodicTypeParams(paramNames: List[String], params: List[TypeOrBounds]): Unit = { + def printInfo(info: TypeOrBounds) = info match { + case IsTypeBounds(info) => printBounds(info) + case IsType(info) => + this += ": " + printType(info) + } + def printSeparated(list: List[(String, TypeOrBounds)]): Unit = list match { + case Nil => + case (name, info) :: Nil => + this += name + printInfo(info) + case (name, info) :: xs => + this += name + printInfo(info) + this += ", " + printSeparated(xs) + } + printSeparated(paramNames.zip(params)) + } + + def printBoundsTree(bounds: TypeBoundsTree): Buffer = { + bounds.low match { + case TypeTree.Synthetic() => + case low => + this += " >: " + printTypeTree(low) + } + bounds.hi match { + case TypeTree.Synthetic() => this + case hi => + this += " <: " + printTypeTree(hi) + } + } + + def printBounds(bounds: TypeBounds): Buffer = { + this += " >: " + printType(bounds.low) + this += " <: " + printType(bounds.hi) + } + + def printProtectedOrPrivate(definition: Definition): Boolean = { + var prefixWasPrinted = false + def printWithin(within: Type) = within match { + case Type.SymRef(sym, _) => + this += sym.name + case _ => printFullClassName(within) + } + if (definition.symbol.flags.isProtected) { + this += highlightKeyword("protected", color) + definition.symbol.protectedWithin match { + case Some(within) => + inSquare(printWithin(within)) + case _ => + } + prefixWasPrinted = true + } else { + definition.symbol.privateWithin match { + case Some(within) => + this += highlightKeyword("private", color) + inSquare(printWithin(within)) + prefixWasPrinted = true + case _ => + } + } + if (prefixWasPrinted) + this += " " + prefixWasPrinted + } + + def printFullClassName(tp: TypeOrBounds): Unit = { + def printClassPrefix(prefix: TypeOrBounds): Unit = prefix match { + case Type.SymRef(IsClassSymbol(sym), prefix2) => + printClassPrefix(prefix2) + this += sym.name += "." + case _ => + } + val Type.SymRef(sym, prefix) = tp + printClassPrefix(prefix) + this += sym.name + } + + def +=(x: Boolean): this.type = { sb.append(x); this } + def +=(x: Byte): this.type = { sb.append(x); this } + def +=(x: Short): this.type = { sb.append(x); this } + def +=(x: Int): this.type = { sb.append(x); this } + def +=(x: Long): this.type = { sb.append(x); this } + def +=(x: Float): this.type = { sb.append(x); this } + def +=(x: Double): this.type = { sb.append(x); this } + def +=(x: Char): this.type = { sb.append(x); this } + def +=(x: String): this.type = { sb.append(x); this } + + private def escapedChar(ch: Char): String = (ch: @switch) match { + case '\b' => "\\b" + case '\t' => "\\t" + case '\n' => "\\n" + case '\f' => "\\f" + case '\r' => "\\r" + case '"' => "\\\"" + case '\'' => "\\\'" + case '\\' => "\\\\" + case _ => if (ch.isControl) "\\0" + Integer.toOctalString(ch) else String.valueOf(ch) + } + + private def escapedString(str: String): String = str flatMap escapedChar + } + + private object SpecialOp { + def unapply(arg: Tree)(implicit ctx: Context): Option[(String, List[Term])] = arg match { + case IsTerm(arg @ Term.Apply(fn, args)) => + fn.tpe match { + case Type.SymRef(IsDefSymbol(sym), Type.ThisType(Type.SymRef(sym2, _))) if sym2.name == "" => + Some((sym.tree.name, args)) + case _ => None + } + case _ => None + } + } + + private object Annotation { + def unapply(arg: Tree)(implicit ctx: Context): Option[(TypeTree, List[Term])] = arg match { + case Term.New(annot) => Some((annot, Nil)) + case Term.Apply(Term.Select(Term.New(annot), "", _), args) => Some((annot, args)) + case Term.Apply(Term.TypeApply(Term.Select(Term.New(annot), "", _), targs), args) => Some((annot, args)) + case _ => None + } + } + + // TODO Provide some of these in scala.tasty.Reflect.scala and implement them using checks on symbols for performance + private object Types { + + object JavaLangObject { + def unapply(tpe: Type)(implicit ctx: Context): Boolean = tpe match { + case Type.TypeRef("Object", Type.SymRef(sym, _)) if sym.fullName == "java.lang" => true + case _ => false + } + } + + object Sequence { + def unapply(tpe: Type)(implicit ctx: Context): Option[Type] = tpe match { + case Type.AppliedType(Type.TypeRef("Seq", Type.SymRef(sym, _)), IsType(tp) :: Nil) if sym.fullName == "scala.collection" => Some(tp) + case _ => None + } + } + + object RepeatedAnnotation { + def unapply(tpe: Type)(implicit ctx: Context): Boolean = tpe match { + case Type.TypeRef("Repeated", Type.SymRef(sym, _)) if sym.fullName == "scala.annotation.internal" => true + case _ => false + } + } + + object Repeated { + def unapply(tpe: Type)(implicit ctx: Context): Option[Type] = tpe match { + case Type.AppliedType(Type.TypeRef("", ScalaPackage()), IsType(tp) :: Nil) => Some(tp) + case _ => None + } + } + + object ScalaPackage { + def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { + case Type.SymRef(sym, _) => sym == definitions.ScalaPackage + case _ => false + } + } + + object RootPackage { + def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { + case Type.SymRef(sym, _) => sym.fullName == "" // TODO use Symbol.== + case _ => false + } + } + + object EmptyPackage { + def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { + case Type.SymRef(sym, _) => sym.fullName == "" + case _ => false + } + } + + object EmptyPrefix { + def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { + case NoPrefix() | Type.ThisType(Types.EmptyPackage() | Types.RootPackage()) => true + case _ => false + } + } + } + + object PackageObject { + def unapply(tree: Tree)(implicit ctx: Context): Option[Tree] = tree match { + case PackageClause(_, ValDef("package", _, _) :: body :: Nil) => Some(body) + case _ => None + } + } + + } + } diff --git a/library/src/scala/tasty/reflect/SettingsOps.scala b/library/src/scala/tasty/reflect/SettingsOps.scala index 8db2930e3325..746df22d8fff 100644 --- a/library/src/scala/tasty/reflect/SettingsOps.scala +++ b/library/src/scala/tasty/reflect/SettingsOps.scala @@ -3,10 +3,10 @@ package scala.tasty.reflect trait SettingsOps extends ReflectionCore { /** Compiler settings */ - def settings(implicit ctx: Context): Settings + def settings: Settings trait SettingsAPI { - def color(implicit ctx: Context): Boolean + def color: Boolean } implicit def SettingsDeco(settings: Settings): SettingsAPI diff --git a/library/src/scala/tasty/util/ExtractorsPrinter.scala b/library/src/scala/tasty/util/ExtractorsPrinter.scala deleted file mode 100644 index 9f9f56868a18..000000000000 --- a/library/src/scala/tasty/util/ExtractorsPrinter.scala +++ /dev/null @@ -1,326 +0,0 @@ -package scala.tasty.util - -import scala.tasty.Reflection - -class ExtractorsPrinter[R <: Reflection with Singleton](reclect0: R) extends Printer[R](reclect0) { - import reflect.{rootContext => _, _} - - def showTree(tree: Tree)(implicit ctx: Context): String = - new Buffer().visitTree(tree).result() - def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = - new Buffer().visitCaseDef(caseDef).result() - - def showPattern(pattern: Pattern)(implicit ctx: Context): String = - new Buffer().visitPattern(pattern).result() - - def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String = - new Buffer().visitTypeTree(tpt).result() - - def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String = - new Buffer().visitType(tpe).result() - - def showConstant(const: Constant)(implicit ctx: Context): String = - new Buffer().visitConstant(const).result() - - def showSymbol(symbol: Symbol)(implicit ctx: Context): String = - new Buffer().visitSymbol(symbol).result() - - private class Buffer(implicit ctx: Context) { self => - - private val sb: StringBuilder = new StringBuilder - - def result(): String = sb.result() - - def visitTree(x: Tree): Buffer = x match { - case Term.Ident(name) => - this += "Term.Ident(\"" += name += "\")" - case Term.Select(qualifier, name, signature) => - this += "Term.Select(" += qualifier += ", \"" += name += "\", " += signature += ")" - case Term.This(qual) => - this += "Term.This(" += qual += ")" - case Term.Super(qual, mix) => - this += "Term.TypeApply(" += qual += ", " += mix += ")" - case Term.Apply(fun, args) => - this += "Term.Apply(" += fun += ", " ++= args += ")" - case Term.TypeApply(fun, args) => - this += "Term.TypeApply(" += fun += ", " ++= args += ")" - case Term.Literal(const) => - this += "Term.Literal(" += const += ")" - case Term.New(tpt) => - this += "Term.New(" += tpt += ")" - case Term.Typed(expr, tpt) => - this += "Term.Typed(" += expr += ", " += tpt += ")" - case Term.NamedArg(name, arg) => - this += "Term.NamedArg(\"" += name += "\", " += arg += ")" - case Term.Assign(lhs, rhs) => - this += "Term.Assign(" += lhs += ", " += rhs += ")" - case Term.Block(stats, expr) => - this += "Term.Block(" ++= stats += ", " += expr += ")" - case Term.If(cond, thenp, elsep) => - this += "Term.If(" += cond += ", " += thenp += ", " += elsep += ")" - case Term.Lambda(meth, tpt) => - this += "Term.Lambda(" += meth += ", " += tpt += ")" - case Term.Match(selector, cases) => - this += "Term.Match(" += selector += ", " ++= cases += ")" - case Term.Return(expr) => - this += "Term.Return(" += expr += ")" - case Term.While(cond, body) => - this += "Term.While(" += cond += ", " += body += ")" - case Term.Try(block, handlers, finalizer) => - this += "Term.Try(" += block += ", " ++= handlers += ", " += finalizer += ")" - case Term.Repeated(elems) => - this += "Term.Repeated(" ++= elems += ")" - case Term.Inlined(call, bindings, expansion) => - this += "Term.Inlined(" - visitOption(call, visitTermOrTypeTree) - this += ", " ++= bindings += ", " += expansion += ")" - case ValDef(name, tpt, rhs) => - this += "ValDef(\"" += name += "\", " += tpt += ", " += rhs += ")" - case DefDef(name, typeParams, paramss, returnTpt, rhs) => - this += "DefDef(\"" += name += "\", " ++= typeParams += ", " +++= paramss += ", " += returnTpt += ", " += rhs += ")" - case TypeDef(name, rhs) => - this += "TypeDef(\"" += name += "\", " += rhs += ")" - case ClassDef(name, constr, parents, self, body) => - this += "ClassDef(\"" += name += "\", " += constr += ", " - visitList[TermOrTypeTree](parents, visitTermOrTypeTree) - this += ", " += self += ", " ++= body += ")" - case PackageDef(name, owner) => - this += "PackageDef(\"" += name += "\", " += owner += ")" - case Import(expr, selectors) => - this += "Import(" += expr += ", " ++= selectors += ")" - case PackageClause(pid, stats) => - this += "PackageClause(" += pid += ", " ++= stats += ")" - } - - def visitTypeTree(x: TypeOrBoundsTree): Buffer = x match { - case TypeTree.Synthetic() => - this += "TypeTree.Synthetic()" - case TypeTree.Ident(name) => - this += "TypeTree.Ident(\"" += name += "\")" - case TypeTree.Select(qualifier, name) => - this += "TypeTree.Select(" += qualifier += ", \"" += name += "\")" - case TypeTree.Project(qualifier, name) => - this += "TypeTree.Project(" += qualifier += ", \"" += name += "\")" - case TypeTree.Singleton(ref) => - this += "TypeTree.Singleton(" += ref += ")" - case TypeTree.And(left, right) => - this += "TypeTree.And(" += left += ", " += right += ")" - case TypeTree.Or(left, right) => - this += "TypeTree.Or(" += left += ", " += right += ")" - case TypeTree.Refined(tpt, refinements) => - this += "TypeTree.Refined(" += tpt += ", " ++= refinements += ")" - case TypeTree.Applied(tpt, args) => - this += "TypeTree.Applied(" += tpt += ", " ++= args += ")" - case TypeTree.ByName(result) => - this += "TypeTree.ByName(" += result += ")" - case TypeTree.Annotated(arg, annot) => - this += "TypeTree.Annotated(" += arg += ", " += annot += ")" - case TypeTree.TypeLambdaTree(tparams, body) => - this += "TypeTree.LambdaTypeTree(" ++= tparams += ", " += body += ")" - case TypeTree.Bind(name, bounds) => - this += "TypeTree.Bind(" += name += ", " += bounds += ")" - case TypeTree.Block(aliases, tpt) => - this += "TypeTree.Block(" ++= aliases += ", " += tpt += ")" - case TypeBoundsTree(lo, hi) => - this += "TypeBoundsTree(" += lo += ", " += hi += ")" - case SyntheticBounds() => - this += s"SyntheticBounds()" - } - - def visitCaseDef(x: CaseDef): Buffer = { - val CaseDef(pat, guard, body) = x - this += "CaseDef(" += pat += ", " += guard += ", " += body += ")" - } - - def visitPattern(x: Pattern): Buffer = x match { - case Pattern.Value(v) => - this += "Pattern.Value(" += v += ")" - case Pattern.Bind(name, body) => - this += "Pattern.Bind(\"" += name += "\", " += body += ")" - case Pattern.Unapply(fun, implicits, patterns) => - this += "Pattern.Unapply(" += fun += ", " ++= implicits += ", " ++= patterns += ")" - case Pattern.Alternative(patterns) => - this += "Pattern.Alternative(" ++= patterns += ")" - case Pattern.TypeTest(tpt) => - this += "Pattern.TypeTest(" += tpt += ")" - } - - def visitTermOrTypeTree(x: TermOrTypeTree): Buffer = x match { - case IsTerm(termOrTypeTree) => this += termOrTypeTree - case IsTypeTree(termOrTypeTree) => this += termOrTypeTree - } - - def visitConstant(x: Constant): Buffer = x match { - case Constant.Unit() => this += "Constant.Unit()" - case Constant.Null() => this += "Constant.Null()" - case Constant.Boolean(value) => this += "Constant.Boolean(" += value += ")" - case Constant.Byte(value) => this += "Constant.Byte(" += value += ")" - case Constant.Short(value) => this += "Constant.Short(" += value += ")" - case Constant.Char(value) => this += "Constant.Char(" += value += ")" - case Constant.Int(value) => this += "Constant.Int(" += value.toString += ")" - case Constant.Long(value) => this += "Constant.Long(" += value += ")" - case Constant.Float(value) => this += "Constant.Float(" += value += ")" - case Constant.Double(value) => this += "Constant.Double(" += value += ")" - case Constant.String(value) => this += "Constant.String(\"" += value += "\")" - case Constant.ClassTag(value) => this += "Constant.ClassTag(" += value += ")" - case Constant.Symbol(value) => this += "Constant.Symbol('" += value.name += ")" - } - - def visitType(x: TypeOrBounds): Buffer = x match { - case Type.ConstantType(value) => - this += "Type.ConstantType(" += value += ")" - case Type.SymRef(sym, qual) => - this += "Type.SymRef(" += sym += ", " += qual += ")" - case Type.TermRef(name, qual) => - this += "Type.TermRef(\"" += name += "\", " += qual += ")" - case Type.TypeRef(name, qual) => - this += "Type.TypeRef(\"" += name += "\", " += qual += ")" - case Type.Refinement(parent, name, info) => - this += "Type.Refinement(" += parent += ", " += name += ", " += info += ")" - case Type.AppliedType(tycon, args) => - this += "Type.AppliedType(" += tycon += ", " ++= args += ")" - case Type.AnnotatedType(underlying, annot) => - this += "Type.AnnotatedType(" += underlying += ", " += annot += ")" - case Type.AndType(left, right) => - this += "Type.AndType(" += left += ", " += right += ")" - case Type.OrType(left, right) => - this += "Type.OrType(" += left += ", " += right += ")" - case Type.ByNameType(underlying) => - this += "Type.ByNameType(" += underlying += ")" - case Type.ParamRef(binder, idx) => - this += "Type.ParamRef(" += binder += ", " += idx += ")" - case Type.ThisType(tp) => - this += "Type.ThisType(" += tp += ")" - case Type.SuperType(thistpe, supertpe) => - this += "Type.SuperType(" += thistpe += ", " += supertpe += ")" - case Type.RecursiveThis(binder) => - this += "Type.RecursiveThis(" += binder += ")" - case Type.RecursiveType(underlying) => - this += "Type.RecursiveType(" += underlying += ")" - case Type.MethodType(argNames, argTypes, resType) => - this += "Type.MethodType(" ++= argNames += ", " ++= argTypes += ", " += resType += ")" - case Type.PolyType(argNames, argBounds, resType) => - this += "Type.PolyType(" ++= argNames += ", " ++= argBounds += ", " += resType += ")" - case Type.TypeLambda(argNames, argBounds, resType) => - // resType is not printed to avoid cycles - this += "Type.TypeLambda(" ++= argNames += ", " ++= argBounds += ", _)" - case TypeBounds(lo, hi) => - this += "TypeBounds(" += lo += ", " += hi += ")" - case NoPrefix() => - this += "NoPrefix()" - } - - def visitId(x: Id): Buffer = { - val Id(name) = x - this += "Id(\"" += name += "\")" - } - - def visitSignature(sig: Signature): Buffer = { - val Signature(params, res) = sig - this += "Signature(" ++= params += ", " += res += ")" - } - - def visitImportSelector(sel: ImportSelector): Buffer = sel match { - case SimpleSelector(id) => this += "SimpleSelector(" += id += ")" - case RenameSelector(id1, id2) => this += "RenameSelector(" += id1 += ", " += id2 += ")" - case OmitSelector(id) => this += "OmitSelector(" += id += ")" - } - - def visitSymbol(x: Symbol): Buffer = x match { - case IsPackageSymbol(x) => this += "IsPackageSymbol(<" += x.fullName += ">)" - case IsClassSymbol(x) => this += "IsClassSymbol(<" += x.fullName += ">)" - case IsDefSymbol(x) => this += "IsDefSymbol(<" += x.fullName += ">)" - case IsValSymbol(x) => this += "IsValSymbol(<" += x.fullName += ">)" - case IsTypeSymbol(x) => this += "IsTypeSymbol(<" += x.fullName += ">)" - case NoSymbol() => this += "NoSymbol()" - } - - def +=(x: Boolean): Buffer = { sb.append(x); this } - def +=(x: Byte): Buffer = { sb.append(x); this } - def +=(x: Short): Buffer = { sb.append(x); this } - def +=(x: Int): Buffer = { sb.append(x); this } - def +=(x: Long): Buffer = { sb.append(x); this } - def +=(x: Float): Buffer = { sb.append(x); this } - def +=(x: Double): Buffer = { sb.append(x); this } - def +=(x: Char): Buffer = { sb.append(x); this } - def +=(x: String): Buffer = { sb.append(x); this } - - def ++=(xs: List[String]): Buffer = visitList[String](xs, +=) - - private implicit class TreeOps(buff: Buffer) { - def +=(x: Tree): Buffer = { visitTree(x); buff } - def +=(x: Option[Tree]): Buffer = { visitOption(x, visitTree); buff } - def ++=(x: List[Tree]): Buffer = { visitList(x, visitTree); buff } - def +++=(x: List[List[Tree]]): Buffer = { visitList(x, ++=); buff } - } - - private implicit class CaseDefOps(buff: Buffer) { - def +=(x: CaseDef): Buffer = { visitCaseDef(x); buff } - def ++=(x: List[CaseDef]): Buffer = { visitList(x, visitCaseDef); buff } - } - - private implicit class PatternOps(buff: Buffer) { - def +=(x: Pattern): Buffer = { visitPattern(x); buff } - def ++=(x: List[Pattern]): Buffer = { visitList(x, visitPattern); buff } - } - - private implicit class ConstantOps(buff: Buffer) { - def +=(x: Constant): Buffer = { visitConstant(x); buff } - } - - private implicit class TypeTreeOps(buff: Buffer) { - def +=(x: TypeOrBoundsTree): Buffer = { visitTypeTree(x); buff } - def +=(x: Option[TypeOrBoundsTree]): Buffer = { visitOption(x, visitTypeTree); buff } - def ++=(x: List[TypeOrBoundsTree]): Buffer = { visitList(x, visitTypeTree); buff } - } - - private implicit class TypeOps(buff: Buffer) { - def +=(x: TypeOrBounds): Buffer = { visitType(x); buff } - def ++=(x: List[TypeOrBounds]): Buffer = { visitList(x, visitType); buff } - } - - private implicit class IdOps(buff: Buffer) { - def +=(x: Id): Buffer = { visitId(x); buff } - def +=(x: Option[Id]): Buffer = { visitOption(x, visitId); buff } - } - - private implicit class SignatureOps(buff: Buffer) { - def +=(x: Option[Signature]): Buffer = { visitOption(x, visitSignature); buff } - } - - private implicit class ImportSelectorOps(buff: Buffer) { - def ++=(x: List[ImportSelector]): Buffer = { visitList(x, visitImportSelector); buff } - } - - private implicit class SymbolOps(buff: Buffer) { - def +=(x: Symbol): Buffer = { visitSymbol(x); buff } - } - - private def visitOption[U](opt: Option[U], visit: U => Buffer): Buffer = opt match { - case Some(x) => - this += "Some(" - visit(x) - this += ")" - case _ => - this += "None" - } - - private def visitList[U](list: List[U], visit: U => Buffer): Buffer = list match { - case x0 :: xs => - this += "List(" - visit(x0) - def visitNext(xs: List[U]): Unit = xs match { - case y :: ys => - this += ", " - visit(y) - visitNext(ys) - case Nil => - } - visitNext(xs) - this += ")" - case Nil => - this += "Nil" - } - } - -} diff --git a/library/src/scala/tasty/util/Printer.scala b/library/src/scala/tasty/util/Printer.scala deleted file mode 100644 index 46bc0a21a6b2..000000000000 --- a/library/src/scala/tasty/util/Printer.scala +++ /dev/null @@ -1,21 +0,0 @@ -package scala.tasty.util - -import scala.tasty.Reflection - -abstract class Printer[R <: Reflection with Singleton](val reflect: R) { - - def showTree(tree: reflect.Tree)(implicit ctx: reflect.Context): String - - def showCaseDef(caseDef: reflect.CaseDef)(implicit ctx: reflect.Context): String - - def showPattern(pattern: reflect.Pattern)(implicit ctx: reflect.Context): String - - def showTypeOrBoundsTree(tpt: reflect.TypeOrBoundsTree)(implicit ctx: reflect.Context): String - - def showTypeOrBounds(tpe: reflect.TypeOrBounds)(implicit ctx: reflect.Context): String - - def showConstant(const: reflect.Constant)(implicit ctx: reflect.Context): String - - def showSymbol(symbol: reflect.Symbol)(implicit ctx: reflect.Context): String - -} diff --git a/library/src/scala/tasty/util/SourceCodePrinter.scala b/library/src/scala/tasty/util/SourceCodePrinter.scala deleted file mode 100644 index e626ea254129..000000000000 --- a/library/src/scala/tasty/util/SourceCodePrinter.scala +++ /dev/null @@ -1,1239 +0,0 @@ -package scala.tasty -package util - -import scala.annotation.switch -import scala.tasty.util.SyntaxHighlightUtils._ - -class SourceCodePrinter[R <: Reflection with Singleton](reflect0: R) extends Printer[R](reflect0) { - import reflect.{rootContext => _, _} - - private[this] val color: Boolean = { - import reflect.rootContext - reflect.settings.color - } - - def showTree(tree: Tree)(implicit ctx: Context): String = - (new Buffer).printTree(tree).result() - - def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = - (new Buffer).printCaseDef(caseDef).result() - - def showPattern(pattern: Pattern)(implicit ctx: Context): String = - (new Buffer).printPattern(pattern).result() - - def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String = - (new Buffer).printTypeOrBoundsTree(tpt).result() - - def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String = - (new Buffer).printTypeOrBound(tpe).result() - - def showConstant(const: Constant)(implicit ctx: Context): String = - (new Buffer).printConstant(const).result() - - def showSymbol(symbol: Symbol)(implicit ctx: Context): String = - symbol.fullName - - private class Buffer(implicit ctx: Context) { - - private[this] val sb: StringBuilder = new StringBuilder - - private[this] var indent: Int = 0 - def indented(printIndented: => Unit): Unit = { - indent += 1 - printIndented - indent -= 1 - } - - def inParens(body: => Unit): Buffer = { - this += "(" - body - this += ")" - } - - def inSquare(body: => Unit): Buffer = { - this += "[" - body - this += "]" - } - - def inBlock(body: => Unit): Buffer = { - this += " {" - indented { - this += lineBreak() - body - } - this += lineBreak() += "}" - } - - def result(): String = sb.result() - - def lineBreak(): String = "\n" + (" " * indent) - def doubleLineBreak(): String = "\n\n" + (" " * indent) - - def printTree(tree: Tree): Buffer = tree match { - case PackageObject(body)=> - printTree(body) // Print package object - - case PackageClause(Term.Ident(name), (inner @ PackageClause(_, _)) :: Nil) if name != "" && PackageObject.unapply(inner).isEmpty => - // print inner package as `package outer.inner { ... }` - printTree(inner) - - case tree @ PackageClause(name, stats) => - val stats1 = stats.collect { - case IsPackageClause(stat) => stat - case IsDefinition(stat) if !(stat.symbol.flags.isObject && stat.symbol.flags.isLazy) => stat - case stat @ Import(_, _) => stat - } - name match { - case Term.Ident("") => - printTrees(stats1, lineBreak()) - case _ => - this += "package " - printType(name.tpe) - inBlock(printTrees(stats1, lineBreak())) - } - - case Import(expr, selectors) => - this += "import " - printTree(expr) - this += "." - printImportSelectors(selectors) - - case IsClassDef(cdef @ ClassDef(name, DefDef(_, targs, argss, _, _), parents, self, stats)) => - printDefAnnotations(cdef) - - val flags = cdef.symbol.flags - if (flags.isImplicit) this += highlightKeyword("implicit ", color) - if (flags.isSealed) this += highlightKeyword("sealed ", color) - if (flags.isFinal && !flags.isObject) this += highlightKeyword("final ", color) - if (flags.isCase) this += highlightKeyword("case ", color) - - if (name == "package$") { - this += highlightKeyword("package object ", color) += highlightTypeDef(cdef.symbol.owner.name.stripSuffix("$"), color) - } - else if (flags.isObject) this += highlightKeyword("object ", color) += highlightTypeDef(name.stripSuffix("$"), color) - else if (flags.isTrait) this += highlightKeyword("trait ", color) += highlightTypeDef(name, color) - else if (flags.isAbstract) this += highlightKeyword("abstract class ", color) += highlightTypeDef(name, color) - else this += highlightKeyword("class ", color) += highlightTypeDef(name, color) - - if (!flags.isObject) { - printTargsDefs(targs) - val it = argss.iterator - while (it.hasNext) - printArgsDefs(it.next()) - } - - val parents1 = parents.filter { - case IsTerm(Term.Apply(Term.Select(Term.New(tpt), _, _), _)) => !Types.JavaLangObject.unapply(tpt.tpe) - case IsTypeTree(TypeTree.Select(Term.Select(Term.Ident("_root_"), "scala", _), "Product")) => false - case _ => true - } - if (parents1.nonEmpty) - this += highlightKeyword(" extends ", color) - - def printParent(parent: TermOrTypeTree): Unit = parent match { - case IsTypeTree(parent) => - printTypeTree(parent) - case IsTerm(Term.TypeApply(fun, targs)) => - printParent(fun) - inSquare(printTypeOrBoundsTrees(targs, ", ")) - case IsTerm(Term.Apply(fun, args)) => - printParent(fun) - inParens(printTrees(args, ", ")) - case IsTerm(Term.Select(Term.New(tpt), _, _)) => - printTypeTree(tpt) - case IsTerm(parent) => - throw new MatchError(parent.show) - } - - def printSeparated(list: List[TermOrTypeTree]): Unit = list match { - case Nil => - case x :: Nil => printParent(x) - case x :: xs => - printParent(x) - this += highlightKeyword(" with ", color) - printSeparated(xs) - } - printSeparated(parents1) - - def keepDefinition(d: Definition): Boolean = { - val flags = d.symbol.flags - def isCaseClassUnOverridableMethod: Boolean = { - // Currently the compiler does not allow overriding some of the methods generated for case classes - d.symbol.flags.isSynthetic && - (d match { - case DefDef("apply" | "unapply", _, _, _, _) if d.symbol.owner.flags.isObject => true - case DefDef(n, _, _, _, _) if d.symbol.owner.flags.isCase => - n == "copy" || - n.matches("copy\\$default\\$[1-9][0-9]*") || // default parameters for the copy method - n.matches("_[1-9][0-9]*") // Getters from Product - case _ => false - }) - } - def isInnerModuleObject = d.symbol.flags.isLazy && d.symbol.flags.isObject - !flags.isParam && !flags.isParamAccessor && !flags.isFieldAccessor && !isCaseClassUnOverridableMethod && !isInnerModuleObject - } - val stats1 = stats.collect { - case IsDefinition(stat) if keepDefinition(stat) => stat - case stat @ Import(_, _) => stat - case IsTerm(stat) => stat - } - - def printBody(printSelf: Boolean) = { - this += " {" - indented { - if (printSelf) { - val Some(ValDef(name, tpt, _)) = self - indented { - val name1 = if (name == "_") "this" else name - this += " " += highlightValDef(name1, color) += ": " - printTypeTree(tpt) - this += " =>" - } - } - this += lineBreak() - printTrees(stats1, lineBreak()) - } - this += lineBreak() += "}" - } - self match { - case Some(ValDef(_, TypeTree.Singleton(_), _)) => - if (stats1.nonEmpty) - printBody(printSelf = false) - case Some(ValDef(_, _, _)) => - printBody(printSelf = true) - case _ => - if (stats1.nonEmpty) - printBody(printSelf = false) - } - this - - case IsTypeDef(tdef @ TypeDef(name, rhs)) => - printDefAnnotations(tdef) - this += highlightKeyword("type ", color) - printTargDef(tdef, isMember = true) - - case IsValDef(vdef @ ValDef(name, tpt, rhs)) => - printDefAnnotations(vdef) - - val flags = vdef.symbol.flags - if (flags.isImplicit) this += highlightKeyword("implicit ", color) - if (flags.isOverride) this += highlightKeyword("override ", color) - - printProtectedOrPrivate(vdef) - - if (flags.isLazy) this += highlightKeyword("lazy ", color) - if (vdef.symbol.flags.isMutable) this += highlightKeyword("var ", color) - else this += highlightKeyword("val ", color) - - this += highlightValDef(name, color) += ": " - printTypeTree(tpt) - rhs match { - case Some(tree) => - this += " = " - printTree(tree) - case None => - this - } - - case Term.While(cond, body) => - (cond, body) match { - case (Term.Block(Term.Block(Nil, body1) :: Nil, Term.Block(Nil, cond1)), Term.Literal(Constant.Unit())) => - this += highlightKeyword("do ", color) - printTree(body1) += highlightKeyword(" while ", color) - inParens(printTree(cond1)) - case _ => - this += highlightKeyword("while ", color) - inParens(printTree(cond)) += " " - printTree(body) - } - - case IsDefDef(ddef @ DefDef(name, targs, argss, tpt, rhs)) => - printDefAnnotations(ddef) - - val isConstructor = name == "" - - val flags = ddef.symbol.flags - if (flags.isImplicit) this += highlightKeyword("implicit ", color) - if (flags.isInline) this += highlightKeyword("inline ", color) - if (flags.isOverride) this += highlightKeyword("override ", color) - - printProtectedOrPrivate(ddef) - - this += highlightKeyword("def ", color) += highlightValDef((if (isConstructor) "this" else name), color) - printTargsDefs(targs) - val it = argss.iterator - while (it.hasNext) - printArgsDefs(it.next()) - if (!isConstructor) { - this += ": " - printTypeTree(tpt) - } - rhs match { - case Some(tree) => - this += " = " - printTree(tree) - case None => - } - this - - case IsTerm(tree @ Term.Ident(_)) => - printType(tree.tpe) - - case Term.Select(qual, name, sig) => - printTree(qual) - if (name != "" && name != "package") - this += "." += name - this - - case Term.Literal(const) => - printConstant(const) - - case Term.This(id) => - id match { - case Some(x) => - this += x.name.stripSuffix("$") += "." - case None => - } - this += "this" - - case Term.New(tpt) => - this += "new " - printTypeTree(tpt) - - case Term.NamedArg(name, arg) => - this += name += " = " - printTree(arg) - - case SpecialOp("throw", expr :: Nil) => - this += "throw " - printTree(expr) - - case Term.Apply(fn, args) => - fn match { - case Term.Select(Term.This(_), "", _) => this += "this" // call to constructor inside a constructor - case _ => printTree(fn) - } - val args1 = args match { - case init :+ Term.Typed(Term.Repeated(Nil), _) => init // drop empty var args at the end - case _ => args - } - - inParens(printTrees(args1, ", ")) - - case Term.TypeApply(fn, args) => - printTree(fn) - fn match { - case Term.Select(Term.New(TypeTree.Applied(_, _)), "", _) => - // type bounds already printed in `fn` - this - case _ => - inSquare(printTypeOrBoundsTrees(args, ", ")) - } - - case Term.Super(qual, idOpt) => - qual match { - case Term.This(Some(Id(name))) => this += name += "." - case Term.This(None) => - } - this += "super" - for (id <- idOpt) - inSquare(this += id.name) - this - - case Term.Typed(term, tpt) => - tpt.tpe match { - case Types.Repeated(_) => - term match { - case Term.Repeated(_) => - printTree(term) - case _ => - printTree(term) - this += ": " += highlightTypeDef("_*", color) - } - case _ => - inParens { - printTree(term) - this += (if (Chars.isOperatorPart(sb.last)) " : " else ": ") - def printTypeOrAnnots(tpe: Type): Unit = tpe match { - case Type.AnnotatedType(tp, annot) if tp == term.tpe => - printAnnotation(annot) - case Type.AnnotatedType(tp, annot) => - printTypeOrAnnots(tp) - this += " " - printAnnotation(annot) - case tpe => - printType(tpe) - } - printTypeOrAnnots(tpt.tpe) - } - } - - case Term.Assign(lhs, rhs) => - printTree(lhs) - this += " = " - printTree(rhs) - - case Term.Block(stats0, expr) => - val stats = stats0.filter { - case IsValDef(tree) => !tree.symbol.flags.isObject - case _ => true - } - - expr match { - case Term.Lambda(_, _) => - // Decompile lambda from { def annon$(...) = ...; closure(annon$, ...)} - assert(stats.size == 1) - val DefDef(_, _, args :: Nil, _, Some(rhs)) :: Nil = stats - inParens { - printArgsDefs(args) - this += " => " - printTree(rhs) - } - case _ => - this += "{" - indented { - printStats(stats, expr) - } - this += lineBreak() += "}" - } - - case Term.Inlined(call, bindings, expansion) => // FIXME: Don't print Inlined with empty calls? - this += "{ // inlined" - indented { - printStats(bindings, expansion) - } - this += lineBreak() += "}" - - case Term.Lambda(meth, tpt) => - // Printed in Term.Block branch - this - - case Term.If(cond, thenp, elsep) => - this += highlightKeyword("if ", color) - inParens(printTree(cond)) - this += " " - printTree(thenp) - this+= highlightKeyword(" else ", color) - printTree(elsep) - - case Term.Match(selector, cases) => - printTree(selector) - this += highlightKeyword(" match", color) - inBlock(printCases(cases, lineBreak())) - - case Term.Try(body, cases, finallyOpt) => - this += highlightKeyword("try ", color) - printTree(body) - if (cases.nonEmpty) { - this += highlightKeyword(" catch", color) - inBlock(printCases(cases, lineBreak())) - } - finallyOpt match { - case Some(t) => - this += highlightKeyword(" finally ", color) - printTree(t) - case None => - this - } - - case Term.Return(expr) => - this += "return " - printTree(expr) - - case Term.Repeated(elems) => - printTrees(elems, ", ") - - case _ => - throw new MatchError(tree.show) - - } - - def printStats(stats: List[Tree], expr: Tree): Unit = { - def printSeparator(next: Tree): Unit = { - // Avoid accidental application of opening `{` on next line with a double break - next match { - case Term.Block(_, _) => this += doubleLineBreak() - case Term.Inlined(_, _, _) => this += doubleLineBreak() - case Term.Select(qual, _, _) => printSeparator(qual) - case Term.Apply(fn, _) => printSeparator(fn) - case Term.TypeApply(fn, _) => printSeparator(fn) - case _ => this += lineBreak() - } - } - def printSeparated(list: List[Tree]): Unit = list match { - case Nil => - printTree(expr) - case x :: xs => - printTree(x) - printSeparator(if (xs.isEmpty) expr else xs.head) - printSeparated(xs) - } - - this += lineBreak() - printSeparated(stats) - } - - def printTrees(trees: List[Tree], sep: String): Buffer = { - def printSeparated(list: List[Tree]): Unit = list match { - case Nil => - case x :: Nil => printTree(x) - case x :: xs => - printTree(x) - this += sep - printSeparated(xs) - } - printSeparated(trees) - this - } - - def printImportSelectors(selectors: List[ImportSelector]): Buffer = { - def printSeparated(list: List[ImportSelector]): Unit = list match { - case Nil => - case x :: Nil => printImportSelector(x) - case x :: xs => - printImportSelector(x) - this += ", " - printSeparated(xs) - } - this += "{" - printSeparated(selectors) - this += "}" - } - - def printCases(cases: List[CaseDef], sep: String): Buffer = { - def printSeparated(list: List[CaseDef]): Unit = list match { - case Nil => - case x :: Nil => printCaseDef(x) - case x :: xs => - printCaseDef(x) - this += sep - printSeparated(xs) - } - printSeparated(cases) - this - } - - def printPatterns(cases: List[Pattern], sep: String): Buffer = { - def printSeparated(list: List[Pattern]): Unit = list match { - case Nil => - case x :: Nil => printPattern(x) - case x :: xs => - printPattern(x) - this += sep - printSeparated(xs) - } - printSeparated(cases) - this - } - - def printTypeOrBoundsTrees(typesTrees: List[TypeOrBoundsTree], sep: String): Buffer = { - def printSeparated(list: List[TypeOrBoundsTree]): Unit = list match { - case Nil => - case x :: Nil => printTypeOrBoundsTree(x) - case x :: xs => - printTypeOrBoundsTree(x) - this += sep - printSeparated(xs) - } - printSeparated(typesTrees) - this - } - - def printTypesOrBounds(types: List[TypeOrBounds], sep: String): Buffer = { - def printSeparated(list: List[TypeOrBounds]): Unit = list match { - case Nil => - case x :: Nil => printTypeOrBound(x) - case x :: xs => - printTypeOrBound(x) - this += sep - printSeparated(xs) - } - printSeparated(types) - this - } - - def printTargsDefs(targs: List[TypeDef]): Unit = { - if (!targs.isEmpty) { - def printSeparated(list: List[TypeDef]): Unit = list match { - case Nil => - case x :: Nil => printTargDef(x) - case x :: xs => - printTargDef(x) - this += ", " - printSeparated(xs) - } - - inSquare(printSeparated(targs)) - } - } - - def printTargDef(arg: TypeDef, isMember: Boolean = false): Buffer = { - this += arg.name - arg.rhs match { - case IsTypeBoundsTree(rhs) => printBoundsTree(rhs) - case rhs @ SyntheticBounds() => - printTypeOrBound(rhs.tpe) - case rhs @ TypeTree.TypeLambdaTree(tparams, body) => - def printParam(t: TypeOrBoundsTree): Unit = t match { - case IsTypeBoundsTree(t) => printBoundsTree(t) - case IsTypeTree(t) => printTypeTree(t) - } - def printSeparated(list: List[TypeDef]): Unit = list match { - case Nil => - case x :: Nil => - this += x.name - printParam(x.rhs) - case x :: xs => - this += x.name - printParam(x.rhs) - this += ", " - printSeparated(xs) - } - inSquare(printSeparated(tparams)) - if (isMember) { - this += " = " - printTypeOrBoundsTree(body) - } - else this - case IsTypeTree(rhs) => - this += " = " - printTypeTree(rhs) - } - } - - def printArgsDefs(args: List[ValDef]): Unit = inParens { - args match { - case Nil => - case arg :: _ => - if (arg.symbol.flags.isErased) this += "erased " - if (arg.symbol.flags.isImplicit) this += "implicit " - } - - def printSeparated(list: List[ValDef]): Unit = list match { - case Nil => - case x :: Nil => printParamDef(x) - case x :: xs => - printParamDef(x) - this += ", " - printSeparated(xs) - } - - printSeparated(args) - } - - def printAnnotations(trees: List[Term]): Buffer = { - def printSeparated(list: List[Term]): Unit = list match { - case Nil => - case x :: Nil => printAnnotation(x) - case x :: xs => - printAnnotation(x) - this += " " - printSeparated(xs) - } - printSeparated(trees) - this - } - - def printParamDef(arg: ValDef): Unit = { - val name = arg.name - arg.symbol.owner match { - case IsDefSymbol(sym) if sym.name == "" => - val ClassDef(_, _, _, _, body) = sym.owner.asClass.tree - body.collectFirst { - case IsValDef(vdef @ ValDef(`name`, _, _)) if vdef.symbol.flags.isParamAccessor => - if (!vdef.symbol.flags.isLocal) { - var printedPrefix = false - if (vdef.symbol.flags.isOverride) { - this += "override " - printedPrefix = true - } - printedPrefix |= printProtectedOrPrivate(vdef) - if (vdef.symbol.flags.isMutable) this += highlightValDef("var ", color) - else if (printedPrefix || !vdef.symbol.flags.isCaseAcessor) this += highlightValDef("val ", color) - else this // val not explicitly needed - } - } - case _ => - } - - this += highlightValDef(name, color) += ": " - printTypeTree(arg.tpt) - } - - def printCaseDef(caseDef: CaseDef): Buffer = { - this += highlightValDef("case ", color) - printPattern(caseDef.pattern) - caseDef.guard match { - case Some(t) => - this += " if " - printTree(t) - case None => - } - this += highlightValDef(" =>", color) - indented { - caseDef.rhs match { - case Term.Block(stats, expr) => - printStats(stats, expr) - case body => - this += lineBreak() - printTree(body) - } - } - this - } - - def printPattern(pattern: Pattern): Buffer = pattern match { - case Pattern.Value(v) => - v match { - case Term.Ident("_") => this += "_" - case _ => printTree(v) - } - - case Pattern.Bind(name, Pattern.Value(Term.Ident("_"))) => - this += name - - case Pattern.Bind(name, Pattern.TypeTest(tpt)) => - this += highlightValDef(name, color) += ": " - printTypeTree(tpt) - - case Pattern.Bind(name, pattern) => - this += name += " @ " - printPattern(pattern) - - case Pattern.Unapply(fun, implicits, patterns) => - fun match { - case Term.Select(extractor, "unapply" | "unapplySeq", _) => printTree(extractor) - case Term.TypeApply(Term.Select(extractor, "unapply" | "unapplySeq", _), _) => printTree(extractor) - case _ => throw new MatchError(fun.show) - } - inParens(printPatterns(patterns, ", ")) - - case Pattern.Alternative(trees) => - inParens(printPatterns(trees, " | ")) - - case Pattern.TypeTest(tpt) => - this += "_: " - printTypeOrBoundsTree(tpt) - - case _ => - throw new MatchError(pattern.show) - - } - - def printConstant(const: Constant): Buffer = const match { - case Constant.Unit() => this += highlightLiteral("()", color) - case Constant.Null() => this += highlightLiteral("null", color) - case Constant.Boolean(v) => this += highlightLiteral(v.toString, color) - case Constant.Byte(v) => this += highlightLiteral(v.toString, color) - case Constant.Short(v) => this += highlightLiteral(v.toString, color) - case Constant.Int(v) => this += highlightLiteral(v.toString, color) - case Constant.Long(v) => this += highlightLiteral(v.toString + "L", color) - case Constant.Float(v) => this += highlightLiteral(v.toString + "f", color) - case Constant.Double(v) => this += highlightLiteral(v.toString, color) - case Constant.Char(v) => this += highlightString('\'' + escapedChar(v) + '\'', color) - case Constant.String(v) => this += highlightString('"' + escapedString(v) + '"', color) - case Constant.ClassTag(v) => - this += "classOf" - inSquare(printType(v)) - case Constant.Symbol(v) => - this += highlightLiteral("'" + v.name, color) - } - - def printTypeOrBoundsTree(tpt: TypeOrBoundsTree): Buffer = tpt match { - case TypeBoundsTree(lo, hi) => - this += "_ >: " - printTypeTree(lo) - this += " <: " - printTypeTree(hi) - case tpt @ SyntheticBounds() => - printTypeOrBound(tpt.tpe) - case IsTypeTree(tpt) => - printTypeTree(tpt) - } - - def printTypeTree(tree: TypeTree): Buffer = tree match { - case TypeTree.Synthetic() => - // TODO try to move this logic into `printType` - def printTypeAndAnnots(tpe: Type): Buffer = tpe match { - case Type.AnnotatedType(tp, annot) => - printTypeAndAnnots(tp) - this += " " - printAnnotation(annot) - case Type.SymRef(IsClassSymbol(sym), _) if sym.fullName == "scala.runtime.Null$" || sym.fullName == "scala.runtime.Nothing$" => - // scala.runtime.Null$ and scala.runtime.Nothing$ are not modules, those are their actual names - printType(tpe) - case tpe @ Type.SymRef(IsClassSymbol(sym), _) if sym.name.endsWith("$") => - printType(tpe) - this += ".type" - case tpe => printType(tpe) - } - printTypeAndAnnots(tree.tpe) - - case TypeTree.Ident(name) => - printType(tree.tpe) - - case TypeTree.Select(qual, name) => - printTree(qual) += "." += highlightTypeDef(name, color) - - case TypeTree.Project(qual, name) => - printTypeTree(qual) += "#" += highlightTypeDef(name, color) - - case TypeTree.Singleton(ref) => - printTree(ref) - ref match { - case Term.Literal(_) => this - case _ => this += ".type" - } - - case TypeTree.Refined(tpt, refinements) => - printTypeTree(tpt) - inBlock(printTrees(refinements, "; ")) - - case TypeTree.Applied(tpt, args) => - printTypeTree(tpt) - inSquare(printTypeOrBoundsTrees(args, ", ")) - - case TypeTree.Annotated(tpt, annot) => - val Annotation(ref, args) = annot - ref.tpe match { - case Types.RepeatedAnnotation() => - val Types.Sequence(tp) = tpt.tpe - printType(tp) - this += highlightTypeDef("*", color) - case _ => - printTypeTree(tpt) - this += " " - printAnnotation(annot) - } - - case TypeTree.And(left, right) => - printTypeTree(left) - this += highlightTypeDef(" & ", color) - printTypeTree(right) - - case TypeTree.Or(left, right) => - printTypeTree(left) - this += highlightTypeDef(" | ", color) - printTypeTree(right) - - case TypeTree.ByName(result) => - this += highlightTypeDef("=> ", color) - printTypeTree(result) - - case TypeTree.TypeLambdaTree(tparams, body) => - printTargsDefs(tparams) - this += highlightTypeDef(" => ", color) - printTypeOrBoundsTree(body) - - case TypeTree.Bind(name, _) => - this += highlightTypeDef(name, color) - - case TypeTree.Block(aliases, tpt) => - inBlock { - printTrees(aliases, lineBreak()) - printTypeTree(tpt) - } - - case _ => - throw new MatchError(tree.show) - - } - - def printTypeOrBound(tpe: TypeOrBounds): Buffer = tpe match { - case tpe@TypeBounds(lo, hi) => - this += "_ >: " - printType(lo) - this += " <: " - printType(hi) - case IsType(tpe) => printType(tpe) - } - - def printType(tpe: Type): Buffer = tpe match { - case Type.ConstantType(const) => - printConstant(const) - - case Type.SymRef(sym, prefix) => - prefix match { - case Types.EmptyPrefix() => - case IsType(prefix @ Type.SymRef(IsClassSymbol(_), _)) => - printType(prefix) - this += "#" - case IsType(prefix) => - if (!sym.flags.isLocal) { - printType(prefix) - this += "." - } - } - this += highlightTypeDef(sym.name.stripSuffix("$"), color) - - case Type.TermRef(name, prefix) => - prefix match { - case Type.ThisType(Types.EmptyPackage()) => - this += highlightTypeDef(name, color) - case IsType(prefix) => - printType(prefix) - if (name != "package") - this += "." += highlightTypeDef(name, color) - this - case NoPrefix() => - this += highlightTypeDef(name, color) - } - - case Type.TypeRef(name, prefix) => - prefix match { - case NoPrefix() | Type.ThisType(Types.EmptyPackage()) => - case IsType(prefix) => printType(prefix) += "." - } - if (name.endsWith("$")) this += highlightTypeDef(name.stripSuffix("$"), color) += ".type" - else this += highlightTypeDef(name, color) - - case tpe @ Type.Refinement(_, _, _) => - printRefinement(tpe) - - case Type.AppliedType(tp, args) => - tp match { - case Type.TypeRef("", Types.ScalaPackage()) => - this += "_*" - case _ => - printType(tp) - inSquare(printTypesOrBounds(args, ", ")) - } - - case Type.AnnotatedType(tp, annot) => - val Annotation(ref, args) = annot - printType(tp) - this += " " - printAnnotation(annot) - - case Type.AndType(left, right) => - printType(left) - this += highlightTypeDef(" & ", color) - printType(right) - - case Type.OrType(left, right) => - printType(left) - this += highlightTypeDef(" | ", color) - printType(right) - - case Type.ByNameType(tp) => - this += highlightTypeDef(" => ", color) - printType(tp) - - case Type.ThisType(tp) => - tp match { - case Type.SymRef(cdef, _) if !cdef.flags.isObject => - printFullClassName(tp) - this += highlightTypeDef(".this", color) - case Type.TypeRef(name, prefix) if name.endsWith("$") => - prefix match { - case Types.EmptyPrefix() => - case _ => - printTypeOrBound(prefix) - this += "." - } - this += highlightTypeDef(name.stripSuffix("$"), color) - case _ => - printType(tp) - } - - case Type.SuperType(thistpe, supertpe) => - printType(supertpe) - this += highlightTypeDef(".super", color) - - case Type.TypeLambda(paramNames, tparams, body) => - inSquare(printMethodicTypeParams(paramNames, tparams)) - this += highlightTypeDef(" => ", color) - printTypeOrBound(body) - - case Type.ParamRef(lambda, idx) => - lambda match { - case Type.MethodType(params, _, _) => this += params(idx) - case Type.PolyType(params, _, _) => this += params(idx) - case Type.TypeLambda(params, _, _) => this += params(idx) - } - - case Type.RecursiveType(tpe) => - printType(tpe) - - case Type.RecursiveThis(_) => - this += highlightTypeDef("this", color) - - case _ => - throw new MatchError(tpe.show) - } - - def printImportSelector(sel: ImportSelector): Buffer = sel match { - case SimpleSelector(Id(name)) => this += name - case OmitSelector(Id(name)) => this += name += " => _" - case RenameSelector(Id(name), Id(newName)) => this += name += " => " += newName - } - - def printDefinitionName(sym: Definition): Buffer = sym match { - case ValDef(name, _, _) => this += highlightValDef(name, color) - case DefDef(name, _, _, _, _) => this += highlightValDef(name, color) - case ClassDef(name, _, _, _, _) => this += highlightTypeDef(name.stripSuffix("$"), color) - case TypeDef(name, _) => this += highlightTypeDef(name, color) - case PackageDef(name, _) => this += highlightTypeDef(name, color) - } - - def printAnnotation(annot: Term): Buffer = { - val Annotation(ref, args) = annot - this += "@" - printTypeTree(ref) - inParens(printTrees(args, ", ")) - } - - def printDefAnnotations(definition: Definition): Buffer = { - val annots = definition.symbol.annots.filter { - case Annotation(annot, _) => - annot.tpe match { - case Type.TypeRef(_, Type.SymRef(sym, _)) if sym.fullName == "scala.annotation.internal" => false - case Type.TypeRef("forceInline", Types.ScalaPackage()) => false - case _ => true - } - case x => throw new MatchError(x.show) - } - printAnnotations(annots) - if (annots.nonEmpty) this += " " - else this - } - - def printRefinement(tpe: Type): Buffer = { - def printMethodicType(tp: TypeOrBounds): Unit = tp match { - case tp @ Type.MethodType(paramNames, params, res) => - inParens(printMethodicTypeParams(paramNames, params)) - printMethodicType(res) - case tp @ Type.TypeLambda(paramNames, params, res) => - inSquare(printMethodicTypeParams(paramNames, params)) - printMethodicType(res) - case Type.ByNameType(t) => - this += ": " - printType(t) - case IsType(tp) => - this += ": " - printType(tp) - } - def rec(tp: Type): Unit = tp match { - case Type.Refinement(parent, name, info) => - rec(parent) - indented { - this += lineBreak() - info match { - case IsTypeBounds(info) => - this += highlightKeyword("type ", color) += highlightTypeDef(name, color) - printBounds(info) - case Type.ByNameType(_) | Type.MethodType(_, _, _) | Type.TypeLambda(_, _, _) => - this += highlightKeyword("def ", color) += highlightTypeDef(name, color) - printMethodicType(info) - case IsType(info) => - this += highlightKeyword("val ", color) += highlightValDef(name, color) - printMethodicType(info) - } - } - case tp => - printType(tp) - this += " {" - } - rec(tpe) - this += lineBreak() += "}" - } - - def printMethodicTypeParams(paramNames: List[String], params: List[TypeOrBounds]): Unit = { - def printInfo(info: TypeOrBounds) = info match { - case IsTypeBounds(info) => printBounds(info) - case IsType(info) => - this += ": " - printType(info) - } - def printSeparated(list: List[(String, TypeOrBounds)]): Unit = list match { - case Nil => - case (name, info) :: Nil => - this += name - printInfo(info) - case (name, info) :: xs => - this += name - printInfo(info) - this += ", " - printSeparated(xs) - } - printSeparated(paramNames.zip(params)) - } - - def printBoundsTree(bounds: TypeBoundsTree): Buffer = { - bounds.low match { - case TypeTree.Synthetic() => - case low => - this += " >: " - printTypeTree(low) - } - bounds.hi match { - case TypeTree.Synthetic() => this - case hi => - this += " <: " - printTypeTree(hi) - } - } - - def printBounds(bounds: TypeBounds): Buffer = { - this += " >: " - printType(bounds.low) - this += " <: " - printType(bounds.hi) - } - - def printProtectedOrPrivate(definition: Definition): Boolean = { - var prefixWasPrinted = false - def printWithin(within: Type) = within match { - case Type.SymRef(sym, _) => - this += sym.name - case _ => printFullClassName(within) - } - if (definition.symbol.flags.isProtected) { - this += highlightKeyword("protected", color) - definition.symbol.protectedWithin match { - case Some(within) => - inSquare(printWithin(within)) - case _ => - } - prefixWasPrinted = true - } else { - definition.symbol.privateWithin match { - case Some(within) => - this += highlightKeyword("private", color) - inSquare(printWithin(within)) - prefixWasPrinted = true - case _ => - } - } - if (prefixWasPrinted) - this += " " - prefixWasPrinted - } - - def printFullClassName(tp: TypeOrBounds): Unit = { - def printClassPrefix(prefix: TypeOrBounds): Unit = prefix match { - case Type.SymRef(IsClassSymbol(sym), prefix2) => - printClassPrefix(prefix2) - this += sym.name += "." - case _ => - } - val Type.SymRef(sym, prefix) = tp - printClassPrefix(prefix) - this += sym.name - } - - def +=(x: Boolean): this.type = { sb.append(x); this } - def +=(x: Byte): this.type = { sb.append(x); this } - def +=(x: Short): this.type = { sb.append(x); this } - def +=(x: Int): this.type = { sb.append(x); this } - def +=(x: Long): this.type = { sb.append(x); this } - def +=(x: Float): this.type = { sb.append(x); this } - def +=(x: Double): this.type = { sb.append(x); this } - def +=(x: Char): this.type = { sb.append(x); this } - def +=(x: String): this.type = { sb.append(x); this } - - private def escapedChar(ch: Char): String = (ch: @switch) match { - case '\b' => "\\b" - case '\t' => "\\t" - case '\n' => "\\n" - case '\f' => "\\f" - case '\r' => "\\r" - case '"' => "\\\"" - case '\'' => "\\\'" - case '\\' => "\\\\" - case _ => if (ch.isControl) "\\0" + Integer.toOctalString(ch) else String.valueOf(ch) - } - - private def escapedString(str: String): String = str flatMap escapedChar - } - - private object SpecialOp { - def unapply(arg: Tree)(implicit ctx: Context): Option[(String, List[Term])] = arg match { - case IsTerm(arg @ Term.Apply(fn, args)) => - fn.tpe match { - case Type.SymRef(IsDefSymbol(sym), Type.ThisType(Type.SymRef(sym2, _))) if sym2.name == "" => - Some((sym.tree.name, args)) - case _ => None - } - case _ => None - } - } - - private object Annotation { - def unapply(arg: Tree)(implicit ctx: Context): Option[(TypeTree, List[Term])] = arg match { - case Term.New(annot) => Some((annot, Nil)) - case Term.Apply(Term.Select(Term.New(annot), "", _), args) => Some((annot, args)) - case Term.Apply(Term.TypeApply(Term.Select(Term.New(annot), "", _), targs), args) => Some((annot, args)) - case _ => None - } - } - - // TODO Provide some of these in scala.tasty.Reflect.scala and implement them using checks on symbols for performance - private object Types { - - object JavaLangObject { - def unapply(tpe: Type)(implicit ctx: Context): Boolean = tpe match { - case Type.TypeRef("Object", Type.SymRef(sym, _)) if sym.fullName == "java.lang" => true - case _ => false - } - } - - object Sequence { - def unapply(tpe: Type)(implicit ctx: Context): Option[Type] = tpe match { - case Type.AppliedType(Type.TypeRef("Seq", Type.SymRef(sym, _)), IsType(tp) :: Nil) if sym.fullName == "scala.collection" => Some(tp) - case _ => None - } - } - - object RepeatedAnnotation { - def unapply(tpe: Type)(implicit ctx: Context): Boolean = tpe match { - case Type.TypeRef("Repeated", Type.SymRef(sym, _)) if sym.fullName == "scala.annotation.internal" => true - case _ => false - } - } - - object Repeated { - def unapply(tpe: Type)(implicit ctx: Context): Option[Type] = tpe match { - case Type.AppliedType(Type.TypeRef("", ScalaPackage()), IsType(tp) :: Nil) => Some(tp) - case _ => None - } - } - - object ScalaPackage { - def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { - case Type.SymRef(sym, _) => sym == definitions.ScalaPackage - case _ => false - } - } - - object RootPackage { - def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { - case Type.SymRef(sym, _) => sym.fullName == "" // TODO use Symbol.== - case _ => false - } - } - - object EmptyPackage { - def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { - case Type.SymRef(sym, _) => sym.fullName == "" - case _ => false - } - } - - object EmptyPrefix { - def unapply(tpe: TypeOrBounds)(implicit ctx: Context): Boolean = tpe match { - case NoPrefix() | Type.ThisType(Types.EmptyPackage() | Types.RootPackage()) => true - case _ => false - } - } - } - - object PackageObject { - def unapply(tree: Tree)(implicit ctx: Context): Option[Tree] = tree match { - case PackageClause(_, ValDef("package", _, _) :: body :: Nil) => Some(body) - case _ => None - } - } - -} diff --git a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala index 131551c0a589..5fc54f5c09c0 100644 --- a/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala +++ b/tests/run-separate-compilation/tasty-custom-show/quoted_1.scala @@ -1,7 +1,6 @@ import scala.quoted._ import scala.tasty.Reflection -import scala.tasty.util.Printer object Macros { @@ -16,7 +15,7 @@ object Macros { val output = new TreeTraverser { override def traverseTree(tree: Tree)(implicit ctx: Context): Unit = { // Use custom Show[_] here - val printer = new DummyShow(reflect) + val printer = dummyShow tree match { case IsDefinition(tree @ DefDef(name, _, _, _, _)) => buff.append(name) @@ -39,15 +38,17 @@ object Macros { '(print(~buff.result().toExpr)) } -} + def dummyShow(implicit reflect: Reflection): reflect.Printer = { + import reflect._ + new Printer { + def showTree(tree: Tree)(implicit ctx: Context): String = "Tree" + def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = "CaseDef" + def showPattern(pattern: Pattern)(implicit ctx: Context): String = "Pattern" + def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String = "TypeOrBoundsTree" + def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String = "TypeOrBounds" + def showConstant(const: Constant)(implicit ctx: Context): String = "Constant" + def showSymbol(symbol: Symbol)(implicit ctx: Context): String = "Symbol" + } + } -class DummyShow[R <: Reflection with Singleton](reflect0: R) extends Printer[R](reflect0) { - import reflect._ - def showTree(tree: Tree)(implicit ctx: Context): String = "Tree" - def showCaseDef(caseDef: CaseDef)(implicit ctx: Context): String = "CaseDef" - def showPattern(pattern: Pattern)(implicit ctx: Context): String = "Pattern" - def showTypeOrBoundsTree(tpt: TypeOrBoundsTree)(implicit ctx: Context): String = "TypeOrBoundsTree" - def showTypeOrBounds(tpe: TypeOrBounds)(implicit ctx: Context): String = "TypeOrBounds" - def showConstant(const: Constant)(implicit ctx: Context): String = "Constant" - def showSymbol(symbol: Symbol)(implicit ctx: Context): String = "Symbol" } From 030adb46d450d21878374d0cfe9f006e83f93950 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 8 Nov 2018 13:19:03 +0000 Subject: [PATCH 6/6] Rename ReflectionCore to Core --- compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala | 2 +- .../src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala | 2 +- .../tastyreflect/{ReflectionCoreImpl.scala => CoreImpl.scala} | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala | 2 +- .../dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala | 2 +- .../src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala | 2 +- .../src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala | 2 +- .../src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala | 2 +- compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala | 2 +- .../src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala | 2 +- .../tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala | 2 +- library/src/scala/tasty/Reflection.scala | 2 +- library/src/scala/tasty/reflect/CaseDefOps.scala | 2 +- library/src/scala/tasty/reflect/ConstantOps.scala | 2 +- library/src/scala/tasty/reflect/ContextOps.scala | 2 +- .../scala/tasty/reflect/{ReflectionCore.scala => Core.scala} | 2 +- library/src/scala/tasty/reflect/IdOps.scala | 2 +- library/src/scala/tasty/reflect/ImportSelectorOps.scala | 2 +- library/src/scala/tasty/reflect/PatternOps.scala | 2 +- library/src/scala/tasty/reflect/PositionOps.scala | 2 +- library/src/scala/tasty/reflect/Printers.scala | 2 +- library/src/scala/tasty/reflect/QuotedOps.scala | 2 +- library/src/scala/tasty/reflect/SettingsOps.scala | 2 +- library/src/scala/tasty/reflect/SignatureOps.scala | 2 +- library/src/scala/tasty/reflect/StandardDefinitions.scala | 2 +- library/src/scala/tasty/reflect/SymbolOps.scala | 2 +- library/src/scala/tasty/reflect/TreeOps.scala | 2 +- library/src/scala/tasty/reflect/TreeUtils.scala | 2 +- library/src/scala/tasty/reflect/TypeOrBoundsOps.scala | 2 +- library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala | 2 +- 36 files changed, 36 insertions(+), 36 deletions(-) rename compiler/src/dotty/tools/dotc/tastyreflect/{ReflectionCoreImpl.scala => CoreImpl.scala} (96%) rename library/src/scala/tasty/reflect/{ReflectionCore.scala => Core.scala} (99%) diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala index ac0b57077585..8c643cafc11b 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala @@ -1,7 +1,7 @@ package dotty.tools.dotc.tastyreflect -trait CaseDefOpsImpl extends scala.tasty.reflect.CaseDefOps with ReflectionCoreImpl with Helpers { +trait CaseDefOpsImpl extends scala.tasty.reflect.CaseDefOps with CoreImpl with Helpers { def CaseDefDeco(caseDef: CaseDef): CaseDefAPI = new CaseDefAPI { def pattern(implicit ctx: Context): Pattern = caseDef.pat diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala index bd5f86a569f2..8c606f47df85 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala @@ -3,7 +3,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.core.Constants -trait ConstantOpsImpl extends scala.tasty.reflect.ConstantOps with ReflectionCoreImpl { +trait ConstantOpsImpl extends scala.tasty.reflect.ConstantOps with CoreImpl { def ConstantDeco(const: Constant): ConstantAPI = new ConstantAPI { def value: Any = const.value diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala index ea9c359de01c..ef65bb4d9671 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.util.{Positions, SourcePosition} -trait ContextOpsImpl extends scala.tasty.reflect.ContextOps with ReflectionCoreImpl { +trait ContextOpsImpl extends scala.tasty.reflect.ContextOps with CoreImpl { val rootContext: Context diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionCoreImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/CoreImpl.scala similarity index 96% rename from compiler/src/dotty/tools/dotc/tastyreflect/ReflectionCoreImpl.scala rename to compiler/src/dotty/tools/dotc/tastyreflect/CoreImpl.scala index cc20918b27d8..ed6d930db227 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionCoreImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/CoreImpl.scala @@ -5,7 +5,7 @@ import dotty.tools.dotc.ast.{tpd, untpd} import dotty.tools.dotc.core.Constants import dotty.tools.dotc.core.Types -trait ReflectionCoreImpl extends scala.tasty.reflect.ReflectionCore { +trait CoreImpl extends scala.tasty.reflect.Core { type Context = core.Contexts.Context diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala index 994d22203957..e45e967305c2 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.core.Decorators._ -trait IdOpsImpl extends scala.tasty.reflect.IdOps with ReflectionCoreImpl { +trait IdOpsImpl extends scala.tasty.reflect.IdOps with CoreImpl { def IdDeco(id: Id): IdAPI = new IdAPI { def pos(implicit ctx: Context): Position = id.pos diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala index 0d2e9a32bc46..903ca1ebc509 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ImportSelectorOpsImpl.scala @@ -3,7 +3,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.ast.{Trees, untpd} import dotty.tools.dotc.core.StdNames.nme -trait ImportSelectorOpsImpl extends scala.tasty.reflect.ImportSelectorOps with ReflectionCoreImpl { +trait ImportSelectorOpsImpl extends scala.tasty.reflect.ImportSelectorOps with CoreImpl { object SimpleSelector extends SimpleSelectorExtractor { def unapply(x: ImportSelector)(implicit ctx: Context): Option[Id] = x match { diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala index 6de65588bb19..f1a41f34c036 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala @@ -3,7 +3,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.ast.{Trees, tpd} import dotty.tools.dotc.core.Decorators._ -trait PatternOpsImpl extends scala.tasty.reflect.PatternOps with ReflectionCoreImpl { +trait PatternOpsImpl extends scala.tasty.reflect.PatternOps with CoreImpl { // ----- Patterns ------------------------------------------------- diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala index 05f4ca2bb5f4..5fce3371dfa4 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PositionOpsImpl.scala @@ -1,6 +1,6 @@ package dotty.tools.dotc.tastyreflect -trait PositionOpsImpl extends scala.tasty.reflect.PositionOps with ReflectionCoreImpl { +trait PositionOpsImpl extends scala.tasty.reflect.PositionOps with CoreImpl { def PositionDeco(pos: Position): PositionAPI = new PositionAPI { def start: Int = pos.start diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala index 2dff5f2613e8..9f114c2f6b34 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/PrintersImpl.scala @@ -1,6 +1,6 @@ package dotty.tools.dotc.tastyreflect -trait PrintersImpl extends scala.tasty.reflect.Printers with scala.tasty.reflect.ReflectionCore { reflect: ReflectionImpl => +trait PrintersImpl extends scala.tasty.reflect.Printers with scala.tasty.reflect.Core { reflect: ReflectionImpl => def showExtractors: reflect.Printer = new reflect.ExtractorsPrinter diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala index 7fd0642ced89..a4c1b76d2ee8 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/QuotedOpsImpl.scala @@ -5,7 +5,7 @@ import dotty.tools.dotc.core.quoted.PickledQuotes import dotty.tools.dotc.reporting.Reporter import dotty.tools.dotc.reporting.diagnostic.MessageContainer -trait QuotedOpsImpl extends scala.tasty.reflect.QuotedOps with ReflectionCoreImpl { +trait QuotedOpsImpl extends scala.tasty.reflect.QuotedOps with CoreImpl { def QuotedExprDeco[T](x: scala.quoted.Expr[T]): QuotedExprAPI = new QuotedExprAPI { def reflect(implicit ctx: Context): Term = PickledQuotes.quotedExprToTree(x) diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala index 3a84154331fd..0f50b2e0e7b1 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/ReflectionImpl.scala @@ -4,7 +4,7 @@ import dotty.tools.dotc.core._ class ReflectionImpl(val rootContext: Contexts.Context) extends scala.tasty.Reflection - with ReflectionCoreImpl + with CoreImpl with CaseDefOpsImpl with ConstantOpsImpl with ContextOpsImpl diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala index c6daa5e64dac..9847660aebad 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/SettingsOpsImpl.scala @@ -1,6 +1,6 @@ package dotty.tools.dotc.tastyreflect -trait SettingsOpsImpl extends scala.tasty.reflect.SettingsOps with scala.tasty.reflect.ContextOps with ReflectionCoreImpl { +trait SettingsOpsImpl extends scala.tasty.reflect.SettingsOps with scala.tasty.reflect.ContextOps with CoreImpl { def settings: Settings = rootContext.settings diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala index 45e93d2e48f5..1fcbdd720148 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/SignatureOpsImpl.scala @@ -1,6 +1,6 @@ package dotty.tools.dotc.tastyreflect -trait SignatureOpsImpl extends scala.tasty.reflect.SignatureOps with ReflectionCoreImpl { +trait SignatureOpsImpl extends scala.tasty.reflect.SignatureOps with CoreImpl { object Signature extends SignatureExtractor { def unapply(x: Signature)(implicit ctx: Context): Option[(List[String], String)] = { diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala index 057a34289250..61c6c92eef6c 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/SymbolOpsImpl.scala @@ -4,7 +4,7 @@ package tastyreflect import dotty.tools.dotc.core.Flags import dotty.tools.dotc.core.Symbols._ -trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with ReflectionCoreImpl { +trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with CoreImpl { def SymbolDeco(symbol: Symbol): SymbolAPI = new SymbolAPI { diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala index 0e6cf00c758d..e90ff36cca4c 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala @@ -6,7 +6,7 @@ import dotty.tools.dotc.core.Decorators._ import dotty.tools.dotc.core._ import dotty.tools.dotc.tastyreflect.FromSymbol.{definitionFromSym, packageDefFromSym} -trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with ReflectionCoreImpl with Helpers { +trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers { def TreeDeco(tree: Tree): TreeAPI = new TreeAPI { def pos(implicit ctx: Context): Position = tree.pos diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala index 936156c87656..2c7a5cad1b6a 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsOpsImpl.scala @@ -2,7 +2,7 @@ package dotty.tools.dotc.tastyreflect import dotty.tools.dotc.core.{Names, Types} -trait TypeOrBoundsOpsImpl extends scala.tasty.reflect.TypeOrBoundsOps with ReflectionCoreImpl { +trait TypeOrBoundsOpsImpl extends scala.tasty.reflect.TypeOrBoundsOps with CoreImpl { // ===== Types ==================================================== diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala index 089f608809aa..0302ddc3e566 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TypeOrBoundsTreesOpsImpl.scala @@ -6,7 +6,7 @@ import dotty.tools.dotc.core.StdNames.nme import dotty.tools.dotc.core.Types -trait TypeOrBoundsTreesOpsImpl extends scala.tasty.reflect.TypeOrBoundsTreeOps with ReflectionCoreImpl { +trait TypeOrBoundsTreesOpsImpl extends scala.tasty.reflect.TypeOrBoundsTreeOps with CoreImpl { // ----- TypeOrBoundsTree ------------------------------------------------ diff --git a/library/src/scala/tasty/Reflection.scala b/library/src/scala/tasty/Reflection.scala index 48532b69d3ba..e955e0d6f803 100644 --- a/library/src/scala/tasty/Reflection.scala +++ b/library/src/scala/tasty/Reflection.scala @@ -3,7 +3,7 @@ package scala.tasty import scala.tasty.reflect._ abstract class Reflection - extends ReflectionCore + extends Core with CaseDefOps with ConstantOps with ContextOps diff --git a/library/src/scala/tasty/reflect/CaseDefOps.scala b/library/src/scala/tasty/reflect/CaseDefOps.scala index 3cb629d56799..37732ff941a2 100644 --- a/library/src/scala/tasty/reflect/CaseDefOps.scala +++ b/library/src/scala/tasty/reflect/CaseDefOps.scala @@ -2,7 +2,7 @@ package scala.tasty package reflect /** Tasty reflect case definition */ -trait CaseDefOps extends ReflectionCore { +trait CaseDefOps extends Core { trait CaseDefAPI { def pattern(implicit ctx: Context): Pattern diff --git a/library/src/scala/tasty/reflect/ConstantOps.scala b/library/src/scala/tasty/reflect/ConstantOps.scala index d1da1a1614c9..3a85f904261b 100644 --- a/library/src/scala/tasty/reflect/ConstantOps.scala +++ b/library/src/scala/tasty/reflect/ConstantOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait ConstantOps extends ReflectionCore { +trait ConstantOps extends Core { trait ConstantAPI { def value: Any diff --git a/library/src/scala/tasty/reflect/ContextOps.scala b/library/src/scala/tasty/reflect/ContextOps.scala index de5c95366c9b..44fcf77aadcd 100644 --- a/library/src/scala/tasty/reflect/ContextOps.scala +++ b/library/src/scala/tasty/reflect/ContextOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait ContextOps extends ReflectionCore { +trait ContextOps extends Core { trait ContextAPI { def owner: Symbol diff --git a/library/src/scala/tasty/reflect/ReflectionCore.scala b/library/src/scala/tasty/reflect/Core.scala similarity index 99% rename from library/src/scala/tasty/reflect/ReflectionCore.scala rename to library/src/scala/tasty/reflect/Core.scala index f9c18eed6d9e..93cc7bbeaf67 100644 --- a/library/src/scala/tasty/reflect/ReflectionCore.scala +++ b/library/src/scala/tasty/reflect/Core.scala @@ -109,7 +109,7 @@ package scala.tasty.reflect * * ``` */ -trait ReflectionCore { +trait Core { /** Compilation context */ type Context diff --git a/library/src/scala/tasty/reflect/IdOps.scala b/library/src/scala/tasty/reflect/IdOps.scala index 8c2fe62c51ea..bcfe095fd701 100644 --- a/library/src/scala/tasty/reflect/IdOps.scala +++ b/library/src/scala/tasty/reflect/IdOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait IdOps extends ReflectionCore { +trait IdOps extends Core { trait IdAPI { def pos(implicit ctx: Context): Position diff --git a/library/src/scala/tasty/reflect/ImportSelectorOps.scala b/library/src/scala/tasty/reflect/ImportSelectorOps.scala index 3dc33e785095..66cca31be2bb 100644 --- a/library/src/scala/tasty/reflect/ImportSelectorOps.scala +++ b/library/src/scala/tasty/reflect/ImportSelectorOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait ImportSelectorOps extends ReflectionCore { +trait ImportSelectorOps extends Core { val SimpleSelector: SimpleSelectorExtractor abstract class SimpleSelectorExtractor { diff --git a/library/src/scala/tasty/reflect/PatternOps.scala b/library/src/scala/tasty/reflect/PatternOps.scala index 302355b0b855..ede392d9bc15 100644 --- a/library/src/scala/tasty/reflect/PatternOps.scala +++ b/library/src/scala/tasty/reflect/PatternOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait PatternOps extends ReflectionCore { +trait PatternOps extends Core { trait PatternAPI { def tpe(implicit ctx: Context): Type diff --git a/library/src/scala/tasty/reflect/PositionOps.scala b/library/src/scala/tasty/reflect/PositionOps.scala index 077a22312dd0..c8a2dd1a82cd 100644 --- a/library/src/scala/tasty/reflect/PositionOps.scala +++ b/library/src/scala/tasty/reflect/PositionOps.scala @@ -1,6 +1,6 @@ package scala.tasty.reflect -trait PositionOps extends ReflectionCore { +trait PositionOps extends Core { trait PositionAPI { def start: Int diff --git a/library/src/scala/tasty/reflect/Printers.scala b/library/src/scala/tasty/reflect/Printers.scala index 66f3d936e14d..f9442ffdffbf 100644 --- a/library/src/scala/tasty/reflect/Printers.scala +++ b/library/src/scala/tasty/reflect/Printers.scala @@ -7,7 +7,7 @@ import scala.tasty.util.SyntaxHighlightUtils._ import scala.tasty.util.Chars trait Printers - extends ReflectionCore + extends Core with CaseDefOps with ConstantOps with IdOps diff --git a/library/src/scala/tasty/reflect/QuotedOps.scala b/library/src/scala/tasty/reflect/QuotedOps.scala index 5f6fd1b0b68f..79be80952cef 100644 --- a/library/src/scala/tasty/reflect/QuotedOps.scala +++ b/library/src/scala/tasty/reflect/QuotedOps.scala @@ -1,7 +1,7 @@ package scala.tasty.reflect /** Extension methods on scala.quoted.{Expr|Type} to convert to scala.tasty.Tasty objects */ -trait QuotedOps extends ReflectionCore { +trait QuotedOps extends Core { trait QuotedExprAPI { /** View this expression `Expr[T]` as a `Term` */ diff --git a/library/src/scala/tasty/reflect/SettingsOps.scala b/library/src/scala/tasty/reflect/SettingsOps.scala index 746df22d8fff..002072feaa46 100644 --- a/library/src/scala/tasty/reflect/SettingsOps.scala +++ b/library/src/scala/tasty/reflect/SettingsOps.scala @@ -1,6 +1,6 @@ package scala.tasty.reflect -trait SettingsOps extends ReflectionCore { +trait SettingsOps extends Core { /** Compiler settings */ def settings: Settings diff --git a/library/src/scala/tasty/reflect/SignatureOps.scala b/library/src/scala/tasty/reflect/SignatureOps.scala index 7ee34e213cb3..d06047775094 100644 --- a/library/src/scala/tasty/reflect/SignatureOps.scala +++ b/library/src/scala/tasty/reflect/SignatureOps.scala @@ -1,6 +1,6 @@ package scala.tasty.reflect -trait SignatureOps extends ReflectionCore { +trait SignatureOps extends Core { val Signature: SignatureExtractor abstract class SignatureExtractor { diff --git a/library/src/scala/tasty/reflect/StandardDefinitions.scala b/library/src/scala/tasty/reflect/StandardDefinitions.scala index cb713f27114c..358762497b81 100644 --- a/library/src/scala/tasty/reflect/StandardDefinitions.scala +++ b/library/src/scala/tasty/reflect/StandardDefinitions.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait StandardDefinitions extends ReflectionCore { +trait StandardDefinitions extends Core { /** A value containing all standard definitions in [[DefinitionsApi]] * @group Definitions diff --git a/library/src/scala/tasty/reflect/SymbolOps.scala b/library/src/scala/tasty/reflect/SymbolOps.scala index 9193378298c5..6cca7a17a208 100644 --- a/library/src/scala/tasty/reflect/SymbolOps.scala +++ b/library/src/scala/tasty/reflect/SymbolOps.scala @@ -2,7 +2,7 @@ package scala.tasty package reflect /** Tasty reflect symbol */ -trait SymbolOps extends ReflectionCore { +trait SymbolOps extends Core { // Symbol diff --git a/library/src/scala/tasty/reflect/TreeOps.scala b/library/src/scala/tasty/reflect/TreeOps.scala index 4389a5aa00b1..471d9bdd3d7d 100644 --- a/library/src/scala/tasty/reflect/TreeOps.scala +++ b/library/src/scala/tasty/reflect/TreeOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait TreeOps extends ReflectionCore { +trait TreeOps extends Core { trait TreeAPI { def pos(implicit ctx: Context): Position diff --git a/library/src/scala/tasty/reflect/TreeUtils.scala b/library/src/scala/tasty/reflect/TreeUtils.scala index acf9e4fbd2c9..74709fa4e356 100644 --- a/library/src/scala/tasty/reflect/TreeUtils.scala +++ b/library/src/scala/tasty/reflect/TreeUtils.scala @@ -3,7 +3,7 @@ package reflect /** Tasty reflect case definition */ trait TreeUtils - extends ReflectionCore + extends Core with CaseDefOps with PatternOps with SymbolOps diff --git a/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala b/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala index 245b1c5c8c2b..1942c99eeb97 100644 --- a/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala +++ b/library/src/scala/tasty/reflect/TypeOrBoundsOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait TypeOrBoundsOps extends ReflectionCore { +trait TypeOrBoundsOps extends Core { // ----- Types ---------------------------------------------------- diff --git a/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala b/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala index 726d7f9024a5..6851f455d38e 100644 --- a/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala +++ b/library/src/scala/tasty/reflect/TypeOrBoundsTreeOps.scala @@ -1,7 +1,7 @@ package scala.tasty package reflect -trait TypeOrBoundsTreeOps extends ReflectionCore { +trait TypeOrBoundsTreeOps extends Core { trait TypeOrBoundsTreeAPI { def tpe(implicit ctx: Context): TypeOrBounds