From 49f67a1791b424cd1869572b7716355887bfa3da Mon Sep 17 00:00:00 2001 From: xuwei-k <6b656e6a69@gmail.com> Date: Wed, 30 Sep 2020 23:20:45 +0900 Subject: [PATCH] read JEP 360 PermittedSubclasses_attribute. --- .../scala/tools/nsc/symtab/classfile/ClassfileParser.scala | 7 +++++++ src/compiler/scala/tools/nsc/typechecker/Namers.scala | 6 ++++++ src/reflect/scala/reflect/internal/Flags.scala | 1 + src/reflect/scala/reflect/internal/HasFlags.scala | 1 + src/reflect/scala/reflect/internal/StdNames.scala | 1 + 5 files changed, 16 insertions(+) diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 42abf42fb7fe..ff13fe859ff0 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -912,6 +912,13 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) { } in.skip(attrLen) + case tpnme.PermittedSubclassesATTR => + // https://openjdk.java.net/jeps/360 + log(s"$sym is java sealed.") + sym setFlag JAVA_SEALED + // TODO read permitted sub classes? + in.skip(attrLen) + case _ => in.skip(attrLen) } diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 9d4a6ea69fab..7cec8a0aaec3 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -1182,6 +1182,12 @@ trait Namers extends MethodSynthesis { psym addChild context.owner else pending += ParentSealedInheritanceError(tpt, psym) + + if (psym.isJavaSealed) { + // TODO Don't report error if this is a permitted subclass + pending += ParentSealedInheritanceError(tpt, psym) + } + if (psym.isLocalToBlock && psym.isClass && !phase.erasedTypes) psym addChild context.owner } diff --git a/src/reflect/scala/reflect/internal/Flags.scala b/src/reflect/scala/reflect/internal/Flags.scala index f7a6571754ee..f978dd4995bf 100644 --- a/src/reflect/scala/reflect/internal/Flags.scala +++ b/src/reflect/scala/reflect/internal/Flags.scala @@ -129,6 +129,7 @@ class ModifierFlags { final val JAVA_DEFAULTMETHOD = 1L << 47 // symbol is a java default method final val JAVA_ENUM = 1L << 48 // symbol is a java enum final val JAVA_ANNOTATION = 1L << 49 // symbol is a java annotation + final val JAVA_SEALED = 1L << 50 // symbol is a java sealed // Overridden. def flagToString(flag: Long): String = "" diff --git a/src/reflect/scala/reflect/internal/HasFlags.scala b/src/reflect/scala/reflect/internal/HasFlags.scala index b298a6954af1..ee5f8fddd81f 100644 --- a/src/reflect/scala/reflect/internal/HasFlags.scala +++ b/src/reflect/scala/reflect/internal/HasFlags.scala @@ -133,6 +133,7 @@ trait HasFlags { def isSynthetic = hasFlag(SYNTHETIC) def isTrait = hasFlag(TRAIT) && !hasFlag(PARAM) def isTraitOrInterface = isTrait || isInterface + def isJavaSealed = hasFlag(JAVA_SEALED) def flagBitsToString(bits: Long): String = { // Fast path for common case diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala index 71f94aed6e86..3e1fa990d032 100644 --- a/src/reflect/scala/reflect/internal/StdNames.scala +++ b/src/reflect/scala/reflect/internal/StdNames.scala @@ -313,6 +313,7 @@ trait StdNames { final val SignatureATTR: NameType = nameType("Signature") final val SourceFileATTR: NameType = nameType("SourceFile") final val SyntheticATTR: NameType = nameType("Synthetic") + final val PermittedSubclassesATTR: NameType = nameType("PermittedSubclasses") final val scala_ : NameType = nameType("scala")