31
31
import dev .denwav .hypo .asm .AsmMethodData ;
32
32
import dev .denwav .hypo .core .HypoContext ;
33
33
import dev .denwav .hypo .hydrate .generic .HypoHydration ;
34
+ import dev .denwav .hypo .model .HypoModelUtil ;
34
35
import dev .denwav .hypo .model .data .ClassData ;
35
36
import dev .denwav .hypo .model .data .ClassKind ;
36
37
import dev .denwav .hypo .model .data .FieldData ;
@@ -71,7 +72,11 @@ private void fixJar() throws IOException {
71
72
final var tasks = new ArrayList <Future <?>>();
72
73
for (final ClassData classData : this .context .getProvider ().allClasses ()) {
73
74
final var task = this .context .getExecutor ().submit (() -> {
74
- this .processClass ((AsmClassData ) classData );
75
+ try {
76
+ this .processClass ((AsmClassData ) classData );
77
+ } catch (final IOException e ) {
78
+ throw HypoModelUtil .rethrow (e );
79
+ }
75
80
});
76
81
tasks .add (task );
77
82
}
@@ -87,8 +92,9 @@ private void fixJar() throws IOException {
87
92
}
88
93
}
89
94
90
- private void processClass (final AsmClassData classData ) {
95
+ private void processClass (final AsmClassData classData ) throws IOException {
91
96
OverrideAnnotationAdder .addAnnotations (classData );
97
+ EmptyRecordFixer .fixClass (classData );
92
98
RecordFieldAccessFixer .fixClass (classData );
93
99
DeprecatedAnnotationAdder .addAnnotations (classData );
94
100
}
@@ -151,13 +157,34 @@ private static void addAnnotations(final AsmClassData classData) {
151
157
}
152
158
}
153
159
160
+ private static final class EmptyRecordFixer {
161
+
162
+ private EmptyRecordFixer () {}
163
+
164
+ private static void fixClass (final AsmClassData classData ) throws IOException {
165
+ if (classData .is (ClassKind .RECORD )) {
166
+ return ;
167
+ }
168
+
169
+ final @ Nullable ClassData superClass = classData .superClass ();
170
+ if (superClass == null ) {
171
+ return ;
172
+ }
173
+
174
+ if (superClass .name ().equals ("java/lang/Record" )) {
175
+ // extends record, but is not marked as such
176
+ classData .getNode ().access |= Opcodes .ACC_RECORD ;
177
+ }
178
+ }
179
+ }
180
+
154
181
private static final class RecordFieldAccessFixer {
155
182
private static final int RESET_ACCESS = ~(Opcodes .ACC_PUBLIC | Opcodes .ACC_PRIVATE | Opcodes .ACC_PROTECTED );
156
183
157
184
private RecordFieldAccessFixer () {}
158
185
159
186
private static void fixClass (final AsmClassData classData ) {
160
- if (classData .kind () != ClassKind .RECORD ) {
187
+ if (classData .isNot ( ClassKind .RECORD ) ) {
161
188
return ;
162
189
}
163
190
0 commit comments