[JSR308] Implicit annotations with values

Mahmood Ali mahmood at MIT.EDU
Sat Jul 5 01:35:43 EDT 2008

Hi Artemus,

> My plan is to use the InnerUnique annotation denote what inner  
> elements are unique. This seems like the best way to handle  
> conditional uniqueness. If you can think of a better way to describe  
> such conditional properties that would be helpful.

If I understand you correctly, the framework tries to provide two  
mechanisms to do that:
   - Polymorphism over generics -- interaction between qualified types  
and generics
   - qualifier polymorphism -- having a polymorphic qualifier (see  
manual 2.5).

The first mechanism is enabled by default to all checkers.  A type  
argument in a parameterized type can be an annotated type.  At first  
look it seems to me that this suffices to solve the problem with  
List.add and List.get situations.
I don't know much about the subtyping relations for Unique (i.e. I  
would use three qualifiers: Unique, Aliased, PossiblyUnique - which is  
the root qualifier); so I would give examples of the Interned type  
internedString and nonInternedString have the obvious declaration

> List<@Interned String> internedStrings = createNewList();
> internedStrings.add(internedString);   // valid
> String s1 = internedString.get(0);
> @Interned String s2 = internedString.get(0);
> internedStrings.add(nonInternedString); // invalid

In the other hand:

> List<@Interned String> unInternedStrings = createNewList();
> unInternedStrings.add(internedString);  // valid
> unInternedStrings.add(unInternedStrings);  // valid
> String s1 = internedString.get(0);   // valid
> @Interned String s2 = unInternedStrings.get(0);  // invalid

I assume that this is sufficient for your type system too.

The second mechanism is enabled by the user, through declaring a  
qualifier a polymorphic qualifier.  Please review section 2.5.  The  
basic idea is that you can have a PolyUnique qualifier to support  
polymorphism for non-generic methods.  So you would have a method like:

> @PolyUnique String identity(@PolyUnique String s) { return s; }  //  
> a trivial example
> String s1 = identity(uniqueString);  // valid
> @Unique String s2 = identity(aliasedString);  // invalid

I hope that this helpful.

> Although TreeUtils.assignmentContext(parentNode) will get most  
> cases, it won't get chained method calls.
This was partially conscious decision, following Java type inference  
for generic types.  For example:

> List<String> l1 = Collections.emptyList(); // valid
> Iterator<String> iter1 =  
> Collections.<String>emptyList().iterator(); // valid
> Iterator<String> iter2 = Collections.emptyList().iterator();   //  
> invalid


More information about the JSR308 mailing list