Skip to content

Commit ac84182

Browse files
Merge pull request #5918 from dotty-staging/change-splice-dollar
Change syntax of splices and quotes
2 parents b539b34 + 4b0c234 commit ac84182

File tree

273 files changed

+1543
-1450
lines changed

Some content is hidden

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

273 files changed

+1543
-1450
lines changed

bench/tests/power-macro/PowerMacro.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import scala.quoted.Expr
22

33
object PowerMacro {
44

5-
inline def power(inline n: Long, x: Double) = ~powerCode(n, '(x))
5+
inline def power(inline n: Long, x: Double) = ${powerCode(n, '{x})}
66

77
def powerCode(n: Long, x: Expr[Double]): Expr[Double] =
8-
if (n == 0) '(1.0)
9-
else if (n % 2 == 0) '{ val y = ~x * ~x; ~powerCode(n / 2, '(y)) }
10-
else '{ ~x * ~powerCode(n - 1, x) }
8+
if (n == 0) '{1.0}
9+
else if (n % 2 == 0) '{ val y = $x * $x; ${powerCode(n / 2, '{y})} }
10+
else '{ $x * ${powerCode(n - 1, x)} }
1111

1212
}

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,11 +1313,15 @@ object desugar {
13131313
val desugared = tree match {
13141314
case SymbolLit(str) =>
13151315
Literal(Constant(scala.Symbol(str)))
1316-
case Quote(expr) =>
1317-
if (expr.isType)
1318-
TypeApply(ref(defn.QuotedType_applyR), List(expr))
1316+
case Quote(t) =>
1317+
if (t.isType)
1318+
TypeApply(ref(defn.QuotedType_applyR), List(t))
13191319
else
1320-
Apply(ref(defn.QuotedExpr_applyR), expr)
1320+
Apply(ref(defn.QuotedExpr_applyR), t)
1321+
case Splice(expr) =>
1322+
Select(expr, nme.splice)
1323+
case TypSplice(expr) =>
1324+
Select(expr, tpnme.splice)
13211325
case InterpolatedString(id, segments) =>
13221326
val strs = segments map {
13231327
case ts: Thicket => ts.trees.head

compiler/src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
1616

1717
abstract class OpTree(implicit @constructorOnly src: SourceFile) extends Tree {
1818
def op: Ident
19-
override def isTerm: Boolean = op.name.isTermName
20-
override def isType: Boolean = op.name.isTypeName
19+
override def isTerm: Boolean = op.isTerm
20+
override def isType: Boolean = op.isType
2121
}
2222

2323
/** A typed subtree of an untyped tree needs to be wrapped in a TypedSplice
@@ -84,10 +84,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
8484

8585
case class InfixOp(left: Tree, op: Ident, right: Tree)(implicit @constructorOnly src: SourceFile) extends OpTree
8686
case class PostfixOp(od: Tree, op: Ident)(implicit @constructorOnly src: SourceFile) extends OpTree
87-
case class PrefixOp(op: Ident, od: Tree)(implicit @constructorOnly src: SourceFile) extends OpTree {
88-
override def isType: Boolean = op.isType
89-
override def isTerm: Boolean = op.isTerm
90-
}
87+
case class PrefixOp(op: Ident, od: Tree)(implicit @constructorOnly src: SourceFile) extends OpTree
9188
case class Parens(t: Tree)(implicit @constructorOnly src: SourceFile) extends ProxyTree {
9289
def forwardTo: Tree = t
9390
}
@@ -96,7 +93,9 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
9693
override def isType: Boolean = !isTerm
9794
}
9895
case class Throw(expr: Tree)(implicit @constructorOnly src: SourceFile) extends TermTree
99-
case class Quote(expr: Tree)(implicit @constructorOnly src: SourceFile) extends TermTree
96+
case class Quote(t: Tree)(implicit @constructorOnly src: SourceFile) extends TermTree
97+
case class Splice(expr: Tree)(implicit @constructorOnly src: SourceFile) extends TermTree
98+
case class TypSplice(expr: Tree)(implicit @constructorOnly src: SourceFile) extends TypTree
10099
case class DoWhile(body: Tree, cond: Tree)(implicit @constructorOnly src: SourceFile) extends TermTree
101100
case class ForYield(enums: List[Tree], expr: Tree)(implicit @constructorOnly src: SourceFile) extends TermTree
102101
case class ForDo(enums: List[Tree], body: Tree)(implicit @constructorOnly src: SourceFile) extends TermTree
@@ -493,9 +492,17 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
493492
case tree: Throw if expr eq tree.expr => tree
494493
case _ => finalize(tree, untpd.Throw(expr)(tree.source))
495494
}
496-
def Quote(tree: Tree)(expr: Tree)(implicit ctx: Context): TermTree = tree match {
497-
case tree: Quote if expr eq tree.expr => tree
498-
case _ => finalize(tree, untpd.Quote(expr)(tree.source))
495+
def Quote(tree: Tree)(t: Tree)(implicit ctx: Context): Tree = tree match {
496+
case tree: Quote if t eq tree.t => tree
497+
case _ => finalize(tree, untpd.Quote(t)(tree.source))
498+
}
499+
def Splice(tree: Tree)(expr: Tree)(implicit ctx: Context): Tree = tree match {
500+
case tree: Splice if expr eq tree.expr => tree
501+
case _ => finalize(tree, untpd.Splice(expr)(tree.source))
502+
}
503+
def TypSplice(tree: Tree)(expr: Tree)(implicit ctx: Context): Tree = tree match {
504+
case tree: TypSplice if expr eq tree.expr => tree
505+
case _ => finalize(tree, untpd.TypSplice(expr)(tree.source))
499506
}
500507
def DoWhile(tree: Tree)(body: Tree, cond: Tree)(implicit ctx: Context): TermTree = tree match {
501508
case tree: DoWhile if (body eq tree.body) && (cond eq tree.cond) => tree
@@ -557,8 +564,12 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
557564
cpy.Tuple(tree)(transform(trees))
558565
case Throw(expr) =>
559566
cpy.Throw(tree)(transform(expr))
560-
case Quote(expr) =>
561-
cpy.Quote(tree)(transform(expr))
567+
case Quote(t) =>
568+
cpy.Quote(tree)(transform(t))
569+
case Splice(expr) =>
570+
cpy.Splice(tree)(transform(expr))
571+
case TypSplice(expr) =>
572+
cpy.TypSplice(tree)(transform(expr))
562573
case DoWhile(body, cond) =>
563574
cpy.DoWhile(tree)(transform(body), transform(cond))
564575
case ForYield(enums, expr) =>
@@ -606,7 +617,11 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
606617
this(x, trees)
607618
case Throw(expr) =>
608619
this(x, expr)
609-
case Quote(expr) =>
620+
case Quote(t) =>
621+
this(x, t)
622+
case Splice(expr) =>
623+
this(x, expr)
624+
case TypSplice(expr) =>
610625
this(x, expr)
611626
case DoWhile(body, cond) =>
612627
this(this(x, body), cond)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -707,16 +707,16 @@ class Definitions {
707707
def QuotedExprModule(implicit ctx: Context): Symbol = QuotedExprClass.companionModule
708708
lazy val QuotedExpr_applyR: TermRef = QuotedExprModule.requiredMethodRef(nme.apply)
709709
def QuotedExpr_apply(implicit ctx: Context): Symbol = QuotedExpr_applyR.symbol
710-
lazy val QuotedExpr_~ : TermSymbol = QuotedExprClass.requiredMethod(nme.UNARY_~)
710+
lazy val QuotedExpr_splice : TermSymbol = QuotedExprClass.requiredMethod(nme.splice)
711711

712712
lazy val QuotedExprsModule: TermSymbol = ctx.requiredModule("scala.quoted.Exprs")
713713
def QuotedExprsClass(implicit ctx: Context): ClassSymbol = QuotedExprsModule.asClass
714714

715715
lazy val QuotedTypeType: TypeRef = ctx.requiredClassRef("scala.quoted.Type")
716716
def QuotedTypeClass(implicit ctx: Context): ClassSymbol = QuotedTypeType.symbol.asClass
717717

718-
lazy val QuotedType_spliceR: TypeRef = QuotedTypeClass.requiredType(tpnme.UNARY_~).typeRef
719-
def QuotedType_~ : Symbol = QuotedType_spliceR.symbol
718+
lazy val QuotedType_spliceR: TypeRef = QuotedTypeClass.requiredType(tpnme.splice).typeRef
719+
def QuotedType_splice : Symbol = QuotedType_spliceR.symbol
720720

721721
lazy val QuotedTypeModuleType: TermRef = ctx.requiredModuleRef("scala.quoted.Type")
722722
def QuotedTypeModule(implicit ctx: Context): Symbol = QuotedTypeModuleType.symbol

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ object StdNames {
521521
val setSymbol: N = "setSymbol"
522522
val setType: N = "setType"
523523
val setTypeSignature: N = "setTypeSignature"
524-
val splice: N = "splice"
524+
val splice: N = "$splice"
525525
val staticClass : N = "staticClass"
526526
val staticModule : N = "staticModule"
527527
val staticPackage : N = "staticPackage"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ object PickledQuotes {
2626
def pickleQuote(tree: Tree)(implicit ctx: Context): scala.runtime.quoted.Unpickler.Pickled = {
2727
if (ctx.reporter.hasErrors) Nil
2828
else {
29-
assert(!tree.isInstanceOf[Hole]) // Should not be pickled as it represents `'(~x)` which should be optimized to `x`
29+
assert(!tree.isInstanceOf[Hole]) // Should not be pickled as it represents `'{$x}` which should be optimized to `x`
3030
val pickled = pickle(tree)
3131
TastyString.pickle(pickled)
3232
}

compiler/src/dotty/tools/dotc/parsing/CharArrayReader.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ abstract class CharArrayReader { self =>
122122
/** A new reader that takes off at the current character position */
123123
def lookaheadReader(): CharArrayLookaheadReader = new CharArrayLookaheadReader
124124

125+
def lookaheadChar(): Char = lookaheadReader().getc()
126+
125127
class CharArrayLookaheadReader extends CharArrayReader {
126128
val buf: Array[Char] = self.buf
127129
charOffset = self.charOffset

compiler/src/dotty/tools/dotc/parsing/JavaScanners.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package dotc
33
package parsing
44

55
import core.Contexts._
6+
import core.Names.SimpleName
67
import Scanners._
78
import util.SourceFile
89
import JavaTokens._
@@ -13,8 +14,10 @@ object JavaScanners {
1314

1415
class JavaScanner(source: SourceFile, override val startFrom: Offset = 0)(implicit ctx: Context) extends ScannerCommon(source)(ctx) {
1516

16-
def toToken(idx: Int): Token =
17+
def toToken(name: SimpleName): Token = {
18+
val idx = name.start
1719
if (idx >= 0 && idx <= lastKeywordStart) kwArray(idx) else IDENTIFIER
20+
}
1821

1922
private class JavaTokenData0 extends TokenData
2023

0 commit comments

Comments
 (0)