Skip to content

Commit 949a211

Browse files
authored
Improve builder value fill (#20)
1 parent 8d92510 commit 949a211

4 files changed

Lines changed: 136 additions & 106 deletions

File tree

processor/src/main/resources/org/mapstruct/tools/gem/processor/Gem.ftl

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -109,33 +109,29 @@ public class ${gemInfo.gemName} implements Gem {
109109
mirror.getElementValues().forEach( (key, value) -> values.put( key.getSimpleName().toString(), value ) );
110110

111111
// iterate and populate builder
112-
for ( String methodName : defaultValues.keySet() ) {
113-
112+
for ( Map.Entry<String, AnnotationValue> defaultMethod : defaultValues.entrySet() ) {
113+
String methodName = defaultMethod.getKey();
114+
AnnotationValue defaultValue = defaultMethod.getValue();
115+
AnnotationValue value = values.get( methodName );
116+
<#if (gemInfo.gemValueInfos?size < 4)>
117+
<#assign indentString = " ">
114118
<#list gemInfo.gemValueInfos as gemValueInfo>
115119
<#if gemValueInfo_index != 0>else </#if>if ( "${gemValueInfo.name}".equals( methodName ) ) {
116-
<@compress single_line=true>builder.set${gemValueInfo.name?capitalize}(
117-
<#if gemValueInfo.valueType.gem>
118-
<#if gemValueInfo.valueType.array>
119-
GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn )
120-
<#else>
121-
GemValue.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn )
122-
</#if>
123-
<#elseif gemValueInfo.valueType.enum>
124-
<#if gemValueInfo.valueType.array>
125-
GemValue.createEnumArray( values.get( methodName ), defaultValues.get( methodName ) )
126-
<#else>
127-
GemValue.createEnum( values.get( methodName ), defaultValues.get( methodName ) )
128-
</#if>
129-
<#else>
130-
<#if gemValueInfo.valueType.array>
131-
GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class )
132-
<#else>
133-
GemValue.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class )
134-
</#if>
135-
</#if>
136-
);</@compress>
120+
<@fillBuilder gemValueInfo, indentString/>
121+
137122
}
138123
</#list>
124+
<#else>
125+
switch ( methodName ) {
126+
<#assign indentString = " ">
127+
<#list gemInfo.gemValueInfos as gemValueInfo>
128+
case "${gemValueInfo.name}":
129+
<@fillBuilder gemValueInfo, indentString/>
130+
131+
break;
132+
</#list>
133+
}
134+
</#if>
139135
}
140136
</#if>
141137
builder.setMirror( mirror );
@@ -200,3 +196,27 @@ public class ${gemInfo.gemName} implements Gem {
200196
}
201197

202198
}
199+
<#macro fillBuilder gemValueInfo indent>
200+
${indent}<@compress single_line=true>builder.set${gemValueInfo.name?capitalize}(
201+
<#if gemValueInfo.valueType.gem>
202+
<#if gemValueInfo.valueType.array>
203+
GemValue.createArray( value, defaultValue, ${gemValueInfo.valueType.gemName}::instanceOn )
204+
<#else>
205+
GemValue.create( value, defaultValue, ${gemValueInfo.valueType.gemName}::instanceOn )
206+
</#if>
207+
<#elseif gemValueInfo.valueType.enum>
208+
<#if gemValueInfo.valueType.array>
209+
GemValue.createEnumArray( value, defaultValue )
210+
<#else>
211+
GemValue.createEnum( value, defaultValue )
212+
</#if>
213+
<#else>
214+
<#if gemValueInfo.valueType.array>
215+
GemValue.createArray( value, defaultValue, ${gemValueInfo.valueType.elementName}.class )
216+
<#else>
217+
GemValue.create( value, defaultValue, ${gemValueInfo.valueType.elementName}.class )
218+
</#if>
219+
</#if>
220+
);
221+
</@compress>
222+
</#macro>

processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationGem.java

