Skip to content

Commit 0719868

Browse files
Treiblesschorlectrueden
authored andcommitted
Merge matching and type utils
1 parent 26f7b39 commit 0719868

5 files changed

Lines changed: 79 additions & 125 deletions

File tree

src/main/java/org/scijava/ops/matcher/DefaultOpTypeMatchingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ private int findCastLevels(final OpCandidate candidate) {
299299
for (final Member<?> member : OpUtils.inputs(candidate)) {
300300
final Class<?> type = member.getRawType();
301301
if (paddedArgs[i] != null) {
302-
final int currLevel = OpMatchingUtil.findCastLevels(type, OpMatchingUtil.getClass(paddedArgs[i]));
302+
final int currLevel = MatchingUtils.findCastLevels(type, MatchingUtils.getClass(paddedArgs[i]));
303303
if (currLevel < 0)
304304
return -1;
305305
level += currLevel;

src/main/java/org/scijava/util/TypeUtils.java renamed to src/main/java/org/scijava/ops/matcher/MatchingUtils.java

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,26 @@
3030
* #L%
3131
*/
3232

33-
package org.scijava.util;
33+
package org.scijava.ops.matcher;
3434

3535
import java.lang.reflect.ParameterizedType;
3636
import java.lang.reflect.Type;
3737
import java.lang.reflect.TypeVariable;
3838
import java.lang.reflect.WildcardType;
39+
import java.util.ArrayList;
3940
import java.util.Arrays;
4041
import java.util.HashMap;
42+
import java.util.HashSet;
4143
import java.util.Map;
4244

45+
import org.scijava.ops.types.Nil;
46+
import org.scijava.util.Types;
47+
4348
import com.google.common.base.Objects;
4449

45-
public final class TypeUtils {
50+
public final class MatchingUtils {
4651

47-
private TypeUtils() {
52+
private MatchingUtils() {
4853
// prevent instantiation of utility class
4954
}
5055

@@ -297,4 +302,68 @@ public static Type[] getParams(Class<?> subType, Class<?> superErasure) {
297302
}
298303
return new Type[0];
299304
}
305+
306+
/**
307+
* Gets the "useful" class information carries on the given object, which
308+
* depends on the actual type of the object.
309+
*/
310+
public static Class<?> getClass(final Object obj) {
311+
if (obj == null)
312+
return null;
313+
if (obj instanceof Nil)
314+
return getClass(((Nil<?>) obj).getType());
315+
if (obj instanceof Class)
316+
return (Class<?>) obj;
317+
if (obj instanceof ParameterizedType)
318+
return (Class<?>) ((ParameterizedType) obj).getRawType();
319+
return obj.getClass();
320+
}
321+
322+
/**
323+
* Finds the levels of casting between <code>origin</code> and
324+
* <code>dest</code>. Returns 0 if dest and origin are the same. Returns -1
325+
* if dest is not assignable from origin.
326+
*/
327+
public static int findCastLevels(final Class<?> dest, final Class<?> origin) {
328+
if (dest.equals(origin))
329+
return 0;
330+
331+
int level = 1;
332+
Class<?> currType = origin;
333+
// BFS if dest is an interface
334+
if (dest.isInterface()) {
335+
final HashSet<String> seen = new HashSet<>();
336+
final ArrayList<Type> currIfaces = new ArrayList<>(Arrays.asList(currType.getGenericInterfaces()));
337+
do {
338+
final ArrayList<Type> nextIfaces = new ArrayList<>();
339+
for (final Type iface : currIfaces) {
340+
if (seen.contains(iface.getTypeName()))
341+
continue;
342+
343+
final Class<?> cls = getClass(iface);
344+
if (cls.equals(dest))
345+
return level;
346+
seen.add(iface.getTypeName());
347+
nextIfaces.addAll(Arrays.asList(cls.getGenericInterfaces()));
348+
}
349+
currIfaces.clear();
350+
currIfaces.addAll(nextIfaces);
351+
if (currType.getSuperclass() != null) {
352+
currType = currType.getSuperclass();
353+
currIfaces.addAll(Arrays.asList(currType.getGenericInterfaces()));
354+
}
355+
level++;
356+
} while (!currIfaces.isEmpty() || currType.getSuperclass() != null);
357+
}
358+
// otherwise dest is a class, so search the list of ancestors
359+
else {
360+
while (currType.getSuperclass() != null) {
361+
currType = currType.getSuperclass();
362+
if (currType.equals(dest))
363+
return level;
364+
level++;
365+
}
366+
}
367+
return -1;
368+
}
300369
}

src/main/java/org/scijava/ops/matcher/OpMatchingUtil.java

Lines changed: 0 additions & 114 deletions
This file was deleted.

src/main/java/org/scijava/ops/matcher/OpRef.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import java.util.Objects;
3636

3737
import org.scijava.ops.core.Op;
38-
import org.scijava.util.TypeUtils;
3938
import org.scijava.util.Types;
4039

4140
/**
@@ -138,7 +137,7 @@ public boolean typesMatch(final Class<?> opClass) {
138137
return true;
139138
for (Type t : types) {
140139
if(t instanceof ParameterizedType) {
141-
if (!TypeUtils.checkGenericAssignability(opClass, (ParameterizedType) t)) {
140+
if (!MatchingUtils.checkGenericAssignability(opClass, (ParameterizedType) t)) {
142141
return false;
143142
}
144143
} else {

src/test/java/org/scijava/ops/util/TypeUtilsTest.java renamed to src/test/java/org/scijava/ops/util/MatchingUtilsTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@
3939
import java.util.function.Supplier;
4040

4141
import org.junit.Test;
42+
import org.scijava.ops.matcher.MatchingUtils;
4243
import org.scijava.ops.types.Nil;
43-
import org.scijava.util.TypeUtils;
4444
import org.scijava.util.Types;
4545

46-
public class TypeUtilsTest {
46+
public class MatchingUtilsTest {
4747

4848
private void assertAll(Class<?> from, boolean condition, Nil<?>... tos) {
4949
for (Nil<?> to : tos) {
@@ -54,7 +54,7 @@ private void assertAll(Class<?> from, boolean condition, Nil<?>... tos) {
5454
private void assertAll(Class<?> from, boolean condition, Type... tos) {
5555
for (Type to : tos) {
5656
if (to instanceof ParameterizedType) {
57-
assertTrue(TypeUtils.checkGenericAssignability(from, (ParameterizedType) to) == condition);
57+
assertTrue(MatchingUtils.checkGenericAssignability(from, (ParameterizedType) to) == condition);
5858
} else {
5959
assertTrue(Types.isAssignable(from, to) == condition);
6060
}
@@ -392,12 +392,12 @@ abstract class Wildcards implements Function<List<? extends Number>, List<? exte
392392

393393
@Test(expected = NullPointerException.class)
394394
public void testIsAssignableNullToNull() {
395-
TypeUtils.checkGenericAssignability(null, null);
395+
MatchingUtils.checkGenericAssignability(null, null);
396396
}
397397

398398
@Test(expected = NullPointerException.class)
399399
public void testIsAssignableClassToNull() {
400-
TypeUtils.checkGenericAssignability(Object.class, null);
400+
MatchingUtils.checkGenericAssignability(Object.class, null);
401401
}
402402

403403
@Test

0 commit comments

Comments
 (0)