diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2015-06-19 20:28:40 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2015-06-19 21:07:39 +0200 |
commit | 63812c18b23de60039fd3267e4806449ea679972 (patch) | |
tree | 9071968f72064df97f565f31cd9364b84324c1f5 /test/files/run/t9359/A_1.java | |
parent | 305dd96c08041e9fa096cd56dfc4de80284e6fba (diff) | |
download | scala-63812c18b23de60039fd3267e4806449ea679972.tar.gz scala-63812c18b23de60039fd3267e4806449ea679972.tar.bz2 scala-63812c18b23de60039fd3267e4806449ea679972.zip |
SI-9359 Fix InnerClass entry flags for nested Java enums
The access flags in InnerClass entries for nested Java enums were
basically completely off.
A first step is to use the recently introduced backend method
`javaClassfileFlags`, which is now moved to BCodeAsmCommon.
See its doc for an explanation.
Then the flags of the enum class symbol were off. An enum is
- final if none of its values has a class body
- abstract if it has an abstract method
(https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9)
When using the ClassfileParser:
- ENUM was never added. I guess that's just an oversight.
- ABSTRACT (together with SEALED) was always added. This is to
enable exhaustiveness checking, see 3f7b8b5. This is a hack and we
have to go through the class members in the backend to find out if
the enum actually has the `ACC_ABSTRACT` flag or not.
When using the JavaParser:
- FINAL was never added.
- ABSTRACT was never added.
This commit fixes all of the above and tests cases (Java enum read
from the classfile and from source).
Diffstat (limited to 'test/files/run/t9359/A_1.java')
-rw-r--r-- | test/files/run/t9359/A_1.java | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/test/files/run/t9359/A_1.java b/test/files/run/t9359/A_1.java new file mode 100644 index 0000000000..3ac82ed55f --- /dev/null +++ b/test/files/run/t9359/A_1.java @@ -0,0 +1,19 @@ +public class A_1 { + // nested final + public static enum A1N_FINAL { + A1N_FINAL_VAL + } + + // nested, non-final + public enum A1N { + A1N_VAL { } // value has a body, so a class extending A1N is generated + } + + // nested, non-final, abstract + public enum A1N_ABSTRACT { + A1N_ABSTRACT_VAL { + void foo() { return; } + }; + abstract void foo(); // abstract member makes the enum class abstract + } +} |