JDK 9 RFR for JDK-8028543 Add SourceVersion.RELEASE_9
Joseph Darcy
joe.darcy at oracle.com
Fri Dec 6 17:41:53 PST 2013
Hi Martin,
On 12/6/2013 2:31 PM, Martin Buchholz wrote:
> We have found as users of this API, that these incrementing RELEASE_
> constants were not helpful. If code supported jdkN and jdkN+1, it
> couldn't claim to support jdkN+1 because that would not compile with
> jdkN, since the corresponding RELEASE_N+1 symbol was not defined in
> jdkN. We felt compelled to rewrite code to always claim to support
> the "latest" release.
>
> Perhaps it would work if you added RELEASE_XX for releases far into
> the future. But you can't go back and update all the old JDKs now.
> They've left the barn.
>
> Or perhaps we were using the API incorrectly. Are we missing
> something obvious? I'm hardly the expert...
If you have taken the trouble to make a processor robust in the face of
unknown future language versions, then returning latest is the right
thing to do. However, this can be a nontrivial amount of extra work.
If you are in a situation where you are supporting N and N+1 only and
want to run on either N or N+1 (and nothing else), you would just need
to use a construct without direct reference to N+1 for the processor to
communicate with the environment. You could so something a bit ugly like
if (SourceVersion.latest() > RELEASE_N)
// Return RELEASE_(N+1) with a direct reference to RELEASE_(N+1)
return SourceVersion.value()[RELEASE_N.ordinal()+1];
else
return RELEASE_N;
HTH,
-Joe
>
>
>
> On Fri, Dec 6, 2013 at 2:11 PM, Joseph Darcy <joe.darcy at oracle.com
> <mailto:joe.darcy at oracle.com>> wrote:
>
> Hello,
>
> With JDK 9 going to get underway soon, please review the patch
> below to address
>
> JDK-8028543 Add SourceVersion.RELEASE_9
> https://bugs.openjdk.java.net/browse/JDK-8028543
>
> http://cr.openjdk.java.net/~darcy/8028543.0/
> <http://cr.openjdk.java.net/%7Edarcy/8028543.0/>
>
> Thanks,
>
> -Joe
>
> --- old/src/share/classes/javax/lang/model/SourceVersion.java
> 2013-12-06 14:06:51.000000000 -0800
> +++ new/src/share/classes/javax/lang/model/SourceVersion.java
> 2013-12-06 14:06:51.000000000 -0800
> @@ -55,6 +55,7 @@
> * 1.6: no changes
> * 1.7: diamond syntax, try-with-resources, etc.
> * 1.8: lambda expressions and default methods
> + * 1.9: To be determined
> */
>
> /**
> @@ -138,7 +139,15 @@
> * Additions in this release include lambda expressions and
> default methods.
> * @since 1.8
> */
> - RELEASE_8;
> + RELEASE_8,
> +
> + /**
> + * The version recognized by the Java Platform, Standard Edition
> + * 9.
> + *
> + * @since 1.9
> + */
> + RELEASE_9;
>
> // Note that when adding constants for newer releases, the
> // behavior of latest() and latestSupported() must be updated
> too.
> @@ -149,21 +158,23 @@
> * @return the latest source version that can be modeled
> */
> public static SourceVersion latest() {
> - return RELEASE_8;
> + return RELEASE_9;
> }
>
> private static final SourceVersion latestSupported =
> getLatestSupported();
>
> private static SourceVersion getLatestSupported() {
> try {
> - String specVersion =
> System.getProperty("java.specification.version");
> -
> - if ("1.8".equals(specVersion))
> + switch
> (System.getProperty("java.specification.version")) {
> + case "1.9":
> + return RELEASE_9;
> + case "1.8":
> return RELEASE_8;
> - else if("1.7".equals(specVersion))
> + case "1.7":
> return RELEASE_7;
> - else if("1.6".equals(specVersion))
> + case "1.6":
> return RELEASE_6;
> + }
> } catch (SecurityException se) {}
>
> return RELEASE_5;
> @@ -269,7 +280,6 @@
> * @return {@code true} if {@code s} is a keyword or literal,
> {@code false} otherwise.
> */
> public static boolean isKeyword(CharSequence s) {
> - String keywordOrLiteral = s.toString();
> - return keywords.contains(keywordOrLiteral);
> + return keywords.contains(s.toString());
> }
> }
> --- old/test/tools/javac/processing/model/TestSourceVersion.java
> 2013-12-06 14:06:51.000000000 -0800
> +++ new/test/tools/javac/processing/model/TestSourceVersion.java
> 2013-12-06 14:06:51.000000000 -0800
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2011, Oracle and/or its affiliates. All rights
> reserved.
> + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All
> rights reserved.
> * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> *
> * This code is free software; you can redistribute it and/or
> modify it
> @@ -23,7 +23,7 @@
>
> /*
> * @test
> - * @bug 7025809
> + * @bug 7025809 8028543
> * @summary Test latest and latestSupported
> * @author Joseph D. Darcy
> */
> @@ -36,8 +36,8 @@
> */
> public class TestSourceVersion {
> public static void main(String... args) {
> - if (SourceVersion.latest() != RELEASE_8 ||
> - SourceVersion.latestSupported() != RELEASE_8)
> + if (SourceVersion.latest() != RELEASE_9 ||
> + SourceVersion.latestSupported() != RELEASE_9)
> throw new RuntimeException("Unexpected release
> value(s) found:\n" +
> "latest:\t" +
> SourceVersion.latest() + "\n" +
> "latestSupported:\t" +
> SourceVersion.latestSupported());
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20131206/40ce71dc/attachment.html
More information about the compiler-dev
mailing list