Skip to content

Commit 3661778

Browse files
update comments, javadoc RecordIndexingService
1 parent 9e920e9 commit 3661778

File tree

2 files changed

+146
-14
lines changed

2 files changed

+146
-14
lines changed

enigma/src/main/java/org/quiltmc/enigma/impl/plugin/RecordIndexingService.java

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,34 @@
1212
import java.util.Set;
1313
import java.util.stream.Stream;
1414

15+
/**
16+
* Indexes records, finding component getters and their corresponding fields.
17+
*
18+
* <p> While component fields can be reliably indexed, there can be uncertainty in determining their corresponding
19+
* getters. Some getters can be definitively determined, some are classified as 'probable getters'
20+
* (probabilistically determined), and some cannot be determined at all.
21+
*
22+
* <p> {@link RecordIndexingService} provides separate methods for accessing getters that are definitive, probabilistic,
23+
* or either.<br>
24+
* Either:
25+
* <ul>
26+
* <li> {@link #getComponentGetter(FieldEntry)}
27+
* <li> {@link #getComponentField(MethodEntry)}
28+
* <li> {@link #streamComponentMethods(ClassEntry)}
29+
* </ul>
30+
* Definite:
31+
* <ul>
32+
* <li> {@link #getDefiniteComponentGetter(FieldEntry)}
33+
* <li> {@link #getDefiniteComponentField(MethodEntry)}
34+
* <li> {@link #streamDefiniteComponentMethods(ClassEntry)}
35+
* </ul>
36+
* Probable:
37+
* <ul>
38+
* <li> {@link #getProbableComponentGetter(FieldEntry)}
39+
* <li> {@link #getProbableComponentField(MethodEntry)}
40+
* <li> {@link #streamProbableComponentMethods(ClassEntry)}
41+
* </ul>
42+
*/
1543
public class RecordIndexingService implements JarIndexerService {
1644
public static final String ID = "enigma:record_component_indexer";
1745

@@ -21,24 +49,108 @@ public class RecordIndexingService implements JarIndexerService {
2149
this.visitor = visitor;
2250
}
2351

52+
/**
53+
* @return the {@link MethodEntry} representing the getter of the passed {@code componentField},
54+
* or {@code null} if the passed {@code componentField} is not a record component field
55+
* or if its getter could not be determined; returns both
56+
* {@linkplain #getDefiniteComponentGetter(FieldEntry) definitive} and
57+
* {@linkplain #getProbableComponentGetter(FieldEntry) probable} getters
58+
*/
2459
@Nullable
2560
public MethodEntry getComponentGetter(FieldEntry componentField) {
2661
return this.visitor.getComponentGetter(componentField);
2762
}
2863

64+
/**
65+
* @return the {@link FieldEntry} representing the field of the passed {@code componentGetter},
66+
* or {@code null} if the passed {@code componentGetter} is not a record component getter
67+
* or if its field could not be determined; returns both
68+
* {@linkplain #getDefiniteComponentField(MethodEntry) definitive} and
69+
* {@linkplain #getProbableComponentField(MethodEntry) probable} fields
70+
*/
2971
@Nullable
3072
public FieldEntry getComponentField(MethodEntry componentGetter) {
3173
return this.visitor.getComponentField(componentGetter);
3274
}
3375

76+
/**
77+
* @return the definitive {@link MethodEntry} representing the getter of the passed {@code componentField},
78+
* or {@code null} if the passed {@code componentField} is not a record component field
79+
* or if its getter could not be definitively determined
80+
*/
81+
@Nullable
82+
public MethodEntry getDefiniteComponentGetter(FieldEntry componentField) {
83+
return this.visitor.getDefiniteComponentGetter(componentField);
84+
}
85+
86+
/**
87+
* @return the definitive {@link FieldEntry} representing the field of the passed {@code componentGetter},
88+
* or {@code null} if the passed {@code componentGetter} is not a record component getter
89+
* or if its field could not be definitively determined
90+
*/
91+
@Nullable
92+
public FieldEntry getDefiniteComponentField(MethodEntry componentGetter) {
93+
return this.visitor.getDefiniteComponentField(componentGetter);
94+
}
95+
96+
/**
97+
* @return the probable {@link MethodEntry} representing the getter of the passed {@code componentField},
98+
* or {@code null} if the passed {@code componentField} is not a record component field
99+
* or if its getter was not probabilistically determined;
100+
* does not include {@linkplain #getDefiniteComponentGetter(FieldEntry) definitive} getters
101+
*/
102+
@Nullable
103+
public MethodEntry getProbableComponentGetter(FieldEntry componentField) {
104+
return this.visitor.getProbableComponentGetter(componentField);
105+
}
106+
107+
/**
108+
* @return the probably {@link FieldEntry} representing the field of the passed {@code componentGetter},
109+
* or {@code null} if the passed {@code componentGetter} is not a record component getter
110+
* or if its field was not probabilistically determined;
111+
* does not include {@linkplain #getDefiniteComponentField(MethodEntry) definitive} fields
112+
*/
113+
@Nullable
114+
public FieldEntry getProbableComponentField(MethodEntry componentGetter) {
115+
return this.visitor.getProbableComponentField(componentGetter);
116+
}
117+
118+
/**
119+
* @return a {@link Stream} of component fields of the passed {@code recordEntry};
120+
* there's no uncertainty in getter field determination, so all fields are always included;
121+
* if the passed {@code recordEntry} does not represent a record, the stream is empty
122+
*/
34123
public Stream<FieldEntry> streamComponentFields(ClassEntry recordEntry) {
35124
return this.visitor.streamComponentFields(recordEntry);
36125
}
37126

127+
/**
128+
* @return a {@link Stream} of component getter methods of the passed {@code recordEntry};
129+
* includes both {@linkplain #streamDefiniteComponentMethods(ClassEntry) definitive} and
130+
* {@linkplain #streamProbableComponentMethods(ClassEntry) probable} getters;
131+
* if the passed {@code recordEntry} does not represent a record, the stream is empty
132+
*/
38133
public Stream<MethodEntry> streamComponentMethods(ClassEntry recordEntry) {
39134
return this.visitor.streamComponentMethods(recordEntry);
40135
}
41136

137+
/**
138+
* @return a {@link Stream} of definitive component getter methods of the passed {@code recordEntry};
139+
* if the passed {@code recordEntry} does not represent a record, the stream is empty
140+
*/
141+
public Stream<MethodEntry> streamDefiniteComponentMethods(ClassEntry recordEntry) {
142+
return this.visitor.streamDefiniteComponentMethods(recordEntry);
143+
}
144+
145+
/**
146+
* @return a {@link Stream} of probable component getter methods of the passed {@code recordEntry};
147+
* does not include {@linkplain #streamDefiniteComponentMethods(ClassEntry) definitive} getters;
148+
* if the passed {@code recordEntry} does not represent a record, the stream is empty
149+
*/
150+
public Stream<MethodEntry> streamProbableComponentMethods(ClassEntry recordEntry) {
151+
return this.visitor.streamProbableComponentMethods(recordEntry);
152+
}
153+
42154
@Override
43155
public void acceptJar(Set<String> scope, ProjectClassProvider classProvider, JarIndex jarIndex) {
44156
for (String className : scope) {

enigma/src/main/java/org/quiltmc/enigma/impl/plugin/RecordIndexingVisitor.java

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@
2828
import java.util.Set;
2929
import java.util.stream.Stream;
3030

31-
// TODO add tests
32-
// TODO javadoc, including getter uncertainty
31+
/**
32+
* @see RecordIndexingService
33+
*/
3334
final class RecordIndexingVisitor extends ClassVisitor {
3435
private static final int REQUIRED_GETTER_ACCESS = Opcodes.ACC_PUBLIC;
3536
private static final int ILLEGAL_GETTER_ACCESS = Opcodes.ACC_SYNTHETIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_STATIC;
@@ -40,8 +41,7 @@ final class RecordIndexingVisitor extends ClassVisitor {
4041
// visitation state fields; cleared in visitEnd()
4142
private ClassEntry clazz;
4243
private final Set<RecordComponentNode> recordComponents = new HashSet<>();
43-
// TODO investigate this; may need to replace clazz with a class stack and to change this to fieldsByNameByClass
44-
// this is a multimap because inner classes' fields go in the same map as their outer class's
44+
// this is a multimap because proguard can give component fields with different types the same name
4545
private final Multimap<String, FieldNode> fieldsByName = HashMultimap.create();
4646
private final Multimap<String, MethodNode> methodsByDescriptor = HashMultimap.create();
4747

@@ -60,14 +60,18 @@ final class RecordIndexingVisitor extends ClassVisitor {
6060
super(Enigma.ASM_VERSION);
6161
}
6262

63-
// TODO javadoc
63+
/**
64+
* @see RecordIndexingService#getComponentGetter(FieldEntry)
65+
*/
6466
@Nullable
6567
public MethodEntry getComponentGetter(FieldEntry componentField) {
6668
final MethodEntry definiteGetter = this.definiteComponentGettersByField.get(componentField);
6769
return definiteGetter == null ? this.probableComponentGettersByField.get(componentField) : definiteGetter;
6870
}
6971

70-
// TODO javadoc
72+
/**
73+
* @see RecordIndexingService#getComponentField(MethodEntry)
74+
*/
7175
@Nullable
7276
public FieldEntry getComponentField(MethodEntry componentGetter) {
7377
final FieldEntry definiteField = this.definiteComponentGettersByField.inverse().get(componentGetter);
@@ -76,49 +80,65 @@ public FieldEntry getComponentField(MethodEntry componentGetter) {
7680
: definiteField;
7781
}
7882

79-
// TODO javadoc, prevent directly naming method (always match field)
83+
/**
84+
* @see RecordIndexingService#getDefiniteComponentGetter(FieldEntry)
85+
*/
8086
@Nullable
8187
public MethodEntry getDefiniteComponentGetter(FieldEntry componentField) {
8288
return this.definiteComponentGettersByField.get(componentField);
8389
}
8490

85-
// TODO javadoc
91+
/**
92+
* @see RecordIndexingService#getDefiniteComponentField(MethodEntry)
93+
*/
8694
@Nullable
8795
public FieldEntry getDefiniteComponentField(MethodEntry componentGetter) {
8896
return this.definiteComponentGettersByField.inverse().get(componentGetter);
8997
}
9098

91-
// TODO javadoc
99+
/**
100+
* @see RecordIndexingService#getProbableComponentGetter(FieldEntry)
101+
*/
92102
@Nullable
93103
public MethodEntry getProbableComponentGetter(FieldEntry componentField) {
94104
return this.probableComponentGettersByField.get(componentField);
95105
}
96106

97-
// TODO javadoc
107+
/**
108+
* @see RecordIndexingService#getProbableComponentField(MethodEntry)
109+
*/
98110
@Nullable
99111
public FieldEntry getProbableComponentField(MethodEntry componentGetter) {
100112
return this.probableComponentGettersByField.inverse().get(componentGetter);
101113
}
102114

103-
// TODO javadoc
115+
/**
116+
* @see RecordIndexingService#streamComponentFields(ClassEntry)
117+
*/
104118
public Stream<FieldEntry> streamComponentFields(ClassEntry recordEntry) {
105119
return this.componentFieldsByClass.get(recordEntry).stream();
106120
}
107121

108-
// TODO javadoc
122+
/**
123+
* @see RecordIndexingService#streamComponentMethods(ClassEntry)
124+
*/
109125
public Stream<MethodEntry> streamComponentMethods(ClassEntry recordEntry) {
110126
return Stream.concat(
111127
this.definiteComponentGettersByClass.get(recordEntry).stream(),
112128
this.probableComponentGettersByClass.get(recordEntry).stream()
113129
);
114130
}
115131

116-
// TODO javadoc
132+
/**
133+
* @see RecordIndexingService#streamDefiniteComponentMethods(ClassEntry)
134+
*/
117135
public Stream<MethodEntry> streamDefiniteComponentMethods(ClassEntry recordEntry) {
118136
return this.definiteComponentGettersByClass.get(recordEntry).stream();
119137
}
120138

121-
// TODO javadoc
139+
/**
140+
* @see RecordIndexingService#streamProbableComponentMethods(ClassEntry)
141+
*/
122142
public Stream<MethodEntry> streamProbableComponentMethods(ClassEntry recordEntry) {
123143
return this.probableComponentGettersByClass.get(recordEntry).stream();
124144
}

0 commit comments

Comments
 (0)