summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2014-07-14 08:02:41 -0700
committerSom Snytt <som.snytt@gmail.com>2014-07-14 20:35:10 -0700
commit146bdd7073e1184af36d3378595297f3cb92bccf (patch)
treeecd8f1c37a21ffbf7bcb7e0f226e7852f84b2d69
parentb0dd01ebb4b0cc41a6629357522217bfe14821fb (diff)
downloadscala-146bdd7073e1184af36d3378595297f3cb92bccf.tar.gz
scala-146bdd7073e1184af36d3378595297f3cb92bccf.tar.bz2
scala-146bdd7073e1184af36d3378595297f3cb92bccf.zip
SI-8608 f-interpolator inlines StringOps
Instead of "hi".format(), emit new _root_.s.c.i.StringOps("hi").format(), to clarify intent and avoid picking up some other implicit enhancement. A further optimization would be to use String.format directly when that is possible. The ticket says it is not possible for ``` f"${BigDecimal(3.4)}%e" ```
-rw-r--r--src/compiler/scala/tools/reflect/FormatInterpolator.scala14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/reflect/FormatInterpolator.scala b/src/compiler/scala/tools/reflect/FormatInterpolator.scala
index 4fa06be60f..b445f1e2bb 100644
--- a/src/compiler/scala/tools/reflect/FormatInterpolator.scala
+++ b/src/compiler/scala/tools/reflect/FormatInterpolator.scala
@@ -182,15 +182,23 @@ abstract class FormatInterpolator {
case (part, n) => copyPart(part, n)
}
- //q"{..$evals; ${fstring.toString}.format(..$ids)}"
+ //q"{..$evals; new StringOps(${fstring.toString}).format(..$ids)}"
val format = fstring.toString
if (ids.isEmpty && !format.contains("%")) Literal(Constant(format))
else {
+ val scalaPackage = Select(Ident(nme.ROOTPKG), TermName("scala"))
+ val newStringOps = Select(
+ New(Select(Select(Select(scalaPackage,
+ TermName("collection")), TermName("immutable")), TypeName("StringOps"))),
+ termNames.CONSTRUCTOR
+ )
val expr =
Apply(
Select(
- Literal(Constant(format)),
- newTermName("format")),
+ Apply(
+ newStringOps,
+ List(Literal(Constant(format)))),
+ TermName("format")),
ids.toList
)
val p = c.macroApplication.pos