JDK 9 RFR for JDK-8028543 Add SourceVersion.RELEASE_9
Martin Buchholz
martinrb at google.com
Mon Dec 9 10:09:44 PST 2013
Even if you are in a situation where you don't control the environment
where your annotation processor runs, it's terribly pessimistic to simply
fail on a version mismatch. The only advantage of that is "fail early".
I'm inclined to always claim to support latest, and throw something like
UnsupportedLanguageFeatureException when something I can't grok is
encountered.
On Fri, Dec 6, 2013 at 8:15 PM, Jeremy Manson <jeremymanson at google.com>wrote:
> The down side of claiming that you always support latest is that lambdas
> come around, and you don't support them, but you claim to do so. That's
> fine when you control the whole codebase, but less than ideal for public
> releases.
>
> Jeremy
>
>
> On Fri, Dec 6, 2013 at 6:00 PM, Martin Buchholz <martinrb at google.com>wrote:
>
>> 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/20131209/d6eb50f1/attachment-0001.html
More information about the compiler-dev
mailing list