-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Extract quote reification from Staging phase #5763
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
e7ffcae
to
2751b14
Compare
5f4664a
to
50114ec
Compare
50114ec
to
55d62d6
Compare
17771f5
to
5fcab04
Compare
9cd54ba
to
2082ba0
Compare
Rebased |
if (tree.fun.hasType && tree.fun.symbol == defn.QuotedType_apply) | ||
keywordStr("'[") ~ toTextGlobal(tree.args, ", ") ~ keywordStr("]") | ||
else | ||
toTextLocal(tree.fun) ~ "[" ~ toTextGlobal(tree.args, ", ") ~ "]" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
keywordStr in both branches? Also, why not factor out the prefix?
val leading =
if (tree.fun.hasType && tree.fun.symbol == defn.QuotedType_apply) keywordStr("'[")
else toTextLocal(tree.fun) ~ keywordStr("[")
leading ~ toTextGlobal(tree.args, ", ") ~ keywordStr("]")
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The suffix also depends on the condition. Though I can refactor it a bit.
val isQuote = tree.fun.hasType && tree.fun.symbol == defn.QuotedType_apply
val (open, close) = if (isQuote) (keywordStr("'["), keywordStr("]")) else ("[", "]")
toTextLocal(tree.fun).provided(!isQuote) ~ open ~ toTextGlobal(tree.args, ", ") ~ close
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I pushed this refactoring of the code
@@ -320,7 +324,8 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) { | |||
if (name.isTypeName) typeText(txt) | |||
else txt | |||
case tree @ Select(qual, name) => | |||
if (tree.hasType && tree.symbol == defn.QuotedExpr_~ || tree.symbol == defn.QuotedType_~) keywordStr("~(") ~ toTextLocal(qual) ~ keywordStr(")") | |||
if (tree.hasType && tree.symbol == defn.QuotedExpr_~) keywordStr("~(") ~ toTextLocal(qual) ~ keywordStr(")") | |||
else if (tree.hasType && tree.symbol == defn.QuotedType_~) typeText("~(") ~ toTextLocal(qual) ~ typeText(")") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why typeText instead if keywordStr? (I don't know enough about the syntax highlighting stuff to be able to tell).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
compiler/src/dotty/tools/dotc/transform/TreeMapWithStages.scala
Outdated
Show resolved
Hide resolved
compiler/src/dotty/tools/dotc/transform/TreeMapWithStages.scala
Outdated
Show resolved
Hide resolved
2082ba0
to
88d42d5
Compare
Split current `Staging` into `Staging` and `ReifyQuotes` - `Staging` - Just before `Pickler` - Checks PCP - Heals phase consistency by replacing `T` with `~implicitly[Type[T]]({{t}})` (actually `~t`) - Expand macros - Ycheck that PCP holds (without healing) until `ReifyQuotes` - `ReifyQuotes` - Aliases all type splices by replacing `~t` by `T$1` and inserting `type T$1 = ~t` at the start of the quoted block. - Transform `'{ ... ~(... ) ... }` into `unpickle('{ ... Hole(...) ... }, List(args => ....))` - `TreeMapWithStages` a new `TreeMap` that contains the logic to track quotation levels while mapping the tree. - Moved logic from `MacroTransformWithImplicits` to `TreeMapWithImplicits` to be able to tranform a tree without the need to be in a macro transform. This will be useful to integrate the PCP checks and macro expansion in `Typer`.
58f1347
to
bef8cce
Compare
Rebased |
@nicolasstucki Which commits did you add after my last review? |
Split current
Staging
intoStaging
andReifyQuotes
Staging
Pickler
T
with~implicitly[Type[T]]({{t}})
(actually~t
)ReifyQuotes
ReifyQuotes
~t
byT$1
and insertingtype T$1 = ~t
at the start of the quoted block.'{ ... ~(...) ... }
intounpickle('{ ... Hole(...) ... }, List(args => ....))
TreeMapWithStages
a newTreeMap
that contains the logic to track quotation levels while mapping the tree.MacroTransformWithImplicits
toTreeMapWithImplicits
to be able to tranform a tree without the need to be in a macro transform. This will be useful to integrate the PCP checks and macro expansion inTyper
.