RFR: JDK-8227046: compiler implementation for sealed classes, JDK-8227047: Javadoc for sealed types and JDK-8227044: javax.lang.model for sealed classes

Jan Lahoda jan.lahoda at oracle.com
Tue May 19 12:44:34 UTC 2020


Hi Vicente,

javac changes look overall OK to me.

A few comments:
-the handling of non-sealed in JavacParser is fairly good, even though I 
wonder if handling it in the tokenizer would not be better. If I read 
the specification correctly, "non-sealed" is specified as a keyword, so 
the tokenizer would seem like a proper place to recognize it (when 
preview is enabled, etc.). So, I think this:
class NonSealed {
     {
         int non = 0;
         int sealed = 0;
         int c = non-sealed;
     }
}

should not compile, but it does. In any case, not sure if there are 
tests for broken/strange non-sealed, like "non -sealed", 
"non/**/-sealed", "non\u002Dsealed".

Also, the checks for 'non', '-', 'sealed' tokens is duplicated twice, it 
would be nicer to have this slightly complex code only once.

-parsing of permitted classes allows parameterized types, while it, I 
guess, should not. I.e. it appears javac compiles this without producing 
compile-time errors:
public sealed class Sealed1 permits I<String>  {
}
final class I<T> extends Sealed1 {}

-in ClassReader:
new AttributeReader(names.PermittedSubclasses, V58, CLASS_ATTRIBUTE)
that should use V59?

-I appreciate the error recovery for using "sealed/non-sealed" for local 
classes, but I wonder if there's something we could do when "sealed" is 
used without --enable-preview (for local and non-local 
classes/interfaces). Maybe if "sealed" is followed by another modifier, 
'@', 'class' or 'interface', we can produce a better errors? (But we can 
work on that later.)

-regarding TypeElement#getPermittedSubclasses: it currently returns 
List<? extends TypeMirror>; I wonder if returning List<? extends 
TypeElement> would be better?

-not sure if I prefer the "invalid permits clause" errors like:
---
DuplicateTypeInPermits.java:30: error: invalid permits clause
sealed class Sealed permits Sub, Sub {}
                             ^
   (must not contain duplicates: Sub)
---

something like:
---
DuplicateTypeInPermits.java:30: error: repeated permitted type
sealed class Sealed permits Sub, Sub {}
                                  ^
---

might work as well.

-nit: ClassTree#getPermitsClause() could use List.of(), instead of 
Collections.emptyList();

Thanks,
     Jan

On 19. 05. 20 0:42, Vicente Romero wrote:
> Hi,
> 
> Please review this patch for the compiler, javadoc and javax.lang.model 
> support for the JEP 360 Sealed Classes (Preview). The changes are 
> provided at [1], which implements the latest JLS for sealed types [2]. 
> The patch also include the needed changes to javadoc and 
> javax.lang.model to support sealed types. The CSR witht the changes in 
> the javax.lang.model spec is at [3]. The sealed types JEP is accessible 
> at [4]. There is an ongoing review for the VM and core-libs code of 
> sealed types [5] and that code hasn't been included in this webrev,
> 
> Thanks,
> Vicente
> 
> [1] http://cr.openjdk.java.net/~vromero/8227046/webrev.00/
> [2] 
> http://cr.openjdk.java.net/~gbierman/jep360/jep360-20200513/specs/sealed-classes-jls.html 
> 
> [3] https://bugs.openjdk.java.net/browse/JDK-8244367
> [4] https://openjdk.java.net/jeps/360
> [5] 
> https://mail.openjdk.java.net/pipermail/core-libs-dev/2020-May/066440.html


More information about the core-libs-dev mailing list