Skip to content

Commit db61523

Browse files
authored
Merge pull request #161 from allanrenucci/xml
Disable Xml Rewrite in pattern position
2 parents 13635e7 + 0f6db25 commit db61523

File tree

4 files changed

+37
-25
lines changed

4 files changed

+37
-25
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ lazy val testkit = project
221221

222222
lazy val testsDeps = List(
223223
// integration property tests
224-
"org.renucci" %% "scala-xml-quote" % "0.1.3",
224+
"org.renucci" %% "scala-xml-quote" % "0.1.4",
225225
"org.typelevel" %% "catalysts-platform" % "0.0.5",
226226
"com.typesafe.slick" %% "slick" % "3.2.0-M2",
227227
"com.chuusai" %% "shapeless" % "2.3.2",

scalafix-core/src/main/scala/scalafix/rewrite/RemoveXmlLiterals.scala

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package rewrite
33

44
import scala.meta._
55

6-
/** Rewrite Xml Literal to Xml Interpolator
6+
/** Rewrite Xml Literal to Xml Interpolator.
77
*
88
* e.g.
99
* {{{
@@ -13,20 +13,16 @@ import scala.meta._
1313
* // after:
1414
* xml"<div>${ "Hello" }</div>"
1515
* }}}
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>`.
1620
*/
1721
case object RemoveXmlLiterals extends Rewrite {
1822

1923
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-
}
2824

29-
def isMultiLine(xml: Tree) =
25+
def isMultiLine(xml: Term.Xml) =
3026
xml.pos.start.line != xml.pos.end.line
3127

3228
/** Contains '"' or '\' */
@@ -36,7 +32,7 @@ case object RemoveXmlLiterals extends Rewrite {
3632
}
3733

3834
/** Rewrite xml literal to interpolator */
39-
def patchXml(xml: Tree, tripleQuoted: Boolean) = {
35+
def patchXml(xml: Term.Xml, tripleQuoted: Boolean) = {
4036

4137
// We don't want to patch inner xml literals multiple times
4238
def removeSplices(tokens: Tokens) = {
@@ -54,16 +50,20 @@ case object RemoveXmlLiterals extends Rewrite {
5450
}
5551
}
5652

57-
/** Substitute {{ by { */
53+
/** Substitute {{ by { and }} by } */
5854
def patchEscapedBraces(tok: Token.Xml.Part) = {
5955
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.
6359
""".stripMargin,
6460
tok.pos
6561
)
66-
ctx.replaceToken(tok, tok.value.replaceAllLiterally("{{", "{"))
62+
63+
val patched = tok.value
64+
.replaceAllLiterally("{{", "{")
65+
.replaceAllLiterally("}}", "}")
66+
ctx.replaceToken(tok, patched)
6767
}
6868

6969
removeSplices(xml.tokens).collect {
@@ -86,7 +86,7 @@ case object RemoveXmlLiterals extends Rewrite {
8686
var patch = Patch.empty
8787
if (part.contains('$'))
8888
patch += ctx.replaceToken(tok, part.replaceAllLiterally("$", "$$"))
89-
if (part.contains("{{"))
89+
if (part.contains("{{") || part.contains("}}"))
9090
patch += patchEscapedBraces(tok)
9191
patch
9292

@@ -108,7 +108,7 @@ case object RemoveXmlLiterals extends Rewrite {
108108
}
109109

110110
val patch = ctx.tree.collect {
111-
case xml @ Xml(parts) =>
111+
case xml @ Term.Xml(parts, _) =>
112112
val tripleQuoted = isMultiLine(xml) || parts.exists(
113113
containsEscapeSequence)
114114
patchXml(xml, tripleQuoted)

scalafix-tests/input/src/main/scala/test/RemoveXmlLiterals.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,21 @@ class RemoveXmlLiterals {
4545
}
4646

4747
object I {
48-
<div>{{</div>
48+
val a = <div>{{</div>
49+
val b = <div>}}</div>
50+
// <div b="{{"/> >>> xml"""<div b="{{"/>"""
4951
}
5052

5153
object J {
52-
<div b="{{"/>
54+
<a>{1}{2}</a>
5355
}
5456

5557
object K {
56-
<a>{1}{2}</a>
58+
null match { case <a></a> => }
59+
}
60+
61+
object L {
62+
null match { case <a>{_*}</a> => }
5763
}
5864

5965
}

scalafix-tests/output/src/main/scala/test/RemoveXmlLiterals.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,21 @@ class RemoveXmlLiterals {
4343
}
4444

4545
object I {
46-
xml"<div>{</div>"
46+
val a = xml"<div>{</div>"
47+
val b = xml"<div>}</div>"
48+
// <div b="{{"/> >>> xml"""<div b="{{"/>"""
4749
}
4850

4951
object J {
50-
xml"""<div b="{"/>"""
52+
xml"<a>${1}${2}</a>"
5153
}
5254

5355
object K {
54-
xml"<a>${1}${2}</a>"
56+
null match { case <a></a> => }
57+
}
58+
59+
object L {
60+
null match { case <a>{_*}</a> => }
5561
}
5662

5763
}

0 commit comments

Comments
 (0)