@@ -63,20 +63,22 @@ public class RecordTransformer { // checkstyle-disable-line ClassFanOutComplexit
63
63
private final List <Consumer <Record >> consumers = new LinkedList <>();
64
64
private final List <Map <String , String >> vars = new ArrayList <>();
65
65
private final Metafix metafix ;
66
+ private final RecordTransformer parent ;
66
67
67
68
private Supplier <String > currentMessageSupplier ;
68
69
69
70
/*package-private*/ RecordTransformer (final Metafix metafix , final Fix fix ) {
70
- this (metafix , fix .getElements ());
71
+ this (metafix , fix .getElements (), null );
72
+ addVars (metafix .getVars ());
71
73
}
72
74
73
- private RecordTransformer (final Metafix metafix , final List <Expression > expressions ) {
75
+ private RecordTransformer (final Metafix metafix , final List <Expression > expressions , final RecordTransformer parent ) {
74
76
this .metafix = metafix ;
75
- addVars ( metafix . getVars ()) ;
77
+ this . parent = parent ;
76
78
77
79
expressions .forEach (e -> {
78
- final Params params = new Params (e .getParams (), vars );
79
- final Options options = new Options (e .getOptions (), vars );
80
+ final Params params = new Params (e .getParams (), this );
81
+ final Options options = new Options (e .getOptions (), this );
80
82
81
83
if (e instanceof Do ) {
82
84
processDo ((Do ) e , params , options );
@@ -96,6 +98,10 @@ else if (e instanceof MethodCall) {
96
98
});
97
99
}
98
100
101
+ private RecordTransformer childTransformer (final List <Expression > expressions ) {
102
+ return new RecordTransformer (metafix , expressions , this );
103
+ }
104
+
99
105
public void addVars (final Map <String , String > additionalVars ) {
100
106
vars .add (additionalVars );
101
107
}
@@ -125,7 +131,7 @@ public void transform(final Record record) {
125
131
private void processDo (final Do expression , final Params params , final Options options ) {
126
132
processFix (() -> executionExceptionMessage (expression ), () -> {
127
133
final FixContext context = getInstance (expression .getName (), FixContext .class , FixBind ::valueOf );
128
- final RecordTransformer recordTransformer = new RecordTransformer ( metafix , expression .getElements ());
134
+ final RecordTransformer recordTransformer = childTransformer ( expression .getElements ());
129
135
130
136
return record -> context .execute (metafix , record , params .resolve (), options .resolve (), recordTransformer );
131
137
});
@@ -140,14 +146,14 @@ private void processIf(final If ifExpression, final Params ifParams, final Optio
140
146
141
147
processFix (() -> executionExceptionMessage (ifExpression , ifExpression .eResource ()), () -> {
142
148
final FixPredicate ifPredicate = getInstance (ifExpression .getName (), FixPredicate .class , FixConditional ::valueOf );
143
- final RecordTransformer ifTransformer = new RecordTransformer ( metafix , ifExpression .getElements ());
149
+ final RecordTransformer ifTransformer = childTransformer ( ifExpression .getElements ());
144
150
145
151
final List <FixPredicate > elseIfPredicates = mapList (elseIfExpressions , e -> getInstance (e .getName (), FixPredicate .class , FixConditional ::valueOf ));
146
- final List <Params > elseIfParamsList = mapList (elseIfExpressions , e -> new Params (e .getParams (), vars ));
147
- final List <Options > elseIfOptionsList = mapList (elseIfExpressions , e -> new Options (e .getOptions (), vars ));
148
- final List <RecordTransformer > elseIfTransformers = mapList (elseIfExpressions , e -> new RecordTransformer ( metafix , e .getElements ()));
152
+ final List <Params > elseIfParamsList = mapList (elseIfExpressions , e -> new Params (e .getParams (), this ));
153
+ final List <Options > elseIfOptionsList = mapList (elseIfExpressions , e -> new Options (e .getOptions (), this ));
154
+ final List <RecordTransformer > elseIfTransformers = mapList (elseIfExpressions , e -> childTransformer ( e .getElements ()));
149
155
150
- final RecordTransformer elseTransformer = elseExpression != null ? new RecordTransformer ( metafix , elseExpression .getElements ()) : null ;
156
+ final RecordTransformer elseTransformer = elseExpression != null ? childTransformer ( elseExpression .getElements ()) : null ;
151
157
152
158
return record -> {
153
159
if (ifPredicate .test (metafix , record , ifParams .resolve (), ifOptions .resolve ())) {
@@ -182,7 +188,7 @@ private void processIf(final If ifExpression, final Params ifParams, final Optio
182
188
private void processUnless (final Unless expression , final Params params , final Options options ) {
183
189
processFix (() -> executionExceptionMessage (expression , expression .eResource ()), () -> {
184
190
final FixPredicate predicate = getInstance (expression .getName (), FixPredicate .class , FixConditional ::valueOf );
185
- final RecordTransformer recordTransformer = new RecordTransformer ( metafix , expression .getElements ());
191
+ final RecordTransformer recordTransformer = childTransformer ( expression .getElements ());
186
192
187
193
return record -> {
188
194
if (!predicate .test (metafix , record , params .resolve (), options .resolve ())) {
@@ -255,6 +261,12 @@ private String executionExceptionMessage(final EObject object, final Resource re
255
261
resource .getURI (), node .getStartLine (), NodeModelUtils .getTokenText (node ));
256
262
}
257
263
264
+ private Map <String , String > getVars () {
265
+ final Map <String , String > mergedVars = parent != null ? parent .getVars () : new HashMap <>();
266
+ vars .forEach (mergedVars ::putAll );
267
+ return mergedVars ;
268
+ }
269
+
258
270
private abstract static class AbstractResolvable <T > {
259
271
260
272
protected boolean isResolvable (final String value ) {
@@ -265,25 +277,19 @@ protected String resolveVars(final String value, final Map<String, String> vars)
265
277
return value == null ? null : StringUtil .format (value , Metafix .VAR_START , Metafix .VAR_END , false , vars );
266
278
}
267
279
268
- protected Map <String , String > mergeVars (final List <Map <String , String >> vars ) {
269
- final Map <String , String > mergedVars = new HashMap <>();
270
- vars .forEach (mergedVars ::putAll );
271
- return mergedVars ;
272
- }
273
-
274
280
protected abstract T resolve ();
275
281
276
282
}
277
283
278
284
private static class Params extends AbstractResolvable <List <String >> {
279
285
280
286
private final List <String > list ;
281
- private final List < Map < String , String >> vars ;
287
+ private final RecordTransformer recordTransformer ;
282
288
private final boolean resolve ;
283
289
284
- private Params (final List <String > list , final List < Map < String , String >> vars ) {
290
+ private Params (final List <String > list , final RecordTransformer recordTransformer ) {
285
291
this .list = list ;
286
- this .vars = vars ;
292
+ this .recordTransformer = recordTransformer ;
287
293
288
294
resolve = list .stream ().anyMatch (this ::isResolvable );
289
295
}
@@ -292,10 +298,10 @@ private Params(final List<String> list, final List<Map<String, String>> vars) {
292
298
protected List <String > resolve () {
293
299
if (resolve ) {
294
300
final List <String > resolvedList = new ArrayList <>(list .size ());
295
- final Map <String , String > mergedVars = mergeVars ( vars );
301
+ final Map <String , String > vars = recordTransformer . getVars ( );
296
302
297
303
for (final String entry : list ) {
298
- resolvedList .add (resolveVars (entry , mergedVars ));
304
+ resolvedList .add (resolveVars (entry , vars ));
299
305
}
300
306
301
307
return resolvedList ;
@@ -310,11 +316,11 @@ protected List<String> resolve() {
310
316
private static class Options extends AbstractResolvable <Map <String , String >> {
311
317
312
318
private final Map <String , String > map = new LinkedHashMap <>();
313
- private final List < Map < String , String >> vars ;
319
+ private final RecordTransformer recordTransformer ;
314
320
private final boolean resolve ;
315
321
316
- private Options (final org .metafacture .metafix .fix .Options options , final List < Map < String , String >> vars ) {
317
- this .vars = vars ;
322
+ private Options (final org .metafacture .metafix .fix .Options options , final RecordTransformer recordTransformer ) {
323
+ this .recordTransformer = recordTransformer ;
318
324
319
325
boolean resolveTemp = false ;
320
326
@@ -341,10 +347,10 @@ private Options(final org.metafacture.metafix.fix.Options options, final List<Ma
341
347
protected Map <String , String > resolve () {
342
348
if (resolve ) {
343
349
final Map <String , String > resolvedMap = new LinkedHashMap <>(map .size ());
344
- final Map <String , String > mergedVars = mergeVars ( vars );
350
+ final Map <String , String > vars = recordTransformer . getVars ( );
345
351
346
352
for (final Map .Entry <String , String > entry : map .entrySet ()) {
347
- resolvedMap .put (resolveVars (entry .getKey (), mergedVars ), resolveVars (entry .getValue (), mergedVars ));
353
+ resolvedMap .put (resolveVars (entry .getKey (), vars ), resolveVars (entry .getValue (), vars ));
348
354
}
349
355
350
356
return resolvedMap ;
0 commit comments