diff options
author | Martin Odersky <odersky@gmail.com> | 2011-10-10 13:53:09 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2011-10-10 13:53:09 +0000 |
commit | d08296f0639e9d97281dc0cdfe88dcf207941995 (patch) | |
tree | 91da5d6d176166de797e857d8486d49e0d0e3e73 /src/compiler/scala/tools/nsc/ast/parser/Parsers.scala | |
parent | 4e86106b5b0637aa88de2e3d5a8751d918e4c069 (diff) | |
download | scala-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.scala | 31 |
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())) |