PreviewFeature on packages and modules
Jonathan Gibbons
jonathan.gibbons at oracle.com
Thu Feb 4 01:57:04 UTC 2021
On 2/3/21 2:58 PM, Alex Buckley wrote:
> On 2/3/2021 1:30 PM, Jan Lahoda wrote:
>> One thing to note here is e.g. @Deprecated on a package does not
>> automatically deprecate the classes belonging to the given package.
>> Here, we have a package annotated with @PreviewFeature, but not a
>> class annotated as a preview feature, and the preview flag is not
>> propagated from packages to classes, similarly to the deprecated
>> flag. But we can surely make this particular flag to propagate to the
>> classes in the package, if desired.
>
> Thanks for the info. I agree that a package being annotated with
> @PreviewFeature is misleading, since like package deprecation, it's a
> no-op. However, a module being annotated with @PreviewFeature ought to
> have a visible effect if another module `requires` it. If Nikita puts
> Main.java in a module that `requires jdk.neshkeev`, then I'd expect a
> warning/error.
>
> This thread is really about whether explicitly designating a module as
> a preview API implicitly designates every class within the module as a
> preview API. JEP 12 doesn't directly answer that question. It only
> says that every class within the preview module is "participating",
> and what happens if a class _explicitly_ designated as preview is used
> by other code.
>
> The other way of asking the question is: Should a preview module be
> able to contain non-preview classes? (Where every preview class in the
> module would be marked with @PreviewFeature, and any class not so
> marked would be non-preview.) First issue: you could "silently" use
> such non-preview classes from code on the classpath without a
> `requires` clause to trigger a warning/error for use of the preview
> module itself. This "silent" use feels undesirable, given the preview
> module's non-final status. Second issue: preview classes and
> non-preview classes could live in the same package (since preview
> classes aren't forced into a dedicated namespace like incubating
> classes) -- that's legitimate when a few preview classes are added to
> a classic package in java.base, but we didn't really envisage a
> handful of non-preview classes hanging out in a vast crowd of preview
> classes in a preview module.
>
> In sum, there's a strong case for saying that everything in a preview
> module has preview status. (Where marking anything in the module with
> @PreviewFeature is legal but redundant.) This would be convenient for
> preview API designers, who could write @PreviewFeature once and have
> it trickle down.
>
> I suspect this is either very painful to implement in javac/javadoc,
> or very easy. Jan, please tell us which! :-)
I would expect this to be almost-zero cost in javadoc, since javadoc
leverages javac. For javac, I'll leave Jan to give the definitive
answer, but I would expect it to be easy since every class knows its
enclosing package and module.
-- Jon
>
> Alex
>
>>> On 2/3/2021 8:00 AM, Nikita Eshkeev wrote:
>>>> The PreviewFeature
>>>> (https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java
>>>> <https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java>)
>>>> annotation can be applied to modules and packages. But I don't get
>>>> any compile-time errors/warnings when I try to use code that is
>>>> inside of either a package or a module that is annotated with
>>>> PreviewFeature.
>>>> What I did
>>>> 1. I added a new module to openjdk with the "jdk.neshkeev" name
>>>> 2. I added module-info.java, package-info.java and
>>>> MyPreviewClass.java (which is just an empty class)
>>>> 3. I annotated both module-info.java and package-info.java with
>>>> PreviewFeature
>>>> 4. I exported jdk.internal.javac package to jdk.neshkeev in
>>>> module-info.java of java.base
>>>> 5. `make images` the jdk's source code
>>>> 6. I created Main.java with the following content
>>>> class Main {
>>>> {
>>>> new jdk.neshkeev.MyPreviewClass();
>>>> }
>>>> }
>>>> 7. I compiled Main.java with my openjdk that was built in the step 5.
>>>> Here is the link to my openjdk fork with the jdk.neshkeev module:
>>>> https://github.com/neshkeev/jdk <https://github.com/neshkeev/jdk>
>>>> What is expected
>>>> Since MyPreviewClass is inside of the package that is annotated
>>>> with PreviewFeature and it is also inside of the module that is
>>>> also annotated with PreviewFeature I expect to get compile time
>>>> errors/warnings. I believe that compile-time errors/warnings should
>>>> arise since Main.java can't be considered as participating source code
>>>> What happened
>>>> No compile-time errors/warnings occurred
>>>> Is this a bug?
More information about the compiler-dev
mailing list