Skip to content

Commit ee30d8b

Browse files
gselzerhinerm
authored andcommitted
Update OpInfo infrastructure to hold onto hints
1 parent d7fbc08 commit ee30d8b

8 files changed

Lines changed: 70 additions & 47 deletions

File tree

scijava/scijava-ops/src/main/java/org/scijava/ops/OpInfo.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
import java.lang.reflect.AnnotatedElement;
55
import java.lang.reflect.Type;
66
import java.lang.reflect.TypeVariable;
7+
import java.util.Arrays;
8+
import java.util.Collections;
79
import java.util.List;
810
import java.util.Map;
911

1012
import org.scijava.log.Logger;
13+
import org.scijava.ops.hints.OpHints;
1114
import org.scijava.ops.matcher.OpCandidate;
1215
import org.scijava.ops.matcher.OpRef;
1316
import org.scijava.param.ValidityException;
@@ -29,9 +32,14 @@ public interface OpInfo extends Comparable<OpInfo> {
2932

3033
/** Gets the associated {@link Struct} metadata. */
3134
Struct struct();
32-
33-
/** Describes whether this Op can be simplified. */
34-
boolean isSimplifiable();
35+
36+
/** Gets the hints declared in the {@link OpHints} annotation */
37+
List<String> declaredHints();
38+
39+
default List<String> formHints(OpHints hints) {
40+
if (hints == null) return Collections.emptyList();
41+
return Arrays.asList(hints.hints());
42+
}
3543

3644
/** Gets the op's input parameters. */
3745
default List<Member<?>> inputs() {

scijava/scijava-ops/src/main/java/org/scijava/ops/hints/OpHints.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11

22
package org.scijava.ops.hints;
33

4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
49
/**
510
* An annotation used to record the hints that apply to a particular Op.
611
*
712
* @author Gabriel Selzer
813
*/
14+
@Retention(RetentionPolicy.RUNTIME)
15+
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
916
public @interface OpHints {
1017

1118
String[] hints() default {};

scijava/scijava-ops/src/main/java/org/scijava/ops/impl/DefaultOpEnvironment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ public OpInfo opify(final Class<?> opClass) {
196196

197197
@Override
198198
public OpInfo opify(final Class<?> opClass, final double priority) {
199-
return new OpClassInfo(opClass, priority, opClass.getAnnotation(Unsimplifiable.class) == null);
199+
return new OpClassInfo(opClass, priority);
200200
}
201201

202202
@Override

scijava/scijava-ops/src/main/java/org/scijava/ops/matcher/OpAdaptationInfo.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import java.lang.reflect.AnnotatedElement;
44
import java.lang.reflect.Type;
5+
import java.util.ArrayList;
56
import java.util.List;
67
import java.util.function.Function;
78

89
import org.scijava.ops.OpDependencyMember;
910
import org.scijava.ops.OpInfo;
1011
import org.scijava.ops.OpUtils;
12+
import org.scijava.ops.hints.DefaultOpHints.Simplifiable;
1113
import org.scijava.param.ParameterStructs;
1214
import org.scijava.param.ValidityException;
1315
import org.scijava.struct.Struct;
@@ -24,6 +26,7 @@ public class OpAdaptationInfo implements OpInfo {
2426
private OpInfo srcInfo;
2527
private Type type;
2628
private Function<Object, Object> adaptor;
29+
private final List<String> hints;
2730

2831
private Struct struct;
2932
private ValidityException validityException;
@@ -41,6 +44,9 @@ public OpAdaptationInfo(OpInfo srcInfo, Type type, Function<Object, Object> adap
4144
} catch (ValidityException e) {
4245
validityException = e;
4346
}
47+
this.hints = new ArrayList<>(srcInfo.declaredHints());
48+
hints.remove(Simplifiable.NO);
49+
hints.add(Simplifiable.YES);
4450
}
4551

4652
@Override
@@ -58,6 +64,11 @@ public Struct struct() {
5864
return struct;
5965
}
6066

67+
@Override
68+
public List<String> declaredHints() {
69+
return hints;
70+
}
71+
6172
// we want the original op to have priority over this one.
6273
@Override
6374
public double priority() {
@@ -95,14 +106,4 @@ public AnnotatedElement getAnnotationBearer() {
95106
return srcInfo.getAnnotationBearer();
96107
}
97108

98-
/**
99-
* TODO: consider whether we could simplify {@link OpAdaptationInfo}s.
100-
* Currently, the system doesn't even store them outside of caching, so they
101-
* cannot be simplified. But maybe it would be useful.
102-
*/
103-
@Override
104-
public boolean isSimplifiable() {
105-
return false;
106-
}
107-
108109
}

scijava/scijava-ops/src/main/java/org/scijava/ops/matcher/OpClassInfo.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,15 @@
3333
import java.lang.reflect.Constructor;
3434
import java.lang.reflect.InvocationTargetException;
3535
import java.lang.reflect.Type;
36+
import java.util.Arrays;
37+
import java.util.Collections;
3638
import java.util.List;
3739

3840
import org.scijava.Priority;
3941
import org.scijava.ops.OpDependencyMember;
4042
import org.scijava.ops.OpInfo;
4143
import org.scijava.ops.OpUtils;
44+
import org.scijava.ops.hints.OpHints;
4245
import org.scijava.ops.simplify.Unsimplifiable;
4346
import org.scijava.param.ParameterStructs;
4447
import org.scijava.param.ValidityException;
@@ -59,14 +62,13 @@ public class OpClassInfo implements OpInfo {
5962
private Struct struct;
6063
private ValidityException validityException;
6164
private final double priority;
62-
63-
private final boolean simplifiable;
65+
private final List<String> hints;
6466

6567
public OpClassInfo(final Class<?> opClass) {
66-
this(opClass, priorityFromAnnotation(opClass), simplifiableFromAnnotation(opClass));
68+
this(opClass, priorityFromAnnotation(opClass));
6769
}
6870

69-
public OpClassInfo(final Class<?> opClass, final double priority, final boolean simplifiable) {
71+
public OpClassInfo(final Class<?> opClass, final double priority) {
7072
this.opClass = opClass;
7173
try {
7274
struct = ParameterStructs.structOf(opClass);
@@ -75,7 +77,8 @@ public OpClassInfo(final Class<?> opClass, final double priority, final boolean
7577
validityException = e;
7678
}
7779
this.priority = priority;
78-
this.simplifiable = simplifiable;
80+
81+
hints = formHints(opClass.getAnnotation(OpHints.class));
7982
}
8083

8184
// -- OpInfo methods --
@@ -92,6 +95,11 @@ public Struct struct() {
9295
return struct;
9396
}
9497

98+
@Override
99+
public List<String> declaredHints() {
100+
return hints;
101+
}
102+
95103
@Override
96104
public double priority() {
97105
return priority;
@@ -184,13 +192,4 @@ private static double priorityFromAnnotation(Class<?> annotationBearer) {
184192
return opAnnotation == null ? Priority.NORMAL : opAnnotation.priority();
185193
}
186194

187-
private static boolean simplifiableFromAnnotation(Class<?> annotationBearer) {
188-
final Unsimplifiable opAnnotation = annotationBearer.getAnnotation(Unsimplifiable.class);
189-
return opAnnotation == null ? true : false;
190-
}
191-
192-
@Override
193-
public boolean isSimplifiable() {
194-
return simplifiable;
195-
}
196195
}

scijava/scijava-ops/src/main/java/org/scijava/ops/matcher/OpFieldInfo.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.scijava.ops.OpField;
4141
import org.scijava.ops.OpInfo;
4242
import org.scijava.ops.OpUtils;
43+
import org.scijava.ops.hints.OpHints;
4344
import org.scijava.ops.simplify.Unsimplifiable;
4445
import org.scijava.param.ParameterStructs;
4546
import org.scijava.param.ValidityException;
@@ -60,7 +61,7 @@ public class OpFieldInfo implements OpInfo {
6061
private Struct struct;
6162
private ValidityException validityException;
6263

63-
private final boolean simplifiable;
64+
private final List<String> hints;
6465

6566
public OpFieldInfo(final Object instance, final Field field) {
6667
this.instance = instance;
@@ -98,8 +99,7 @@ public OpFieldInfo(final Object instance, final Field field) {
9899
validityException = new ValidityException(problems);
99100
}
100101

101-
// we cannot simplify the Op iff it has the Unsimplifiable annotation.
102-
simplifiable = field.getAnnotation(Unsimplifiable.class) == null;
102+
hints = formHints(field.getAnnotation(OpHints.class));
103103
}
104104

105105
// -- OpInfo methods --
@@ -115,6 +115,11 @@ public Struct struct() {
115115
return struct;
116116
}
117117

118+
@Override
119+
public List<String> declaredHints() {
120+
return hints;
121+
}
122+
118123
@Override
119124
public double priority() {
120125
final OpField opField = field.getAnnotation(OpField.class);
@@ -181,8 +186,4 @@ public String toString() {
181186
return OpUtils.opString(this);
182187
}
183188

184-
@Override
185-
public boolean isSimplifiable() {
186-
return simplifiable;
187-
}
188189
}

scijava/scijava-ops/src/main/java/org/scijava/ops/matcher/OpMethodInfo.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.scijava.ops.OpInfo;
4949
import org.scijava.ops.OpMethod;
5050
import org.scijava.ops.OpUtils;
51+
import org.scijava.ops.hints.OpHints;
5152
import org.scijava.ops.simplify.Unsimplifiable;
5253
import org.scijava.ops.util.Adapt;
5354
import org.scijava.param.ParameterStructs;
@@ -78,7 +79,7 @@ public class OpMethodInfo implements OpInfo {
7879
private Struct struct;
7980
private final ValidityException validityException;
8081

81-
private final boolean simplifiable;
82+
private final List<String> hints;
8283

8384
public OpMethodInfo(final Method method) {
8485
final List<ValidityProblem> problems = new ArrayList<>();
@@ -95,8 +96,7 @@ public OpMethodInfo(final Method method) {
9596
" must be static."));
9697
}
9798
this.method = method;
98-
// we cannot simplify this op iff it has the Unsimplifiable annotation.
99-
simplifiable = method.getAnnotation(Unsimplifiable.class) == null;
99+
this.hints = formHints(method.getAnnotation(OpHints.class));
100100
try {
101101
struct = ParameterStructs.structOf(method.getDeclaringClass(), method);
102102
final OpMethod methodAnnotation = method.getAnnotation(OpMethod.class);
@@ -127,6 +127,11 @@ public Struct struct() {
127127
return struct;
128128
}
129129

130+
@Override
131+
public List<String> declaredHints() {
132+
return hints;
133+
}
134+
130135
@Override
131136
public double priority() {
132137
final OpMethod opMethod = method.getAnnotation(OpMethod.class);
@@ -355,8 +360,4 @@ public AnnotatedElement getAnnotationBearer() {
355360
return method;
356361
}
357362

358-
@Override
359-
public boolean isSimplifiable() {
360-
return simplifiable;
361-
}
362363
}

scijava/scijava-ops/src/main/java/org/scijava/ops/simplify/SimplifiedOpInfo.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.scijava.ops.OpUtils;
1313
import org.scijava.ops.conversionLoss.LossReporter;
1414
import org.scijava.ops.core.Op;
15+
import org.scijava.ops.hints.DefaultOpHints.Simplifiable;
1516
import org.scijava.ops.matcher.OpMatchingException;
1617
import org.scijava.param.ParameterStructs;
1718
import org.scijava.param.ValidityException;
@@ -29,6 +30,7 @@ public class SimplifiedOpInfo implements OpInfo {
2930
private final SimplificationMetadata metadata;
3031
private final Type opType;
3132
private final double priority;
33+
private final List<String> hints;
3234

3335
private Struct struct;
3436
private ValidityException validityException;
@@ -47,6 +49,10 @@ public SimplifiedOpInfo(OpInfo info, OpEnvironment env, SimplificationMetadata m
4749
}
4850

4951
this.priority = calculatePriority(info, metadata, env);
52+
53+
this.hints = new ArrayList<>(srcInfo.declaredHints());
54+
this.hints.remove(Simplifiable.YES);
55+
this.hints.add(Simplifiable.NO);
5056
}
5157

5258
public OpInfo srcInfo() {
@@ -58,6 +64,11 @@ public Type opType() {
5864
return opType;
5965
}
6066

67+
@Override
68+
public List<String> declaredHints() {
69+
return hints;
70+
}
71+
6172
@Override
6273
public Struct struct() {
6374
return struct;
@@ -189,11 +200,6 @@ public StructInstance<?> createOpInstance(List<?> dependencies)
189200
}
190201
}
191202

192-
@Override
193-
public boolean isSimplifiable() {
194-
return false;
195-
}
196-
197203
@Override
198204
public String toString() {
199205
return OpUtils.opString(this);

0 commit comments

Comments
 (0)