From 72c74ade513f275e29434f93731daeb1183fab14 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 13 Aug 2020 13:50:31 +0200 Subject: [PATCH 1/2] Move quoted `null` and `()` encoding to internal These are opimizations for `'{}`/`'{()}` and `'{null}` which should not be used directly --- .../src/dotty/tools/dotc/core/Definitions.scala | 4 ++-- .../dotty/tools/dotc/transform/ReifyQuotes.scala | 4 ++-- library/src-bootstrapped/scala/quoted/Expr.scala | 12 ------------ library/src/scala/internal/quoted/Expr.scala | 13 +++++++++++++ staging/src/scala/quoted/staging/staging.scala | 2 +- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala index 1809a6042613..e0f66892b6be 100644 --- a/compiler/src/dotty/tools/dotc/core/Definitions.scala +++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala @@ -685,8 +685,6 @@ class Definitions { @tu lazy val QuotedExprClass: ClassSymbol = requiredClass("scala.quoted.Expr") @tu lazy val QuotedExprModule: Symbol = QuotedExprClass.companionModule - @tu lazy val QuotedExprModule_nullExpr: Symbol = QuotedExprModule.requiredMethod(nme.nullExpr) - @tu lazy val QuotedExprModule_unitExpr: Symbol = QuotedExprModule.requiredMethod(nme.unitExpr) @tu lazy val QuoteContextClass: ClassSymbol = requiredClass("scala.quoted.QuoteContext") @@ -716,6 +714,8 @@ class Definitions { @tu lazy val InternalQuotedExprModule: Symbol = requiredModule("scala.internal.quoted.Expr") @tu lazy val InternalQuotedExpr_unapply: Symbol = InternalQuotedExprModule.requiredMethod(nme.unapply) + @tu lazy val InternalQuotedExpr_nullExpr: Symbol = InternalQuotedExprModule.requiredMethod(nme.nullExpr) + @tu lazy val InternalQuotedExpr_unitExpr: Symbol = InternalQuotedExprModule.requiredMethod(nme.unitExpr) @tu lazy val InternalQuotedTypeModule: Symbol = requiredModule("scala.internal.quoted.Type") @tu lazy val InternalQuotedType_unapply: Symbol = InternalQuotedTypeModule.requiredMethod(nme.unapply) diff --git a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala index 1518492e6b1d..38401588a3a5 100644 --- a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala +++ b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala @@ -150,8 +150,8 @@ class ReifyQuotes extends MacroTransform { def liftedValue(lifter: Symbol) = ref(lifter).appliedToType(originalTp).select(nme.toExpr).appliedTo(lit) lit.const.tag match { - case Constants.NullTag => ref(defn.QuotedExprModule_nullExpr) - case Constants.UnitTag => ref(defn.QuotedExprModule_unitExpr) + case Constants.NullTag => ref(defn.InternalQuotedExpr_nullExpr) + case Constants.UnitTag => ref(defn.InternalQuotedExpr_unitExpr) case Constants.BooleanTag => liftedValue(defn.LiftableModule_BooleanIsLiftable) case Constants.ByteTag => liftedValue(defn.LiftableModule_ByteIsLiftable) case Constants.ShortTag => liftedValue(defn.LiftableModule_ShortIsLiftable) diff --git a/library/src-bootstrapped/scala/quoted/Expr.scala b/library/src-bootstrapped/scala/quoted/Expr.scala index ddf9829ce5e4..832e272a5152 100644 --- a/library/src-bootstrapped/scala/quoted/Expr.scala +++ b/library/src-bootstrapped/scala/quoted/Expr.scala @@ -79,18 +79,6 @@ object Expr { case Some(expr1) => expr1.seal.asInstanceOf[Expr[T]] case _ => expr - /** Returns a null expresssion equivalent to `'{null}` */ - def nullExpr: QuoteContext ?=> Expr[Null] = qctx ?=> { - import qctx.tasty._ - Literal(Constant(null)).seal.asInstanceOf[Expr[Null]] - } - - /** Returns a unit expresssion equivalent to `'{}` or `'{()}` */ - def unitExpr: QuoteContext ?=> Expr[Unit] = qctx ?=> { - import qctx.tasty._ - Literal(Constant(())).seal.asInstanceOf[Expr[Unit]] - } - /** Returns an expression containing a block with the given statements and ending with the expresion * Given list of statements `s1 :: s2 :: ... :: Nil` and an expression `e` the resulting expression * will be equivalent to `'{ $s1; $s2; ...; $e }`. diff --git a/library/src/scala/internal/quoted/Expr.scala b/library/src/scala/internal/quoted/Expr.scala index 3180dca1289a..a9079bfb5c17 100644 --- a/library/src/scala/internal/quoted/Expr.scala +++ b/library/src/scala/internal/quoted/Expr.scala @@ -55,4 +55,17 @@ object Expr { new Matcher.QuoteMatcher[qctx.type].termMatch(scrutineeExpr.unseal, patternExpr.unseal, hasTypeSplices).asInstanceOf[Option[Tup]] } + + /** Returns a null expresssion equivalent to `'{null}` */ + def nullExpr: QuoteContext ?=> quoted.Expr[Null] = qctx ?=> { + import qctx.tasty._ + Literal(Constant(null)).seal.asInstanceOf[quoted.Expr[Null]] + } + + /** Returns a unit expresssion equivalent to `'{}` or `'{()}` */ + def unitExpr: QuoteContext ?=> quoted.Expr[Unit] = qctx ?=> { + import qctx.tasty._ + Literal(Constant(())).seal.asInstanceOf[quoted.Expr[Unit]] + } + } diff --git a/staging/src/scala/quoted/staging/staging.scala b/staging/src/scala/quoted/staging/staging.scala index db9aab9e5b38..a4be3ca9c783 100644 --- a/staging/src/scala/quoted/staging/staging.scala +++ b/staging/src/scala/quoted/staging/staging.scala @@ -37,7 +37,7 @@ package object staging: var result: T = noResult.asInstanceOf[T] def dummyRun(using QuoteContext): Expr[Unit] = { result = thunk - Expr.unitExpr + '{} } toolbox.run(dummyRun(using _)) assert(result != noResult) // toolbox.run should have thrown an exception From 566bdf5924963eb9db3ce1d612a69799c645c6ff Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 13 Aug 2020 13:56:06 +0200 Subject: [PATCH 2/2] Rename methods to remove unnecessary names in StdNames --- compiler/src/dotty/tools/dotc/core/Definitions.scala | 4 ++-- compiler/src/dotty/tools/dotc/core/StdNames.scala | 2 -- compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala | 4 ++-- library/src/scala/internal/quoted/Expr.scala | 5 ++--- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/core/Definitions.scala b/compiler/src/dotty/tools/dotc/core/Definitions.scala index e0f66892b6be..a8004c8230bb 100644 --- a/compiler/src/dotty/tools/dotc/core/Definitions.scala +++ b/compiler/src/dotty/tools/dotc/core/Definitions.scala @@ -714,8 +714,8 @@ class Definitions { @tu lazy val InternalQuotedExprModule: Symbol = requiredModule("scala.internal.quoted.Expr") @tu lazy val InternalQuotedExpr_unapply: Symbol = InternalQuotedExprModule.requiredMethod(nme.unapply) - @tu lazy val InternalQuotedExpr_nullExpr: Symbol = InternalQuotedExprModule.requiredMethod(nme.nullExpr) - @tu lazy val InternalQuotedExpr_unitExpr: Symbol = InternalQuotedExprModule.requiredMethod(nme.unitExpr) + @tu lazy val InternalQuotedExpr_null: Symbol = InternalQuotedExprModule.requiredMethod(nme.null_) + @tu lazy val InternalQuotedExpr_unit: Symbol = InternalQuotedExprModule.requiredMethod(nme.Unit) @tu lazy val InternalQuotedTypeModule: Symbol = requiredModule("scala.internal.quoted.Type") @tu lazy val InternalQuotedType_unapply: Symbol = InternalQuotedTypeModule.requiredMethod(nme.unapply) diff --git a/compiler/src/dotty/tools/dotc/core/StdNames.scala b/compiler/src/dotty/tools/dotc/core/StdNames.scala index 04b2bfdc74fb..8156a310e2a4 100644 --- a/compiler/src/dotty/tools/dotc/core/StdNames.scala +++ b/compiler/src/dotty/tools/dotc/core/StdNames.scala @@ -535,7 +535,6 @@ object StdNames { val notifyAll_ : N = "notifyAll" val notify_ : N = "notify" val null_ : N = "null" - val nullExpr: N = "nullExpr" val ofDim: N = "ofDim" val on: N = "on" val opaque: N = "opaque" @@ -608,7 +607,6 @@ object StdNames { val unapply: N = "unapply" val unapplySeq: N = "unapplySeq" val unbox: N = "unbox" - val unitExpr: N = "unitExpr" val universe: N = "universe" val update: N = "update" val updateDynamic: N = "updateDynamic" diff --git a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala index 38401588a3a5..66a4232e2de6 100644 --- a/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala +++ b/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala @@ -150,8 +150,8 @@ class ReifyQuotes extends MacroTransform { def liftedValue(lifter: Symbol) = ref(lifter).appliedToType(originalTp).select(nme.toExpr).appliedTo(lit) lit.const.tag match { - case Constants.NullTag => ref(defn.InternalQuotedExpr_nullExpr) - case Constants.UnitTag => ref(defn.InternalQuotedExpr_unitExpr) + case Constants.NullTag => ref(defn.InternalQuotedExpr_null) + case Constants.UnitTag => ref(defn.InternalQuotedExpr_unit) case Constants.BooleanTag => liftedValue(defn.LiftableModule_BooleanIsLiftable) case Constants.ByteTag => liftedValue(defn.LiftableModule_ByteIsLiftable) case Constants.ShortTag => liftedValue(defn.LiftableModule_ShortIsLiftable) diff --git a/library/src/scala/internal/quoted/Expr.scala b/library/src/scala/internal/quoted/Expr.scala index a9079bfb5c17..91ce92fe40e7 100644 --- a/library/src/scala/internal/quoted/Expr.scala +++ b/library/src/scala/internal/quoted/Expr.scala @@ -55,15 +55,14 @@ object Expr { new Matcher.QuoteMatcher[qctx.type].termMatch(scrutineeExpr.unseal, patternExpr.unseal, hasTypeSplices).asInstanceOf[Option[Tup]] } - /** Returns a null expresssion equivalent to `'{null}` */ - def nullExpr: QuoteContext ?=> quoted.Expr[Null] = qctx ?=> { + def `null`: QuoteContext ?=> quoted.Expr[Null] = qctx ?=> { import qctx.tasty._ Literal(Constant(null)).seal.asInstanceOf[quoted.Expr[Null]] } /** Returns a unit expresssion equivalent to `'{}` or `'{()}` */ - def unitExpr: QuoteContext ?=> quoted.Expr[Unit] = qctx ?=> { + def Unit: QuoteContext ?=> quoted.Expr[Unit] = qctx ?=> { import qctx.tasty._ Literal(Constant(())).seal.asInstanceOf[quoted.Expr[Unit]] }