[type-annos-observers] Comments on the Nov 7 specification
Alex Buckley
alex.buckley at oracle.com
Fri Nov 30 11:20:42 PST 2012
Srikanth, thanks for this information.
Mike, here is my view: I think nested types should be represented "left
to right", so that @A, @B, and @C in:
@A Outer. @B Middle. @C Inner
are located with these type_path_entry arrays:
@A: -
@B: 1(0)
@C: 1(0), 1(0)
I recognize this is not congruent with javac's AST, but I think it is
the right all-round representation.
Alex
On 11/29/2012 10:03 PM, Srikanth S Adayapalam wrote:
> > From: Alex Buckley <alex.buckley at oracle.com>
> > Sent by: type-annotations-spec-experts-bounces at openjdk.java.net
> >
> > "main type" is not a JLS term and can be interpreted in more than one
> > way. Same goes for "scoping information". There is clearly more than one
> > perspective here. I am not arguing for one approach or another (though I
> > do have a favorite); I am arguing for absolute clarity. Let's wait for
> > Srikanth's comments.
>
> Since there was an earlier question about how other tools that build AST
> build their ASTs: Eclipse compiler builds two altogether different ASTs:
> the so called
> compiler AST and the DOM/AST. Class file generation happens from the former
> while the latter is used by clients that want structural (as opposed to
> textual)
> modifications to the program.
>
> The type Outer.Middle.Inner (earlier mail had the order wrong as
> Outer.Inner.Middle)
> gets represented in the compiler AST as a single node
> QualifiedTypeReference with
> a char[][] representing the tokens that make up the types.
>
> Annotations are similarly represented as Annotation [][].
>
> On the DOM/AST side, we do represent the qualified type as a tree with
> the each
> inner level containing the qualifying type, but this AST is not used for
> class file
> generation.
>
> I do see the point about signature decoding ASM, but bottomline: I don't
> see an overwhelming
> preference for one approach vs other from our side.
>
> Srikanth.
>
>
> >
> > Alex
> >
> > On 11/27/2012 5:48 AM, Michael Ernst wrote:
> > > Eric-
> > >
> > > Thanks for the followup; I appreciate it.
> > >
> > > We are all agreed on "outside to inside" for generics; it is definitely
> > > superior.
> > >
> > > Your original message and my request for clarification was about nested
> > > types. "Outside to inside" is ambiguous for nested types, so I
> think we
> > > should avoid that terminology. For nested types, it seems there is
> merit
> > > to having paths start at the main type, then proceeding to scoping
> > > information -- which would be similar to the preferred "outside to
> inside"
> > > approach that is used for generics.
> > >
> > > Thanks,
> > >
> > > -Mike
> > >
> > >
> > >> Subject: Re: [type-annos-observers] Comments on the Nov 7
> specification
> > >> From: Eric Bruneton <ebruneton at free.fr>
> > >> To: type-annotations-spec-comments at openjdk.java.net
> > >> Date: Sat, 24 Nov 2012 17:28:47 +0100
> > >>
> > >> 20/11/2012 21:37, Michael Ernst wrote:
> > >>> Eric Bruneton said:
> > >>>
> > >>>> From an ASM point of view,
> > >>>> ...
> > >>>> The important
> > >>>> point is that all paths should be "from outside to inside"
> > (e.g. for nested
> > >>>> types, the path should go from outer to inner, not the other
> > way around as
> > >>>> proposed in the Nov 7 specification).
> > >>>
> > >>> Eric, I'm willing to make this change, but I would like to be
> able to give
> > >>> a more specific justification for the design choice. Can you
> explain the
> > >>> rationale, or what difference it makes to ASM? Is the reason
> that the
> > >>> identifiers appear left-to-right in the class file and you want
> to process
> > >>> them in that order, or is it something else?
> > >>
> > >> Right, it's basically that. For instance, consider the problem of
> > >> extracting the part of a type signature in the class file format
> > >> (e.g. Ljava.util.Map<
> > +Ljava.lang.String;Ljava.util.List<Ljava.lang.Object;>;>;)
> > >> that corresponds to a given type_path. With 'outside to inside'
> paths, this
> > >> can be done with a simple recursive function, like
> > >> extract(signature,path)
> > >> - if empty path return signature
> > >> - otherwise parse the first signature element from the left,
> > check conformity
> > >> with first path element, and call recursively with tail of
> signature and
> > >> tail of path.
> > >>
> > >> With 'inside to outside' paths, you have to parse the three inner
> types in
> > >> the signature to realize that
> > >> "inner_path{inner_path{inner_path{empty_path}}}", for instance,
> was in fact
> > >> the first parsed type (then you either have to save state during
> parsing,
> > >> or do another parsing pass).
> > >>
> > >> I'm not sure I'm clear, but I hope you get the idea.
> > >>
> > >> Eric
> >
More information about the type-annotations-spec-experts
mailing list