summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-10-10 13:53:09 +0000
committerMartin Odersky <odersky@gmail.com>2011-10-10 13:53:09 +0000
commitd08296f0639e9d97281dc0cdfe88dcf207941995 (patch)
tree91da5d6d176166de797e857d8486d49e0d0e3e73 /src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
parent4e86106b5b0637aa88de2e3d5a8751d918e4c069 (diff)
downloadscala-d08296f0639e9d97281dc0cdfe88dcf207941995.tar.gz
scala-d08296f0639e9d97281dc0cdfe88dcf207941995.tar.bz2
scala-d08296f0639e9d97281dc0cdfe88dcf207941995.zip
String interpolation added as experimental feat...
String interpolation added as experimental feature. Review by extempore.
Diffstat (limited to 'src/compiler/scala/tools/nsc/ast/parser/Parsers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Parsers.scala31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
index 8955537345..787dde541d 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
@@ -9,7 +9,7 @@
package scala.tools.nsc
package ast.parser
-import scala.collection.mutable.ListBuffer
+import scala.collection.mutable.{ListBuffer, StringBuilder}
import util.{ SourceFile, OffsetPosition, FreshNameCreator }
import scala.reflect.internal.{ ModifierFlags => Flags }
import Tokens._
@@ -616,8 +616,8 @@ self =>
def isLiteralToken(token: Int) = token match {
case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
- STRINGLIT | SYMBOLLIT | TRUE | FALSE | NULL => true
- case _ => false
+ STRINGLIT | STRINGPART | SYMBOLLIT | TRUE | FALSE | NULL => true
+ case _ => false
}
def isLiteral = isLiteralToken(in.token)
@@ -1109,6 +1109,8 @@ self =>
}
if (in.token == SYMBOLLIT)
Apply(scalaDot(nme.Symbol), List(finish(in.strVal)))
+ else if (in.token == STRINGPART)
+ interpolatedString()
else finish(in.token match {
case CHARLIT => in.charVal
case INTLIT => in.intVal(isNegated).toInt
@@ -1125,6 +1127,27 @@ self =>
})
}
+ private def stringOp(t: Tree, op: TermName) = {
+ val str = in.strVal
+ in.nextToken()
+ if (str.isEmpty) t
+ else atPos(t.pos.startOrPoint) {
+ Apply(Select(t, op), List(Literal(Constant(str))))
+ }
+ }
+
+ private def interpolatedString(): Tree = {
+ var t = atPos(o2p(in.offset))(New(TypeTree(definitions.StringBuilderClass.tpe), List(List())))
+ while (in.token == STRINGPART) {
+ t = stringOp(t, nme.append)
+ var e = expr()
+ if (in.token == STRINGFMT) e = stringOp(e, nme.formatted)
+ t = atPos(t.pos.startOrPoint)(Apply(Select(t, nme.append), List(e)))
+ }
+ if (in.token == STRINGLIT) t = stringOp(t, nme.append)
+ atPos(t.pos)(Select(t, nme.toString_))
+ }
+
/* ------------- NEW LINES ------------------------------------------------- */
def newLineOpt() {
@@ -1812,7 +1835,7 @@ self =>
in.nextToken()
atPos(start, start) { Ident(nme.WILDCARD) }
case CHARLIT | INTLIT | LONGLIT | FLOATLIT | DOUBLELIT |
- STRINGLIT | SYMBOLLIT | TRUE | FALSE | NULL =>
+ STRINGLIT | STRINGPART | SYMBOLLIT | TRUE | FALSE | NULL =>
atPos(start) { literal(false) }
case LPAREN =>
atPos(start)(makeParens(noSeq.patterns()))