- Should we treat the cases where @A has a target of
    RECORD_COMPONENT, separately from the cases where it does not,
    such as, only push the annotation down to members when the target
    does not include RECORD_COMPONENT?  That is, is the desire to push
    down annotations based on “well, what if we want to apply a
    “legacy” annotation?  If so, this causes a migration compatibility
    issue; if someone adds RC to the targets list for @A, then when
    the record is recompiled, the location of the annotations will
    changed, possibly changing the behavior of frameworks that
    encounter the record.


No, we would certainly not require @RC to also be present.  If I have released a method annotation it is the current reality that *any* method can use it, including ones I meant it to be applicable to and ones I didn't. I would expect the methods that appear on records to be no exception.

I'm not sure we're talking about the same thing now?  If I have a method annotation @MethodsOnly, and I declare

    record Foo(@MethodsOnly int a);

what am I annotating?  It feels a little ad-hoc to say that my intention is to annotate only the desugared accessor, because that's the method that is tied to `a`.  But assuming that is what you're talking about, is this really because we want to annotate record components with annotations that don't target record components, or is it because we're worried that it will take some time for frameworks to add Target.R_C to their annos?

    All of which causes me to back up and say: what is the motivation
    for pushing these down to implicit members, other than “general
    friendliness”?   Is this a migration strategy for migrating
    existing code to use records, without having to redeclare
    annotations on the members?  And if so, how useful is it really? 
    Will users want to throw the union of field/accessor/ctor
    parameter annotations on the record components just to gain
    compatibility with their existing code?


Say project A has released jars containing method annotations and we're using those annotations on our methods. Under your proposal we are prevented from converting to records. We have to beg project A to upgrade to Java 1X. And in fact since they will likely not want to suddenly pull the rug out from all their users on earlier Java versions, what I really need to beg them to do is adopt jep238 multirelease jars, which probably also means adopting a preprocessor in their build so they can generate the different versions (as this is a pretty bad case for branching).

Thought experiment: if you could wave a magic wand and retroactively re-target all the worlds annotations to include R_C, and all the frameworks to support it, would you still want this?  In other words, is this a feature that you want in its own right, or just as a migration aid, right?  (It has to be the latter, right?)


Reply via email to