1
1
/*
2
- * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
24
24
*/
25
25
package jdk .internal .classfile .impl ;
26
26
27
+ import java .lang .classfile .ClassFileBuilder ;
28
+ import java .lang .classfile .ClassFileTransform ;
27
29
import java .util .function .Consumer ;
28
30
import java .util .function .Predicate ;
29
31
import java .util .function .Supplier ;
32
34
import java .lang .classfile .ClassElement ;
33
35
import java .lang .classfile .ClassTransform ;
34
36
import java .lang .classfile .ClassFileElement ;
35
- import java .lang .classfile .ClassFileTransform ;
36
37
import java .lang .classfile .CodeBuilder ;
37
38
import java .lang .classfile .CodeElement ;
38
39
import java .lang .classfile .CodeModel ;
46
47
import java .lang .classfile .MethodModel ;
47
48
import java .lang .classfile .MethodTransform ;
48
49
49
- public class TransformImpl {
50
+ public final class TransformImpl {
50
51
// ClassTransform
51
52
52
53
private TransformImpl () {
@@ -58,7 +59,23 @@ private static Runnable chainRunnable(Runnable a, Runnable b) {
58
59
59
60
private static final Runnable NOTHING = () -> { };
60
61
61
- interface UnresolvedClassTransform extends ClassTransform {
62
+ public static <E extends ClassFileElement , B extends ClassFileBuilder <E , B >>
63
+ ResolvedTransform <E > resolve (ClassFileTransform <?, E , B > transform , B builder ) {
64
+ if (transform instanceof ResolvableTransform ) {
65
+ @ SuppressWarnings ("unchecked" )
66
+ var ut = (ResolvableTransform <E , B >) transform ;
67
+ return ut .resolve (builder );
68
+ }
69
+ return new ResolvedTransform <>(e -> transform .accept (builder , e ),
70
+ () -> transform .atEnd (builder ),
71
+ () -> transform .atStart (builder ));
72
+ }
73
+
74
+ interface ResolvableTransform <E extends ClassFileElement , B extends ClassFileBuilder <E , B >> {
75
+ ResolvedTransform <E > resolve (B builder );
76
+ }
77
+
78
+ interface UnresolvedClassTransform extends ClassTransform , ResolvableTransform <ClassElement , ClassBuilder > {
62
79
@ Override
63
80
default void accept (ClassBuilder builder , ClassElement element ) {
64
81
throw new UnsupportedOperationException ("transforms must be resolved before running" );
@@ -75,12 +92,11 @@ default void atStart(ClassBuilder builder) {
75
92
}
76
93
}
77
94
78
- public record ResolvedTransformImpl <E extends ClassFileElement >(Consumer <E > consumer ,
95
+ public record ResolvedTransform <E extends ClassFileElement >(Consumer <E > consumer ,
79
96
Runnable endHandler ,
80
- Runnable startHandler )
81
- implements ClassFileTransform .ResolvedTransform <E > {
97
+ Runnable startHandler ) {
82
98
83
- public ResolvedTransformImpl (Consumer <E > consumer ) {
99
+ public ResolvedTransform (Consumer <E > consumer ) {
84
100
this (consumer , NOTHING , NOTHING );
85
101
}
86
102
}
@@ -89,11 +105,11 @@ public record ChainedClassTransform(ClassTransform t,
89
105
ClassTransform next )
90
106
implements UnresolvedClassTransform {
91
107
@ Override
92
- public ResolvedTransformImpl <ClassElement > resolve (ClassBuilder builder ) {
93
- ResolvedTransform <ClassElement > downstream = next .resolve (builder );
108
+ public ResolvedTransform <ClassElement > resolve (ClassBuilder builder ) {
109
+ ResolvedTransform <ClassElement > downstream = TransformImpl .resolve (next , builder );
94
110
ClassBuilder chainedBuilder = new ChainedClassBuilder (builder , downstream .consumer ());
95
- ResolvedTransform <ClassElement > upstream = t .resolve (chainedBuilder );
96
- return new ResolvedTransformImpl <>(upstream .consumer (),
111
+ ResolvedTransform <ClassElement > upstream = TransformImpl .resolve (t , chainedBuilder );
112
+ return new ResolvedTransform <>(upstream .consumer (),
97
113
chainRunnable (upstream .endHandler (), downstream .endHandler ()),
98
114
chainRunnable (upstream .startHandler (), downstream .startHandler ()));
99
115
}
@@ -103,7 +119,7 @@ public record SupplierClassTransform(Supplier<ClassTransform> supplier)
103
119
implements UnresolvedClassTransform {
104
120
@ Override
105
121
public ResolvedTransform <ClassElement > resolve (ClassBuilder builder ) {
106
- return supplier .get (). resolve ( builder );
122
+ return TransformImpl . resolve ( supplier .get (), builder );
107
123
}
108
124
}
109
125
@@ -112,7 +128,7 @@ public record ClassMethodTransform(MethodTransform transform,
112
128
implements UnresolvedClassTransform {
113
129
@ Override
114
130
public ResolvedTransform <ClassElement > resolve (ClassBuilder builder ) {
115
- return new ResolvedTransformImpl <>(ce -> {
131
+ return new ResolvedTransform <>(ce -> {
116
132
if (ce instanceof MethodModel mm && filter .test (mm ))
117
133
builder .transformMethod (mm , transform );
118
134
else
@@ -135,7 +151,7 @@ public record ClassFieldTransform(FieldTransform transform,
135
151
implements UnresolvedClassTransform {
136
152
@ Override
137
153
public ResolvedTransform <ClassElement > resolve (ClassBuilder builder ) {
138
- return new ResolvedTransformImpl <>(ce -> {
154
+ return new ResolvedTransform <>(ce -> {
139
155
if (ce instanceof FieldModel fm && filter .test (fm ))
140
156
builder .transformField (fm , transform );
141
157
else
@@ -155,7 +171,7 @@ public ClassTransform andThen(ClassTransform next) {
155
171
156
172
// MethodTransform
157
173
158
- interface UnresolvedMethodTransform extends MethodTransform {
174
+ interface UnresolvedMethodTransform extends MethodTransform , ResolvableTransform < MethodElement , MethodBuilder > {
159
175
@ Override
160
176
default void accept (MethodBuilder builder , MethodElement element ) {
161
177
throw new UnsupportedOperationException ("transforms must be resolved before running" );
@@ -177,10 +193,10 @@ public record ChainedMethodTransform(MethodTransform t,
177
193
implements TransformImpl .UnresolvedMethodTransform {
178
194
@ Override
179
195
public ResolvedTransform <MethodElement > resolve (MethodBuilder builder ) {
180
- ResolvedTransform <MethodElement > downstream = next .resolve (builder );
196
+ ResolvedTransform <MethodElement > downstream = TransformImpl .resolve (next , builder );
181
197
MethodBuilder chainedBuilder = new ChainedMethodBuilder (builder , downstream .consumer ());
182
- ResolvedTransform <MethodElement > upstream = t .resolve (chainedBuilder );
183
- return new ResolvedTransformImpl <>(upstream .consumer (),
198
+ ResolvedTransform <MethodElement > upstream = TransformImpl .resolve (t , chainedBuilder );
199
+ return new ResolvedTransform <>(upstream .consumer (),
184
200
chainRunnable (upstream .endHandler (), downstream .endHandler ()),
185
201
chainRunnable (upstream .startHandler (), downstream .startHandler ()));
186
202
}
@@ -190,15 +206,15 @@ public record SupplierMethodTransform(Supplier<MethodTransform> supplier)
190
206
implements TransformImpl .UnresolvedMethodTransform {
191
207
@ Override
192
208
public ResolvedTransform <MethodElement > resolve (MethodBuilder builder ) {
193
- return supplier .get (). resolve ( builder );
209
+ return TransformImpl . resolve ( supplier .get (), builder );
194
210
}
195
211
}
196
212
197
213
public record MethodCodeTransform (CodeTransform xform )
198
214
implements TransformImpl .UnresolvedMethodTransform {
199
215
@ Override
200
216
public ResolvedTransform <MethodElement > resolve (MethodBuilder builder ) {
201
- return new ResolvedTransformImpl <>(me -> {
217
+ return new ResolvedTransform <>(me -> {
202
218
if (me instanceof CodeModel cm ) {
203
219
builder .transformCode (cm , xform );
204
220
}
@@ -219,7 +235,7 @@ public MethodTransform andThen(MethodTransform next) {
219
235
220
236
// FieldTransform
221
237
222
- interface UnresolvedFieldTransform extends FieldTransform {
238
+ interface UnresolvedFieldTransform extends FieldTransform , ResolvableTransform < FieldElement , FieldBuilder > {
223
239
@ Override
224
240
default void accept (FieldBuilder builder , FieldElement element ) {
225
241
throw new UnsupportedOperationException ("transforms must be resolved before running" );
@@ -240,10 +256,10 @@ public record ChainedFieldTransform(FieldTransform t, FieldTransform next)
240
256
implements UnresolvedFieldTransform {
241
257
@ Override
242
258
public ResolvedTransform <FieldElement > resolve (FieldBuilder builder ) {
243
- ResolvedTransform <FieldElement > downstream = next .resolve (builder );
259
+ ResolvedTransform <FieldElement > downstream = TransformImpl .resolve (next , builder );
244
260
FieldBuilder chainedBuilder = new ChainedFieldBuilder (builder , downstream .consumer ());
245
- ResolvedTransform <FieldElement > upstream = t .resolve (chainedBuilder );
246
- return new ResolvedTransformImpl <>(upstream .consumer (),
261
+ ResolvedTransform <FieldElement > upstream = TransformImpl .resolve (t , chainedBuilder );
262
+ return new ResolvedTransform <>(upstream .consumer (),
247
263
chainRunnable (upstream .endHandler (), downstream .endHandler ()),
248
264
chainRunnable (upstream .startHandler (), downstream .startHandler ()));
249
265
}
@@ -253,13 +269,13 @@ public record SupplierFieldTransform(Supplier<FieldTransform> supplier)
253
269
implements UnresolvedFieldTransform {
254
270
@ Override
255
271
public ResolvedTransform <FieldElement > resolve (FieldBuilder builder ) {
256
- return supplier .get (). resolve ( builder );
272
+ return TransformImpl . resolve ( supplier .get (), builder );
257
273
}
258
274
}
259
275
260
276
// CodeTransform
261
277
262
- interface UnresolvedCodeTransform extends CodeTransform {
278
+ interface UnresolvedCodeTransform extends CodeTransform , ResolvableTransform < CodeElement , CodeBuilder > {
263
279
@ Override
264
280
default void accept (CodeBuilder builder , CodeElement element ) {
265
281
throw new UnsupportedOperationException ("transforms must be resolved before running" );
@@ -280,10 +296,10 @@ public record ChainedCodeTransform(CodeTransform t, CodeTransform next)
280
296
implements UnresolvedCodeTransform {
281
297
@ Override
282
298
public ResolvedTransform <CodeElement > resolve (CodeBuilder builder ) {
283
- ResolvedTransform <CodeElement > downstream = next .resolve (builder );
299
+ ResolvedTransform <CodeElement > downstream = TransformImpl .resolve (next , builder );
284
300
CodeBuilder chainedBuilder = new ChainedCodeBuilder (builder , downstream .consumer ());
285
- ResolvedTransform <CodeElement > upstream = t .resolve (chainedBuilder );
286
- return new ResolvedTransformImpl <>(upstream .consumer (),
301
+ ResolvedTransform <CodeElement > upstream = TransformImpl .resolve (t , chainedBuilder );
302
+ return new ResolvedTransform <>(upstream .consumer (),
287
303
chainRunnable (upstream .endHandler (), downstream .endHandler ()),
288
304
chainRunnable (upstream .startHandler (), downstream .startHandler ()));
289
305
}
@@ -293,7 +309,7 @@ public record SupplierCodeTransform(Supplier<CodeTransform> supplier)
293
309
implements UnresolvedCodeTransform {
294
310
@ Override
295
311
public ResolvedTransform <CodeElement > resolve (CodeBuilder builder ) {
296
- return supplier .get (). resolve ( builder );
312
+ return TransformImpl . resolve ( supplier .get (), builder );
297
313
}
298
314
}
299
315
}
0 commit comments