@@ -199,19 +199,50 @@ private void doChange(@Nullable Object after, @Nullable Object before, @Nullable
199199 }
200200 }
201201
202- private static @ Nullable String getValueType (@ Nullable Object after ) {
203- if (after == null ) {
204- return null ;
202+ private static final String JAVA_TYPE_PACKAGE = "org.openrewrite.java.tree" ;
203+ private static final String JAVA_TYPE_NAME = JAVA_TYPE_PACKAGE + ".JavaType" ;
204+
205+ private static final ClassValue <@ Nullable String > VALUE_TYPE_CACHE = new ClassValue <String >() {
206+ private @ Nullable Class <?> javaTypeClass ;
207+ private boolean javaTypeResolved ;
208+
209+ private @ Nullable Class <?> getJavaTypeClass (Class <?> from ) {
210+ if (!javaTypeResolved ) {
211+ try {
212+ javaTypeClass = Class .forName (JAVA_TYPE_NAME , false , from .getClassLoader ());
213+ } catch (ClassNotFoundException ignored ) {
214+ }
215+ javaTypeResolved = true ;
216+ }
217+ return javaTypeClass ;
205218 }
206- Class <?> afterType = after .getClass ();
207- Package pkg = afterType .getPackage ();
208- if (afterType .isPrimitive () || afterType .isArray () || (pkg != null && pkg .getName ().startsWith ("java.lang" )) ||
209- afterType .equals (UUID .class ) || Iterable .class .isAssignableFrom (afterType )) {
210- return null ;
211- } else if (Enum .class .isAssignableFrom (afterType ) && !"org.openrewrite.java.tree.JavaType$Primitive" .equals (afterType .getName ())) {
212- // FIXME special case for `JavaType.Primitive` here
213- return null ;
219+
220+ @ Override
221+ protected @ Nullable String computeValue (Class <?> afterType ) {
222+ Package pkg = afterType .getPackage ();
223+ if (afterType .isPrimitive () || afterType .isArray () || (pkg != null && pkg .getName ().startsWith ("java.lang" )) ||
224+ afterType .equals (UUID .class ) || Iterable .class .isAssignableFrom (afterType )) {
225+ return null ;
226+ } else if (Enum .class .isAssignableFrom (afterType ) && !JAVA_TYPE_NAME .concat ("$Primitive" ).equals (afterType .getName ())) {
227+ // FIXME special case for `JavaType.Primitive` here
228+ return null ;
229+ }
230+
231+ // If the class is a subtype of JavaType but in a different package,
232+ // return the superclass name instead
233+ Class <?> jt = getJavaTypeClass (afterType );
234+ if (jt != null && pkg != null && !pkg .getName ().equals (JAVA_TYPE_PACKAGE ) && jt .isAssignableFrom (afterType )) {
235+ Class <?> superclass = afterType .getSuperclass ();
236+ if (superclass != null && !Object .class .equals (superclass )) {
237+ return superclass .getName ();
238+ }
239+ }
240+
241+ return afterType .getName ();
214242 }
215- return afterType .getName ();
243+ };
244+
245+ private static @ Nullable String getValueType (@ Nullable Object after ) {
246+ return after == null ? null : VALUE_TYPE_CACHE .get (after .getClass ());
216247 }
217248}
0 commit comments