@@ -3,7 +3,7 @@ package rewrite
3
3
4
4
import scala .meta ._
5
5
6
- /** Rewrite Xml Literal to Xml Interpolator
6
+ /** Rewrite Xml Literal to Xml Interpolator.
7
7
*
8
8
* e.g.
9
9
* {{{
@@ -13,20 +13,16 @@ import scala.meta._
13
13
* // after:
14
14
* xml"<div>${ "Hello" }</div>"
15
15
* }}}
16
+ *
17
+ * This only rewrites xml literals in expression position:
18
+ * Xml patterns will not be supported by the xml interpolator,
19
+ * until we know how to rewrite `case <a>{ns @ _*}</a>`.
16
20
*/
17
21
case object RemoveXmlLiterals extends Rewrite {
18
22
19
23
override def rewrite (ctx : RewriteCtx ): Patch = {
20
- object Xml {
21
- def unapply (tree : Tree ): Option [Seq [Lit ]] =
22
- tree match {
23
- case Pat .Xml (parts, _) => Some (parts)
24
- case Term .Xml (parts, _) => Some (parts)
25
- case _ => None
26
- }
27
- }
28
24
29
- def isMultiLine (xml : Tree ) =
25
+ def isMultiLine (xml : Term . Xml ) =
30
26
xml.pos.start.line != xml.pos.end.line
31
27
32
28
/** Contains '"' or '\' */
@@ -36,7 +32,7 @@ case object RemoveXmlLiterals extends Rewrite {
36
32
}
37
33
38
34
/** Rewrite xml literal to interpolator */
39
- def patchXml (xml : Tree , tripleQuoted : Boolean ) = {
35
+ def patchXml (xml : Term . Xml , tripleQuoted : Boolean ) = {
40
36
41
37
// We don't want to patch inner xml literals multiple times
42
38
def removeSplices (tokens : Tokens ) = {
@@ -54,16 +50,20 @@ case object RemoveXmlLiterals extends Rewrite {
54
50
}
55
51
}
56
52
57
- /** Substitute {{ by { */
53
+ /** Substitute {{ by { and }} by } */
58
54
def patchEscapedBraces (tok : Token .Xml .Part ) = {
59
55
ctx.reporter.warn(
60
- """ Single opening braces don't need be escaped with {{ inside the xml interpolator,
61
- |unlike xml literals. For example <x>{{</x> is identical to xml"<x>{</x>".
62
- |This Rewrite will replace all occurrences of {{. Make sure this is intended.
56
+ """ Single braces don't need be escaped with {{ and }} inside the xml interpolator, unlike xml literals.
57
+ |For example <x>{{</x> is identical to xml"<x>{</x>".
58
+ |This Rewrite will replace all occurrences of {{ and }} . Make sure this is intended.
63
59
""" .stripMargin,
64
60
tok.pos
65
61
)
66
- ctx.replaceToken(tok, tok.value.replaceAllLiterally(" {{" , " {" ))
62
+
63
+ val patched = tok.value
64
+ .replaceAllLiterally(" {{" , " {" )
65
+ .replaceAllLiterally(" }}" , " }" )
66
+ ctx.replaceToken(tok, patched)
67
67
}
68
68
69
69
removeSplices(xml.tokens).collect {
@@ -86,7 +86,7 @@ case object RemoveXmlLiterals extends Rewrite {
86
86
var patch = Patch .empty
87
87
if (part.contains('$' ))
88
88
patch += ctx.replaceToken(tok, part.replaceAllLiterally(" $" , " $$" ))
89
- if (part.contains(" {{" ))
89
+ if (part.contains(" {{" ) || part.contains( " }} " ) )
90
90
patch += patchEscapedBraces(tok)
91
91
patch
92
92
@@ -108,7 +108,7 @@ case object RemoveXmlLiterals extends Rewrite {
108
108
}
109
109
110
110
val patch = ctx.tree.collect {
111
- case xml @ Xml (parts) =>
111
+ case xml @ Term . Xml (parts, _ ) =>
112
112
val tripleQuoted = isMultiLine(xml) || parts.exists(
113
113
containsEscapeSequence)
114
114
patchXml(xml, tripleQuoted)
0 commit comments