Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 01c5bac

Browse files
committed
Add test for SI-9010
This is extremely ugly (not only does it use reflection, is uses Java reflection with hard-coded mangled symbol name because of a bug in Scala reflection), but I don't know of a better solution. :-(
1 parent 72ea0d7 commit 01c5bac

File tree

1 file changed

+51
-0
lines changed
  • src/test/scala/scala/util/parsing/combinator

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import scala.util.parsing.combinator._
2+
import scala.util.DynamicVariable
3+
4+
import org.junit.Test
5+
6+
class t9010 {
7+
@Test
8+
def test: Unit = {
9+
val p = new grammar
10+
val lastNoSuccessVar = getLastNoSuccessVar(p)
11+
import p._
12+
13+
val res1 = parse(x, "x")
14+
assert(res1.successful)
15+
assert(lastNoSuccessVar.value == None)
16+
17+
val res2 = parse(x, "y")
18+
assert(!res2.successful)
19+
assert(lastNoSuccessVar.value == None)
20+
21+
val res3 = parseAll(x, "x")
22+
assert(res3.successful)
23+
assert(lastNoSuccessVar.value == None)
24+
25+
val res4 = parseAll(x, "y")
26+
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+
*/
46+
}
47+
48+
private final class grammar extends RegexParsers {
49+
val x: Parser[String] = "x"
50+
}
51+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /