summaryrefslogtreecommitdiff
path: root/test/files/run/t7741b
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-03-02 15:48:25 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-03-25 11:59:54 +1000
commitbbd693ae44bab4be2be7930641f8ca2bf27c962c (patch)
tree5a9acd0c2d3e201f0c616e2ee3f359b22218924e /test/files/run/t7741b
parent52d4a5ac00af05648d3afae79b7428ef19ae5c21 (diff)
downloadscala-bbd693ae44bab4be2be7930641f8ca2bf27c962c.tar.gz
scala-bbd693ae44bab4be2be7930641f8ca2bf27c962c.tar.bz2
scala-bbd693ae44bab4be2be7930641f8ca2bf27c962c.zip
SI-7741 Tread more lightly during classfile parsing
1. Avoid forcing info of non-Scala interface members This avoids parsing the ostensibly malformed class definitions that correspond to a Groovy lambda defined in an interface. 2. Be more tolerant of absent inner classfiles Taking a leaf out of javac's book (see transcript below), we can use stub symbols for InnerClass entries that don't have corresponding class files on the compilation classpath. This will limit failures to code that directly refers to the inner class, rather than any code that simply refers to the enclosing class. It seems that groovyc has a habit of emitting incongrous bytecode in this regard. But this change seems generally useful. ``` % cat sandbox/{Test,Client}.java public class Test { public class Inner {} } public class Client { public Test.Inner x() { return null; } } % javac -d . sandbox/Test.java && javac -classpath . sandbox/Client.java % javac -d . sandbox/Test.java && rm 'Test$Inner.class' && javac -classpath . sandbox/Client.java sandbox/Client.java:2: error: cannot access Inner public Test.Inner x() { return null; } ^ class file for Test$Inner not found 1 error % cat sandbox/{Test,Client}.java public class Test { public class Inner {} } public class Client { public Test.NeverExisted x() { return null; } } % javac -classpath . sandbox/Client.java sandbox/Client.java:2: error: cannot find symbol public Test.NeverExisted x() { return null; } ^ symbol: class NeverExisted location: class Test 1 error % cat sandbox/{Test,Client}.java public class Test { public class Inner {} } public class Client { public Test x() { return null; } } topic/groovy-interop ~/code/scala2 javac -d . sandbox/Test.java && rm 'Test$Inner.class' && javac -classpath . sandbox/Client.java # allowed ```
Diffstat (limited to 'test/files/run/t7741b')
-rw-r--r--test/files/run/t7741b/HasInner.java3
-rw-r--r--test/files/run/t7741b/Test.scala29
2 files changed, 32 insertions, 0 deletions
diff --git a/test/files/run/t7741b/HasInner.java b/test/files/run/t7741b/HasInner.java
new file mode 100644
index 0000000000..a1d0d0d81a
--- /dev/null
+++ b/test/files/run/t7741b/HasInner.java
@@ -0,0 +1,3 @@
+class HasInner {
+ class Inner {}
+}
diff --git a/test/files/run/t7741b/Test.scala b/test/files/run/t7741b/Test.scala
new file mode 100644
index 0000000000..569ae6b679
--- /dev/null
+++ b/test/files/run/t7741b/Test.scala
@@ -0,0 +1,29 @@
+import java.io.File
+
+import scala.tools.partest.StoreReporterDirectTest
+
+object Test extends StoreReporterDirectTest {
+
+ def code = ""
+
+ override def show(): Unit = {
+ deleteClass("HasInner$Inner")
+ println("1. Don't refer to Inner")
+ compileCode("class Test { def test(x: HasInner) = x }")
+ assert(filteredInfos.isEmpty, filteredInfos)
+ println("2. Refering to Inner")
+ compileCode("class Test { def test(x: HasInner#Inner) = x }")
+ println(filteredInfos.mkString("\n"))
+ }
+
+ def deleteClass(name: String) {
+ val classFile = new File(testOutput.path, name + ".class")
+ assert(classFile.exists)
+ assert(classFile.delete())
+ }
+
+ def compileCode(code: String) = {
+ val classpath = List(sys.props("partest.lib"), testOutput.path) mkString sys.props("path.separator")
+ compileString(newCompiler("-cp", classpath, "-d", testOutput.path))(code)
+ }
+}