Lines changed: 71 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -336,73 +336,77 @@ public static <T> T build(AnnotationMirror mirror, Builder<T> builder ) {
336336
mirror.getElementValues().forEach( (key, value) -> values.put( key.getSimpleName().toString(), value ) );
337337

338338
// iterate and populate builder
339-
for ( String methodName : defaultValues.keySet() ) {
340-
341-
if ( "myClassWithDefault".equals( methodName ) ) {
342-
builder.setMyclasswithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), TypeMirror.class ) );
343-
}
344-
else if ( "myBooleanWithDefault".equals( methodName ) ) {
345-
builder.setMybooleanwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Boolean.class ) );
346-
}
347-
else if ( "myCharWithDefault".equals( methodName ) ) {
348-
builder.setMycharwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Character.class ) );
349-
}
350-
else if ( "myByteWithDefault".equals( methodName ) ) {
351-
builder.setMybytewithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Byte.class ) );
352-
}
353-
else if ( "mShortWithDefault".equals( methodName ) ) {
354-
builder.setMshortwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Short.class ) );
355-
}
356-
else if ( "myIntWithDefault".equals( methodName ) ) {
357-
builder.setMyintwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) );
358-
}
359-
else if ( "myLongWithDefault".equals( methodName ) ) {
360-
builder.setMylongwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) );
361-
}
362-
else if ( "myFloatWithDefault".equals( methodName ) ) {
363-
builder.setMyfloatwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Float.class ) );
364-
}
365-
else if ( "myDoubleWithDefault".equals( methodName ) ) {
366-
builder.setMydoublewithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Double.class ) );
367-
}
368-
else if ( "myStringWithDefault".equals( methodName ) ) {
369-
builder.setMystringwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), String.class ) );
370-
}
371-
else if ( "myEnumWithDefault".equals( methodName ) ) {
372-
builder.setMyenumwithdefault( GemValue.createEnum( values.get( methodName ), defaultValues.get( methodName ) ) );
373-
}
374-
else if ( "myClass".equals( methodName ) ) {
375-
builder.setMyclass( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), TypeMirror.class ) );
376-
}
377-
else if ( "myBoolean".equals( methodName ) ) {
378-
builder.setMyboolean( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Boolean.class ) );
379-
}
380-
else if ( "myChar".equals( methodName ) ) {
381-
builder.setMychar( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Character.class ) );
382-
}
383-
else if ( "myByte".equals( methodName ) ) {
384-
builder.setMybyte( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Byte.class ) );
385-
}
386-
else if ( "myShort".equals( methodName ) ) {
387-
builder.setMyshort( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Short.class ) );
388-
}
389-
else if ( "myInt".equals( methodName ) ) {
390-
builder.setMyint( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) );
391-
}
392-
else if ( "myLong".equals( methodName ) ) {
393-
builder.setMylong( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) );
394-
}
395-
else if ( "myFloat".equals( methodName ) ) {
396-
builder.setMyfloat( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Float.class ) );
397-
}
398-
else if ( "myDouble".equals( methodName ) ) {
399-
builder.setMydouble( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Double.class ) );
400-
}
401-
else if ( "myString".equals( methodName ) ) {
402-
builder.setMystring( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), String.class ) );
403-
}
404-
else if ( "myEnum".equals( methodName ) ) {
405-
builder.setMyenum( GemValue.createEnum( values.get( methodName ), defaultValues.get( methodName ) ) );
339+
for ( Map.Entry<String, AnnotationValue> defaultMethod : defaultValues.entrySet() ) {
340+
String methodName = defaultMethod.getKey();
341+
AnnotationValue defaultValue = defaultMethod.getValue();
342+
AnnotationValue value = values.get( methodName );
343+
switch ( methodName ) {
344+
case "myClassWithDefault":
345+
builder.setMyclasswithdefault( GemValue.create( value, defaultValue, TypeMirror.class ) );
346+
break;
347+
case "myBooleanWithDefault":
348+
builder.setMybooleanwithdefault( GemValue.create( value, defaultValue, Boolean.class ) );
349+
break;
350+
case "myCharWithDefault":
351+
builder.setMycharwithdefault( GemValue.create( value, defaultValue, Character.class ) );
352+
break;
353+
case "myByteWithDefault":
354+
builder.setMybytewithdefault( GemValue.create( value, defaultValue, Byte.class ) );
355+
break;
356+
case "mShortWithDefault":
357+
builder.setMshortwithdefault( GemValue.create( value, defaultValue, Short.class ) );
358+
break;
359+
case "myIntWithDefault":
360+
builder.setMyintwithdefault( GemValue.create( value, defaultValue, Integer.class ) );
361+
break;
362+
case "myLongWithDefault":
363+
builder.setMylongwithdefault( GemValue.create( value, defaultValue, Integer.class ) );
364+
break;
365+
case "myFloatWithDefault":
366+
builder.setMyfloatwithdefault( GemValue.create( value, defaultValue, Float.class ) );
367+
break;
368+
case "myDoubleWithDefault":
369+
builder.setMydoublewithdefault( GemValue.create( value, defaultValue, Double.class ) );
370+
break;
371+
case "myStringWithDefault":
372+
builder.setMystringwithdefault( GemValue.create( value, defaultValue, String.class ) );
373+
break;
374+
case "myEnumWithDefault":
375+
builder.setMyenumwithdefault( GemValue.createEnum( value, defaultValue ) );
376+
break;
377+
case "myClass":
378+
builder.setMyclass( GemValue.create( value, defaultValue, TypeMirror.class ) );
379+
break;
380+
case "myBoolean":
381+
builder.setMyboolean( GemValue.create( value, defaultValue, Boolean.class ) );
382+
break;
383+
case "myChar":
384+
builder.setMychar( GemValue.create( value, defaultValue, Character.class ) );
385+
break;
386+
case "myByte":
387+
builder.setMybyte( GemValue.create( value, defaultValue, Byte.class ) );
388+
break;
389+
case "myShort":
390+
builder.setMyshort( GemValue.create( value, defaultValue, Short.class ) );
391+
break;
392+
case "myInt":
393+
builder.setMyint( GemValue.create( value, defaultValue, Integer.class ) );
394+
break;
395+
case "myLong":
396+
builder.setMylong( GemValue.create( value, defaultValue, Integer.class ) );
397+
break;
398+
case "myFloat":
399+
builder.setMyfloat( GemValue.create( value, defaultValue, Float.class ) );
400+
break;
401+
case "myDouble":
402+
builder.setMydouble( GemValue.create( value, defaultValue, Double.class ) );
403+
break;
404+
case "myString":
405+
builder.setMystring( GemValue.create( value, defaultValue, String.class ) );
406+
break;
407+
case "myEnum":
408+
builder.setMyenum( GemValue.createEnum( value, defaultValue ) );
409+
break;
406410
}
407411
}
408412
builder.setMirror( mirror );

processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationsGem.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,12 @@ public static <T> T build(AnnotationMirror mirror, Builder<T> builder ) {
8383
mirror.getElementValues().forEach( (key, value) -> values.put( key.getSimpleName().toString(), value ) );
8484

8585
// iterate and populate builder
86-
for ( String methodName : defaultValues.keySet() ) {
87-
86+
for ( Map.Entry<String, AnnotationValue> defaultMethod : defaultValues.entrySet() ) {
87+
String methodName = defaultMethod.getKey();
88+
AnnotationValue defaultValue = defaultMethod.getValue();
89+
AnnotationValue value = values.get( methodName );
8890
if ( "value".equals( methodName ) ) {
89-
builder.setValue( GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), SomeAnnotationGem::instanceOn ) );
91+
builder.setValue( GemValue.createArray( value, defaultValue, SomeAnnotationGem::instanceOn ) );
9092
}
9193
}
9294
builder.setMirror( mirror );

processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeArrayAnnotationGem.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,23 @@ public static <T> T build(AnnotationMirror mirror, Builder<T> builder ) {
120120
mirror.getElementValues().forEach( (key, value) -> values.put( key.getSimpleName().toString(), value ) );
121121

122122
// iterate and populate builder
123-
for ( String methodName : defaultValues.keySet() ) {
124-
125-
if ( "myClassWithDefault".equals( methodName ) ) {
126-
builder.setMyclasswithdefault( GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), TypeMirror.class ) );
127-
}
128-
else if ( "myBooleanWithDefault".equals( methodName ) ) {
129-
builder.setMybooleanwithdefault( GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), Boolean.class ) );
130-
}
131-
else if ( "myEnumWithDefault".equals( methodName ) ) {
132-
builder.setMyenumwithdefault( GemValue.createEnumArray( values.get( methodName ), defaultValues.get( methodName ) ) );
133-
}
134-
else if ( "myAnnotation".equals( methodName ) ) {
135-
builder.setMyannotation( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), SomeAnnotationGem::instanceOn ) );
123+
for ( Map.Entry<String, AnnotationValue> defaultMethod : defaultValues.entrySet() ) {
124+
String methodName = defaultMethod.getKey();
125+
AnnotationValue defaultValue = defaultMethod.getValue();
126+
AnnotationValue value = values.get( methodName );
127+
switch ( methodName ) {
128+
case "myClassWithDefault":
129+
builder.setMyclasswithdefault( GemValue.createArray( value, defaultValue, TypeMirror.class ) );
130+
break;
131+
case "myBooleanWithDefault":
132+
builder.setMybooleanwithdefault( GemValue.createArray( value, defaultValue, Boolean.class ) );
133+
break;
134+
case "myEnumWithDefault":
135+
builder.setMyenumwithdefault( GemValue.createEnumArray( value, defaultValue ) );
136+
break;
137+
case "myAnnotation":
138+
builder.setMyannotation( GemValue.create( value, defaultValue, SomeAnnotationGem::instanceOn ) );
139+
break;
136140
}
137141
}
138142
builder.setMirror( mirror );

0 commit comments

Comments
 (0)