JDK 9 RFR for JDK-8028543 Add SourceVersion.RELEASE_9
Martin Buchholz
martinrb at google.com
Fri Dec 6 18:00:17 PST 2013
Our experience has been that our software is far more likely to break
because we did not claim to support latest. Java's compatibility is still
high, and if a JDK update does eventually break things, then we just have
to fix them for the new JDK version anyways - so my recommendation is to
return SourceVersion.latest() always.
On Fri, Dec 6, 2013 at 5:41 PM, Joseph Darcy <joe.darcy at oracle.com> wrote:
> 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> 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/
>>
>> 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/7f6cb786/attachment-0001.html
More information about the compiler-dev
mailing list