Skip to content

Commit 90a3a79

Browse files
committed
Update QuoteContext to Quotes
1 parent 3fb31c6 commit 90a3a79

File tree

44 files changed

+85
-88
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+85
-88
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ class Definitions {
797797
@tu lazy val QuotedExprClass: ClassSymbol = requiredClass("scala.quoted.Expr")
798798
@tu lazy val QuotedExprModule: Symbol = QuotedExprClass.companionModule
799799

800-
@tu lazy val QuoteContextClass: ClassSymbol = requiredClass("scala.quoted.Quotes")
800+
@tu lazy val QuotesClass: ClassSymbol = requiredClass("scala.quoted.Quotes")
801801

802802
@tu lazy val QuoteUnpicklerClass: ClassSymbol = requiredClass("scala.quoted.runtime.QuoteUnpickler")
803803
@tu lazy val QuoteUnpickler_unpickleExpr: Symbol = QuoteUnpicklerClass.requiredMethod("unpickleExpr")

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

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ object StagingContext {
1717
private val QuotationLevel = new Property.Key[Int]
1818

1919
/** A key to be used in a context property that tracks the quoteation stack.
20-
* Stack containing the QuoteContext references recieved by the surrounding quotes.
20+
* Stack containing the Quotes references recieved by the surrounding quotes.
2121
*/
22-
private val QuoteContextStack = new Property.Key[List[tpd.Tree]]
22+
private val QuotesStack = new Property.Key[List[tpd.Tree]]
2323

2424
private val TaggedTypes = new Property.Key[PCPCheckAndHeal.QuoteTypeTags]
2525

@@ -31,11 +31,11 @@ object StagingContext {
3131
def quoteContext(using Context): Context =
3232
ctx.fresh.setProperty(QuotationLevel, level + 1)
3333

34-
/** Context with an incremented quotation level and pushes a refecence to a QuoteContext on the quote context stack */
35-
def pushQuoteContext(qctxRef: tpd.Tree)(using Context): Context =
36-
val old = ctx.property(QuoteContextStack).getOrElse(List.empty)
34+
/** Context with an incremented quotation level and pushes a refecence to a Quotes on the quote context stack */
35+
def pushQuotes(qctxRef: tpd.Tree)(using Context): Context =
36+
val old = ctx.property(QuotesStack).getOrElse(List.empty)
3737
ctx.fresh.setProperty(QuotationLevel, level + 1)
38-
.setProperty(QuoteContextStack, qctxRef :: old)
38+
.setProperty(QuotesStack, qctxRef :: old)
3939

4040
/** Context with a decremented quotation level. */
4141
def spliceContext(using Context): Context =
@@ -50,12 +50,12 @@ object StagingContext {
5050
/** Context with a decremented quotation level and pops the Some of top of the quote context stack or None if the stack is empty.
5151
* The quotation stack could be empty if we are in a top level splice or an eroneous splice directly witin a top level splice.
5252
*/
53-
def popQuoteContext()(using Context): (Option[tpd.Tree], Context) =
53+
def popQuotes()(using Context): (Option[tpd.Tree], Context) =
5454
val ctx1 = ctx.fresh.setProperty(QuotationLevel, level - 1)
5555
val head =
56-
ctx.property(QuoteContextStack) match
56+
ctx.property(QuotesStack) match
5757
case Some(x :: xs) =>
58-
ctx1.setProperty(QuoteContextStack, xs)
58+
ctx1.setProperty(QuotesStack, xs)
5959
Some(x)
6060
case _ =>
6161
None // Splice at level 0 or lower

compiler/src/dotty/tools/dotc/quoted/PickledQuotes.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import dotty.tools.dotc.report
1919

2020
import scala.reflect.ClassTag
2121

22-
import scala.quoted.QuoteContext
22+
import scala.quoted.Quotes
2323
import scala.quoted.runtime.impl._
2424

2525
import scala.collection.mutable
@@ -53,7 +53,7 @@ object PickledQuotes {
5353
}
5454

5555
/** Unpickle the tree contained in the TastyExpr */
56-
def unpickleTerm(pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.QuoteContext) => scala.quoted.Expr[?])(using Context): Tree = {
56+
def unpickleTerm(pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.Quotes) => scala.quoted.Expr[?])(using Context): Tree = {
5757
val unpickled = withMode(Mode.ReadPositions)(unpickle(pickled, isType = false))
5858
val Inlined(call, Nil, expnasion) = unpickled
5959
val inlineCtx = inlineContext(call)
@@ -63,18 +63,18 @@ object PickledQuotes {
6363
}
6464

6565
/** Unpickle the tree contained in the TastyType */
66-
def unpickleTypeTree(pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.QuoteContext) => scala.quoted.Expr[?])(using Context): Tree = {
66+
def unpickleTypeTree(pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.Quotes) => scala.quoted.Expr[?])(using Context): Tree = {
6767
val unpickled = withMode(Mode.ReadPositions)(unpickle(pickled, isType = true))
6868
spliceTypes(unpickled, typeHole, termHole)
6969
}
7070

7171
/** Replace all term holes with the spliced terms */
72-
private def spliceTerms(tree: Tree, typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.QuoteContext) => scala.quoted.Expr[?])(using Context): Tree = {
72+
private def spliceTerms(tree: Tree, typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.Quotes) => scala.quoted.Expr[?])(using Context): Tree = {
7373
val evaluateHoles = new TreeMap {
7474
override def transform(tree: tpd.Tree)(using Context): tpd.Tree = tree match {
7575
case Hole(isTerm, idx, args) =>
7676
val reifiedArgs = args.map { arg =>
77-
if (arg.isTerm) (using qctx: QuoteContext) => new ExprImpl(arg, QuotesImpl.scopeId)
77+
if (arg.isTerm) (using qctx: Quotes) => new ExprImpl(arg, QuotesImpl.scopeId)
7878
else new TypeImpl(arg, QuotesImpl.scopeId)
7979
}
8080
if isTerm then
@@ -123,7 +123,7 @@ object PickledQuotes {
123123
}
124124

125125
/** Replace all type holes generated with the spliced types */
126-
private def spliceTypes(tree: Tree, typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Int], scala.quoted.QuoteContext) => Any)(using Context): Tree = {
126+
private def spliceTypes(tree: Tree, typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Int], scala.quoted.Quotes) => Any)(using Context): Tree = {
127127
tree match
128128
case Block(stat :: rest, expr1) if stat.symbol.hasAnnotation(defn.QuotedRuntime_SplicedTypeAnnot) =>
129129
val typeSpliceMap = (stat :: rest).iterator.map {

compiler/src/dotty/tools/dotc/transform/PickleQuotes.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import scala.annotation.constructorOnly
5454
* typeHole = (idx: Int, args: List[Any]) => idx match {
5555
* case 0 => ...
5656
* },
57-
* termHole = (idx: Int, args: List[Any], qctx: QuoteContext) => idx match {
57+
* termHole = (idx: Int, args: List[Any], qctx: Quotes) => idx match {
5858
* case 0 => ...
5959
* ...
6060
* case <i> =>
@@ -159,7 +159,7 @@ class PickleQuotes extends MacroTransform {
159159
*/
160160
def pickleAsLiteral(lit: Literal) = {
161161
val exprType = defn.QuotedExprClass.typeRef.appliedTo(body.tpe)
162-
val lambdaTpe = MethodType(defn.QuoteContextClass.typeRef :: Nil, exprType)
162+
val lambdaTpe = MethodType(defn.QuotesClass.typeRef :: Nil, exprType)
163163
def mkConst(ts: List[Tree]) = {
164164
val reflect = ts.head.select("reflect".toTermName)
165165
val typeName = body.tpe.typeSymbol.name
@@ -239,7 +239,7 @@ class PickleQuotes extends MacroTransform {
239239
else
240240
Lambda(
241241
MethodType(
242-
List(defn.IntType, defn.SeqType.appliedTo(defn.AnyType), defn.QuoteContextClass.typeRef),
242+
List(defn.IntType, defn.SeqType.appliedTo(defn.AnyType), defn.QuotesClass.typeRef),
243243
defn.QuotedExprClass.typeRef.appliedTo(defn.AnyType)),
244244
args => {
245245
val cases = termSplices.map { case (splice, idx) =>
@@ -253,7 +253,7 @@ class PickleQuotes extends MacroTransform {
253253

254254
val quoteClass = if isType then defn.QuotedTypeClass else defn.QuotedExprClass
255255
val quotedType = quoteClass.typeRef.appliedTo(originalTp)
256-
val lambdaTpe = MethodType(defn.QuoteContextClass.typeRef :: Nil, quotedType)
256+
val lambdaTpe = MethodType(defn.QuotesClass.typeRef :: Nil, quotedType)
257257
def callUnpickle(ts: List[Tree]) = {
258258
val qctx = ts.head.asInstance(defn.QuoteUnpicklerClass.typeRef)
259259
val unpickleMeth = if isType then defn.QuoteUnpickler_unpickleType else defn.QuoteUnpickler_unpickleExpr
@@ -275,7 +275,7 @@ class PickleQuotes extends MacroTransform {
275275
def taggedType() =
276276
val typeType = defn.QuotedTypeClass.typeRef.appliedTo(body.tpe)
277277
val classTree = TypeApply(ref(defn.Predef_classOf.termRef), body :: Nil)
278-
val lambdaTpe = MethodType(defn.QuoteContextClass.typeRef :: Nil, typeType)
278+
val lambdaTpe = MethodType(defn.QuotesClass.typeRef :: Nil, typeType)
279279
def callTypeConstructorOf(ts: List[Tree]) = {
280280
val reflect = ts.head.select("reflect".toTermName)
281281
val typeRepr = reflect.select("TypeRepr".toTermName).select("typeConstructorOf".toTermName).appliedTo(classTree)
@@ -370,7 +370,7 @@ class PickleQuotes extends MacroTransform {
370370
assert(tpw.isInstanceOf[ValueType])
371371
val argTpe =
372372
if (tree.isType) defn.QuotedTypeClass.typeRef.appliedTo(tpw)
373-
else defn.FunctionType(1, isContextual = true).appliedTo(defn.QuoteContextClass.typeRef, defn.QuotedExprClass.typeRef.appliedTo(tpw))
373+
else defn.FunctionType(1, isContextual = true).appliedTo(defn.QuotesClass.typeRef, defn.QuotedExprClass.typeRef.appliedTo(tpw))
374374
val selectArg = arg.select(nme.apply).appliedTo(Literal(Constant(i))).cast(argTpe)
375375
val capturedArg = SyntheticValDef(UniqueName.fresh(tree.symbol.name.toTermName).toTermName, selectArg)
376376
i += 1

compiler/src/dotty/tools/dotc/transform/Splicer.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import scala.reflect.ClassTag
2626

2727
import dotty.tools.dotc.quoted.{PickledQuotes, QuoteUtils}
2828

29-
import scala.quoted.QuoteContext
29+
import scala.quoted.Quotes
3030
import scala.quoted.runtime.impl._
3131

3232
/** Utility class to splice quoted expressions */
@@ -51,7 +51,7 @@ object Splicer {
5151
val interpreter = new Interpreter(pos, classLoader)
5252

5353
// Some parts of the macro are evaluated during the unpickling performed in quotedExprToTree
54-
val interpretedExpr = interpreter.interpret[QuoteContext => scala.quoted.Expr[Any]](tree)
54+
val interpretedExpr = interpreter.interpret[Quotes => scala.quoted.Expr[Any]](tree)
5555
val interpretedTree = interpretedExpr.fold(tree)(macroClosure => PickledQuotes.quotedExprToTree(macroClosure(QuotesImpl())))
5656

5757
checkEscapedVariables(interpretedTree, macroOwner)

compiler/src/dotty/tools/dotc/transform/TreeMapWithStages.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ abstract class TreeMapWithStages(@constructorOnly ictx: Context) extends TreeMap
109109
try dropEmptyBlocks(quotedTree) match {
110110
case Spliced(t) =>
111111
// '{ $x } --> x
112-
// and adapt the refinment of `QuoteContext { type tasty: ... } ?=> Expr[T]`
112+
// and adapt the refinment of `Quotes { type tasty: ... } ?=> Expr[T]`
113113
transform(t).asInstance(tree.tpe)
114114
case _ => transformQuotation(quotedTree, tree)
115115
}

compiler/src/dotty/tools/dotc/typer/QuotesAndSplices.scala

+5-5
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ trait QuotesAndSplices {
4949
report.warning("Canceled splice directly inside a quote. '[ ${ XYZ } ] is equivalent to XYZ.", tree.srcPos)
5050
case _ =>
5151
}
52-
val qctx = inferImplicitArg(defn.QuoteContextClass.typeRef, tree.span)
52+
val qctx = inferImplicitArg(defn.QuotesClass.typeRef, tree.span)
5353

5454
if qctx.tpe.isInstanceOf[SearchFailureType] then
55-
report.error(missingArgMsg(qctx, defn.QuoteContextClass.typeRef, ""), ctx.source.atSpan(tree.span))
55+
report.error(missingArgMsg(qctx, defn.QuotesClass.typeRef, ""), ctx.source.atSpan(tree.span))
5656
else if !qctx.tpe.isStable then
57-
report.error(em"Quotes require stable QuoteContext, but found non stable $qctx", qctx.srcPos)
57+
report.error(em"Quotes require stable Quotes, but found non stable $qctx", qctx.srcPos)
5858

5959
val tree1 =
6060
if ctx.mode.is(Mode.Pattern) then
@@ -65,7 +65,7 @@ trait QuotesAndSplices {
6565
else report.warning(msg, tree.srcPos)
6666
typedTypeApply(untpd.TypeApply(untpd.ref(defn.QuotedTypeModule_of.termRef), tree.quoted :: Nil), pt)(using quoteContext).select(nme.apply).appliedTo(qctx)
6767
else
68-
typedApply(untpd.Apply(untpd.ref(defn.QuotedRuntime_exprQuote.termRef), tree.quoted), pt)(using pushQuoteContext(qctx)).select(nme.apply).appliedTo(qctx)
68+
typedApply(untpd.Apply(untpd.ref(defn.QuotedRuntime_exprQuote.termRef), tree.quoted), pt)(using pushQuotes(qctx)).select(nme.apply).appliedTo(qctx)
6969
tree1.withSpan(tree.span)
7070
}
7171

@@ -103,7 +103,7 @@ trait QuotesAndSplices {
103103
markAsMacro(ctx)
104104
}
105105

106-
val (outerQctx, ctx1) = popQuoteContext()
106+
val (outerQctx, ctx1) = popQuotes()
107107

108108
val internalSplice =
109109
outerQctx match

compiler/src/scala/quoted/runtime/impl/Matcher.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ import scala.annotation.{Annotation, compileTimeOnly}
9696
*/
9797
object Matcher {
9898

99-
abstract class QuoteMatcher[QCtx <: QuoteContext & Singleton](val qctx: QCtx) {
99+
abstract class QuoteMatcher[QCtx <: Quotes & Singleton](val qctx: QCtx) {
100100

101101
// TODO improve performance
102102

compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ object QuotesImpl {
2525

2626
type ScopeId = Int
2727

28-
def apply()(using Context): QuoteContext =
28+
def apply()(using Context): Quotes =
2929
new QuotesImpl
3030

3131
def showDecompiledTree(tree: tpd.Tree)(using Context): String = {
@@ -43,7 +43,7 @@ object QuotesImpl {
4343

4444
}
4545

46-
class QuotesImpl private (using val ctx: Context) extends QuoteContext, QuoteUnpickler, QuoteMatching:
46+
class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler, QuoteMatching:
4747

4848
private val yCheck: Boolean =
4949
ctx.settings.Ycheck.value(using ctx).exists(x => x == "all" || x == "macros")
@@ -2599,11 +2599,11 @@ class QuotesImpl private (using val ctx: Context) extends QuoteContext, QuoteUnp
25992599

26002600
end reflect
26012601

2602-
def unpickleExpr[T](pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.QuoteContext) => scala.quoted.Expr[?]): scala.quoted.Expr[T] =
2602+
def unpickleExpr[T](pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.Quotes) => scala.quoted.Expr[?]): scala.quoted.Expr[T] =
26032603
val tree = PickledQuotes.unpickleTerm(pickled, typeHole, termHole)
26042604
new ExprImpl(tree, hash).asInstanceOf[scala.quoted.Expr[T]]
26052605

2606-
def unpickleType[T <: AnyKind](pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.QuoteContext) => scala.quoted.Expr[?]): scala.quoted.Type[T] =
2606+
def unpickleType[T <: AnyKind](pickled: String | List[String], typeHole: (Int, Seq[Any]) => scala.quoted.Type[?], termHole: (Int, Seq[Any], scala.quoted.Quotes) => scala.quoted.Expr[?]): scala.quoted.Type[T] =
26072607
val tree = PickledQuotes.unpickleTypeTree(pickled, typeHole, termHole)
26082608
new TypeImpl(tree, hash).asInstanceOf[scala.quoted.Type[T]]
26092609

compiler/src/scala/quoted/runtime/impl/TypeImpl.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ final class TypeImpl(val typeTree: tpd.Tree, val scopeId: Int) extends Type[?] {
1414
}
1515

1616
/** View this expression `quoted.Type[T]` as a `TypeTree` */
17-
def unseal(using qctx: QuoteContext): qctx.reflect.TypeTree =
17+
def unseal(using qctx: Quotes): qctx.reflect.TypeTree =
1818
checkScopeId(qctx.hashCode)
1919
typeTree.asInstanceOf[qctx.reflect.TypeTree]
2020

compiler/src/scala/quoted/runtime/impl/printers/Extractors.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ import scala.quoted._
55

66
object Extractors {
77

8-
def showTree(using QuoteContext)(tree: qctx.reflect.Tree): String =
8+
def showTree(using Quotes)(tree: qctx.reflect.Tree): String =
99
new ExtractorsPrinter[qctx.type]().visitTree(tree).result()
1010

11-
def showType(using QuoteContext)(tpe: qctx.reflect.TypeRepr): String =
11+
def showType(using Quotes)(tpe: qctx.reflect.TypeRepr): String =
1212
new ExtractorsPrinter[qctx.type]().visitType(tpe).result()
1313

14-
def showConstant(using QuoteContext)(const: qctx.reflect.Constant): String =
14+
def showConstant(using Quotes)(const: qctx.reflect.Constant): String =
1515
new ExtractorsPrinter[qctx.type]().visitConstant(const).result()
1616

17-
def showSymbol(using QuoteContext)(symbol: qctx.reflect.Symbol): String =
17+
def showSymbol(using Quotes)(symbol: qctx.reflect.Symbol): String =
1818
new ExtractorsPrinter[qctx.type]().visitSymbol(symbol).result()
1919

20-
def showFlags(using QuoteContext)(flags: qctx.reflect.Flags): String = {
20+
def showFlags(using Quotes)(flags: qctx.reflect.Flags): String = {
2121
import qctx.reflect._
2222
val flagList = List.newBuilder[String]
2323
if (flags.is(Flags.Abstract)) flagList += "Flags.Abstract"
@@ -57,7 +57,7 @@ object Extractors {
5757
flagList.result().mkString(" | ")
5858
}
5959

60-
private class ExtractorsPrinter[QCtx <: QuoteContext & Singleton](using val qctx: QCtx) { self =>
60+
private class ExtractorsPrinter[QCtx <: Quotes & Singleton](using val qctx: QCtx) { self =>
6161
import qctx.reflect._
6262

6363
private val sb: StringBuilder = new StringBuilder

compiler/src/scala/quoted/runtime/impl/printers/SourceCode.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@ import scala.annotation.switch
66
/** Printer for fully elaborated representation of the source code */
77
object SourceCode {
88

9-
def showTree(using QuoteContext)(tree: qctx.reflect.Tree)(syntaxHighlight: SyntaxHighlight): String =
9+
def showTree(using Quotes)(tree: qctx.reflect.Tree)(syntaxHighlight: SyntaxHighlight): String =
1010
new SourceCodePrinter[qctx.type](syntaxHighlight).printTree(tree).result()
1111

12-
def showType(using QuoteContext)(tpe: qctx.reflect.TypeRepr)(syntaxHighlight: SyntaxHighlight): String =
12+
def showType(using Quotes)(tpe: qctx.reflect.TypeRepr)(syntaxHighlight: SyntaxHighlight): String =
1313
new SourceCodePrinter[qctx.type](syntaxHighlight).printType(tpe)(using None).result()
1414

15-
def showConstant(using QuoteContext)(const: qctx.reflect.Constant)(syntaxHighlight: SyntaxHighlight): String =
15+
def showConstant(using Quotes)(const: qctx.reflect.Constant)(syntaxHighlight: SyntaxHighlight): String =
1616
new SourceCodePrinter[qctx.type](syntaxHighlight).printConstant(const).result()
1717

18-
def showSymbol(using QuoteContext)(symbol: qctx.reflect.Symbol)(syntaxHighlight: SyntaxHighlight): String =
18+
def showSymbol(using Quotes)(symbol: qctx.reflect.Symbol)(syntaxHighlight: SyntaxHighlight): String =
1919
symbol.fullName
2020

21-
def showFlags(using QuoteContext)(flags: qctx.reflect.Flags)(syntaxHighlight: SyntaxHighlight): String = {
21+
def showFlags(using Quotes)(flags: qctx.reflect.Flags)(syntaxHighlight: SyntaxHighlight): String = {
2222
import qctx.reflect._
2323
val flagList = List.newBuilder[String]
2424
if (flags.is(Flags.Abstract)) flagList += "abstract"
@@ -58,7 +58,7 @@ object SourceCode {
5858
flagList.result().mkString("/*", " ", "*/")
5959
}
6060

61-
private class SourceCodePrinter[QCtx <: QuoteContext & Singleton](syntaxHighlight: SyntaxHighlight)(using val qctx: QCtx) {
61+
private class SourceCodePrinter[QCtx <: Quotes & Singleton](syntaxHighlight: SyntaxHighlight)(using val qctx: QCtx) {
6262
import syntaxHighlight._
6363
import qctx.reflect._
6464

0 commit comments

Comments
 (0)