Skip to content

Commit be861c7

Browse files
authored
Merge pull request #108 from svalaskevicius/remove-lastNoSuccessVar
remove lastNoSuccessVar
2 parents 7bd8048 + df4b17b commit be861c7

File tree

3 files changed

+9
-44
lines changed

3 files changed

+9
-44
lines changed

Diff for: jvm/src/test/scala/scala/util/parsing/combinator/t9010.scala

-23
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,19 @@ class t9010 {
77
@Test
88
def test: Unit = {
99
val p = new grammar
10-
val lastNoSuccessVar = getLastNoSuccessVar(p)
1110
import p._
1211

1312
val res1 = parse(x, "x")
1413
assert(res1.successful)
15-
assert(lastNoSuccessVar.value == None)
1614

1715
val res2 = parse(x, "y")
1816
assert(!res2.successful)
19-
assert(lastNoSuccessVar.value == None)
2017

2118
val res3 = parseAll(x, "x")
2219
assert(res3.successful)
23-
assert(lastNoSuccessVar.value == None)
2420

2521
val res4 = parseAll(x, "y")
2622
assert(!res4.successful)
27-
assert(lastNoSuccessVar.value == None)
28-
}
29-
30-
private def getLastNoSuccessVar(p: Parsers): DynamicVariable[Option[_]] = {
31-
// use java reflection instead of scala (see below) because of
32-
// https://issues.scala-lang.org/browse/SI-9306
33-
val fn = "scala$util$parsing$combinator$Parsers$$lastNoSuccessVar"
34-
val f = p.getClass.getDeclaredMethod(fn)
35-
f.setAccessible(true)
36-
f.invoke(p).asInstanceOf[DynamicVariable[Option[_]]]
37-
38-
/*
39-
val ru = scala.reflect.runtime.universe
40-
val mirror = ru.runtimeMirror(getClass.getClassLoader)
41-
val lastNoSuccessVarField =
42-
ru.typeOf[Parsers].decl(ru.TermName("lastNoSuccessVar")).asTerm.accessed.asTerm
43-
mirror.reflect(p).reflectField(lastNoSuccessVarField).get.
44-
asInstanceOf[DynamicVariable[Option[_]]]
45-
*/
4623
}
4724

4825
private final class grammar extends RegexParsers {

Diff for: shared/src/main/scala/scala/util/parsing/combinator/Parsers.scala

+5-19
Original file line numberDiff line numberDiff line change
@@ -156,20 +156,10 @@ trait Parsers {
156156
val successful = true
157157
}
158158

159-
/* two layers of Option:
160-
* outer Option is None if lastNoSuccess tracking is disabled (outside of
161-
* phrase) and Some if tracking is enabled
162-
* inner Option is None if NoSuccess hasn't been seen yet, Some otherwise
163-
* this is necessary to avoid leaking NoSuccesses in thread locals */
164-
private lazy val lastNoSuccessVar = new DynamicVariable[Option[Option[NoSuccess]]](None)
165-
166159
/** A common super-class for unsuccessful parse results. */
167160
sealed abstract class NoSuccess(val msg: String, override val next: Input) extends ParseResult[Nothing] { // when we don't care about the difference between Failure and Error
168161
val successful = false
169162

170-
if (lastNoSuccessVar.value exists (_ forall (v => !(next.pos < v.next.pos))))
171-
lastNoSuccessVar.value = Some(Some(this))
172-
173163
def map[U](f: Nothing => U) = this
174164
def mapPartial[U](f: PartialFunction[Nothing, U], error: Nothing => String): ParseResult[U] = this
175165

@@ -913,15 +903,11 @@ trait Parsers {
913903
* if `p` consumed all the input.
914904
*/
915905
def phrase[T](p: Parser[T]) = new Parser[T] {
916-
def apply(in: Input) = lastNoSuccessVar.withValue(Some(None)) {
917-
p(in) match {
918-
case s @ Success(out, in1) =>
919-
if (in1.atEnd)
920-
s
921-
else
922-
lastNoSuccessVar.value flatMap (_ filterNot { _.next.pos < in1.pos }) getOrElse Failure("end of input expected", in1)
923-
case ns => lastNoSuccessVar.value.flatten.getOrElse(ns)
924-
}
906+
def apply(in: Input) = p(in) match {
907+
case s @ Success(out, in1) =>
908+
if (in1.atEnd) s
909+
else Failure("end of input expected", in1)
910+
case ns => ns
925911
}
926912
}
927913

Diff for: shared/src/test/scala/scala/util/parsing/combinator/JavaTokenParsersTest.scala

+4-2
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class JavaTokenParsersTest {
4747
parseSuccess("with_")
4848
parseSuccess("_with")
4949

50+
parseFailure("", 1)
5051
parseFailure("3start", 1)
5152
parseFailure("-start", 1)
5253
parseFailure("with-s", 5)
@@ -72,8 +73,9 @@ class JavaTokenParsersTest {
7273
val parseResult1 = parseAll(p, "start start")
7374
parseResult1 match {
7475
case e @ Failure(message, next) =>
76+
assertEquals(next.pos.line, 1)
7577
assertEquals(next.pos.column, 7)
76-
assert(message.endsWith("string matching regex '(?i)AND' expected but 's' found"))
78+
assert(message.endsWith(s"end of input expected"))
7779
case _ => sys.error(parseResult1.toString)
7880
}
7981

@@ -97,7 +99,7 @@ class JavaTokenParsersTest {
9799
case Failure(message, next) =>
98100
assertEquals(next.pos.line, 1)
99101
assertEquals(next.pos.column, 1)
100-
assert(message.endsWith(s"identifier expected but '-' found"))
102+
assert(message.endsWith(s"end of input expected"))
101103
case _ => sys.error(parseResult.toString)
102104
}
103105

0 commit comments

Comments
 (0)