1212import java .util .Set ;
1313import 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+ */
1543public 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 ) {
0 commit comments