Hi Peter,
On 8/2/2016 1:59 AM, Peter Levart wrote:
Hi Joe,
I wonder why you compare the type obtained from an value.getClass()
with class literals for primitive types (lines 174, 176, 178):
165 Class<?> type = value.getClass();
166 if (!type.isArray()) {
167 // primitive value, string, class, enum const, or
annotation
168 if (type == Class.class)
169 return toSourceString((Class<?>) value);
170 else if (type == String.class)
171 return toSourceString((String) value);
172 if (type == Character.class)
173 return toSourceString((char) value);
174 else if (type == double.class)
175 return toSourceString((double) value);
176 else if (type == float.class)
177 return toSourceString((float) value);
178 else if (type == long.class)
179 return toSourceString((long) value);
180 else
181 return value.toString();
182 } else {
They will never match!
Indeed! Just goes to show the value of making sure there are no coverage
gaps in one's regression tests ;-) In an updated version of the patch,
http://cr.openjdk.java.net/~darcy/8162817.2/
I replaced
174 else if (type == double.class)
175 return toSourceString((double) value);
176 else if (type == float.class)
177 return toSourceString((float) value);
178 else if (type == long.class)
179 return toSourceString((long) value);
180 else
181 return value.toString();
with
174 else if (type == Double.class)
175 return toSourceString((double) value);
176 else if (type == Float.class)
177 return toSourceString((float) value);
178 else if (type == Long.class)
179 return toSourceString((long) value);
180 else
181 return value.toString();
and added a test case to check the following annotation:
76 @MostlyPrimitive(
77 c0='a',
78 c1='\'',
79 i0=1,
80 i1=2,
81 f0=1.0f,
82 f1=Float.NaN,
83 d0=0.0,
84 d1=2.0/0.0,
85 l0=5,
86 l1=Long.MAX_VALUE,
87 s0="Hello world.",
88 s1="a\"b",
89 class0=Obj[].class
90 )
Many of the new toString forms of these members differ from the current
ones.
Also, sometimes you use "else if (...)" and sometimes just "if (...)".
They are both logically correct as you always "return" in the body of
the previous if statement, but it is not very consistent...
Otherwise looks good.
The existing code in this class (most of it dating back to 2003!), was
pretty consistent in its "if {return ...} - if {return ...}" usage.
However, when there are logical alternatives, I find it marginally
clearer to use a "if {return ...} else if {return ...}. ..." structure.
(If there was switching on Class objects, this class would be a great
candidate to use it.)
However, I didn't think it was justified to update the rest of the class
to use the if-else pattern.
Thanks for the review,
-Joe
Regards, Peter
On 08/01/2016 11:39 PM, joe darcy wrote:
This change should cover 99 44/100 % of the annotation values that
appear in practice; limited efforts were taken quoting characters in
strings, etc.
The basic approach is to introduce a family of overloaded
toSourceString methods to wrap/filter different kinds of values
coupled with methods to convert the various primitive arrays to
Stream<String> for final processing by a shared method to surround an
array by "{" and "}" and add comma separators as needed.
Thanks,
-Joe