diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-03-20 16:09:04 +0100 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-04-27 15:33:20 +0200 |
commit | a8edefcef8905ed3487c7293056f6d0946e79dd7 (patch) | |
tree | 2bcf87b30a70492f4586d2e1dbb98a11bc626223 | |
parent | 403ba8938f115215700e677523d91710c20b6be4 (diff) | |
download | scala-a8edefcef8905ed3487c7293056f6d0946e79dd7.tar.gz scala-a8edefcef8905ed3487c7293056f6d0946e79dd7.tar.bz2 scala-a8edefcef8905ed3487c7293056f6d0946e79dd7.zip |
SI-7271 fixes positions of string interpolation parts
Positions of static parts are now set explicitly during parsing rather
than filled in wholesale during subsequent atPos after parsing.
I also had to change the offsets that scanner uses for initial static
parts of string interpolations so that they no longer point to the
opening double quote, but rather to the actual beginning of the part.
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/Parsers.scala | 4 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/Scanners.scala | 2 | ||||
-rw-r--r-- | test/files/neg/t5510.check | 6 | ||||
-rw-r--r-- | test/files/neg/t5856.check | 2 | ||||
-rw-r--r-- | test/files/run/t7271.check | 12 | ||||
-rw-r--r-- | test/files/run/t7271.scala | 34 |
6 files changed, 54 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index 6f79f639b9..9c936ea2c5 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -1152,7 +1152,7 @@ self => val exprBuf = new ListBuffer[Tree] in.nextToken() while (in.token == STRINGPART) { - partsBuf += literal() + partsBuf += atPos(in.offset)(literal()) exprBuf += { if (inPattern) dropAnyBraces(pattern()) else { @@ -1166,7 +1166,7 @@ self => } } } - if (in.token == STRINGLIT) partsBuf += literal() + if (in.token == STRINGLIT) partsBuf += atPos(in.offset)(literal()) val t1 = atPos(o2p(start)) { Ident(nme.StringContext) } val t2 = atPos(start) { Apply(t1, partsBuf.toList) } diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala index c05906c740..1aa50be83a 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala @@ -425,6 +425,7 @@ trait Scanners extends ScannersCommon { if (ch == '\"') { nextRawChar() if (ch == '\"') { + offset += 3 nextRawChar() getStringPart(multiLine = true) sepRegions = STRINGPART :: sepRegions // indicate string part @@ -434,6 +435,7 @@ trait Scanners extends ScannersCommon { strVal = "" } } else { + offset += 1 getStringPart(multiLine = false) sepRegions = STRINGLIT :: sepRegions // indicate single line string part } diff --git a/test/files/neg/t5510.check b/test/files/neg/t5510.check index 04220e79bb..322a2f5e25 100644 --- a/test/files/neg/t5510.check +++ b/test/files/neg/t5510.check @@ -1,15 +1,15 @@ t5510.scala:2: error: unclosed string literal val s1 = s"xxx - ^ + ^ t5510.scala:3: error: unclosed string literal val s2 = s"xxx $x ^ t5510.scala:4: error: unclosed string literal val s3 = s"xxx $$ - ^ + ^ t5510.scala:5: error: unclosed string literal val s4 = ""s" - ^ + ^ t5510.scala:6: error: unclosed multi-line string literal val s5 = ""s""" $s1 $s2 s" ^ diff --git a/test/files/neg/t5856.check b/test/files/neg/t5856.check index ac49d4b9ac..08a61bdc07 100644 --- a/test/files/neg/t5856.check +++ b/test/files/neg/t5856.check @@ -1,6 +1,6 @@ t5856.scala:10: error: invalid string interpolation: `$$', `$'ident or `$'BlockExpr expected val s9 = s"$" - ^ + ^ t5856.scala:10: error: unclosed string literal val s9 = s"$" ^ diff --git a/test/files/run/t7271.check b/test/files/run/t7271.check new file mode 100644 index 0000000000..01632eca2c --- /dev/null +++ b/test/files/run/t7271.check @@ -0,0 +1,12 @@ +[[syntax trees at end of parser]] // newSource1 +[0:91]package [0:0]<empty> { + [0:91]class C extends [8:91][91]scala.AnyRef { + [8]def <init>() = [8]{ + [8][8][8]super.<init>(); + [8]() + }; + [16:44]def quote = [28:44]<28:44><28:44>[28]StringContext([30:34]"foo", [40:44]"baz").s([35:39]this); + [51:85]def tripleQuote = [69:85]<69:85><69:85>[69]StringContext([71:75]"foo", [81:85]"baz").s([76:80]this) + } +} + diff --git a/test/files/run/t7271.scala b/test/files/run/t7271.scala new file mode 100644 index 0000000000..6fccf14d20 --- /dev/null +++ b/test/files/run/t7271.scala @@ -0,0 +1,34 @@ +import scala.tools.partest._ +import java.io._ +import scala.tools.nsc._ +import scala.tools.nsc.util.CommandLineParser +import scala.tools.nsc.{Global, Settings, CompilerCommand} +import scala.tools.nsc.reporters.ConsoleReporter + +object Test extends DirectTest { + + override def extraSettings: String = "-usejavacp -Xprint:parser -Ystop-after:parser -d " + testOutput.path + + override def code = """ + class C { + def quote = s"foo${this}baz" + def tripleQuote = s"foo${this}baz" + } + """.trim + + override def show(): Unit = { + // redirect err to out, for logging + val prevErr = System.err + System.setErr(System.out) + compile() + System.setErr(prevErr) + } + + override def newCompiler(args: String*): Global = { + + val settings = new Settings() + settings.Xprintpos.value = true + val command = new CompilerCommand((CommandLineParser tokenize extraSettings) ++ args.toList, settings) + new Global(command.settings, new ConsoleReporter(settings)) with interactive.RangePositions + } +} |