Skip to content

Commit d4ddbd6

Browse files
committed
Cache getValueType() with ClassValue and resolve JavaType subtypes from other packages to their superclass
1 parent ccb4656 commit d4ddbd6

1 file changed

Lines changed: 43 additions & 12 deletions

File tree

rewrite-core/src/main/java/org/openrewrite/rpc/RpcSendQueue.java

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)