diff options
author | Som Snytt <som.snytt@gmail.com> | 2014-07-14 08:02:41 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2014-07-14 20:35:10 -0700 |
commit | 146bdd7073e1184af36d3378595297f3cb92bccf (patch) | |
tree | ecd8f1c37a21ffbf7bcb7e0f226e7852f84b2d69 | |
parent | b0dd01ebb4b0cc41a6629357522217bfe14821fb (diff) | |
download | scala-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.scala | 14 |
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 |