diff --git a/processor/src/main/resources/org/mapstruct/tools/gem/processor/Gem.ftl b/processor/src/main/resources/org/mapstruct/tools/gem/processor/Gem.ftl index 0433d80..5f5e35c 100644 --- a/processor/src/main/resources/org/mapstruct/tools/gem/processor/Gem.ftl +++ b/processor/src/main/resources/org/mapstruct/tools/gem/processor/Gem.ftl @@ -106,33 +106,29 @@ public class ${gemInfo.gemName} implements Gem { mirror.getElementValues().entrySet().forEach( e -> values.put( e.getKey().getSimpleName().toString(), e.getValue() ) ); // iterate and populate builder - for ( String methodName : defaultValues.keySet() ) { - + for ( Map.Entry defaultMethod : defaultValues.entrySet() ) { + String methodName = defaultMethod.getKey(); + AnnotationValue defaultValue = defaultMethod.getValue(); + AnnotationValue value = values.get( methodName ); + <#if (gemInfo.gemValueInfos?size < 4)> + <#assign indentString = " "> <#list gemInfo.gemValueInfos as gemValueInfo> <#if gemValueInfo_index != 0>else if ( "${gemValueInfo.name}".equals( methodName ) ) { - <@compress single_line=true>builder.set${gemValueInfo.name?capitalize}( - <#if gemValueInfo.valueType.gem> - <#if gemValueInfo.valueType.array> - GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn ) - <#else> - GemValue.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn ) - - <#elseif gemValueInfo.valueType.enum> - <#if gemValueInfo.valueType.array> - GemValue.createEnumArray( values.get( methodName ), defaultValues.get( methodName ) ) - <#else> - GemValue.createEnum( values.get( methodName ), defaultValues.get( methodName ) ) - - <#else> - <#if gemValueInfo.valueType.array> - GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class ) - <#else> - GemValue.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class ) - - - ); + <@fillBuilder gemValueInfo, indentString/> + } + <#else> + switch ( methodName ) { + <#assign indentString = " "> + <#list gemInfo.gemValueInfos as gemValueInfo> + case "${gemValueInfo.name}": + <@fillBuilder gemValueInfo, indentString/> + + break; + + } + } builder.setMirror( mirror ); @@ -197,3 +193,27 @@ public class ${gemInfo.gemName} implements Gem { } } +<#macro fillBuilder gemValueInfo indent> + ${indent}<@compress single_line=true>builder.set${gemValueInfo.name?capitalize}( + <#if gemValueInfo.valueType.gem> + <#if gemValueInfo.valueType.array> + GemValue.createArray( value, defaultValue, ${gemValueInfo.valueType.gemName}::instanceOn ) + <#else> + GemValue.create( value, defaultValue, ${gemValueInfo.valueType.gemName}::instanceOn ) + + <#elseif gemValueInfo.valueType.enum> + <#if gemValueInfo.valueType.array> + GemValue.createEnumArray( value, defaultValue ) + <#else> + GemValue.createEnum( value, defaultValue ) + + <#else> + <#if gemValueInfo.valueType.array> + GemValue.createArray( value, defaultValue, ${gemValueInfo.valueType.elementName}.class ) + <#else> + GemValue.create( value, defaultValue, ${gemValueInfo.valueType.elementName}.class ) + + + ); + + \ No newline at end of file diff --git a/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationGem.java b/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationGem.java index 1d030cc..b5b83ad 100644 --- a/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationGem.java +++ b/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationGem.java @@ -336,73 +336,77 @@ public static T build(AnnotationMirror mirror, Builder builder ) { mirror.getElementValues().entrySet().forEach( e -> values.put( e.getKey().getSimpleName().toString(), e.getValue() ) ); // iterate and populate builder - for ( String methodName : defaultValues.keySet() ) { - - if ( "myClassWithDefault".equals( methodName ) ) { - builder.setMyclasswithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), TypeMirror.class ) ); - } - else if ( "myBooleanWithDefault".equals( methodName ) ) { - builder.setMybooleanwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Boolean.class ) ); - } - else if ( "myCharWithDefault".equals( methodName ) ) { - builder.setMycharwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Character.class ) ); - } - else if ( "myByteWithDefault".equals( methodName ) ) { - builder.setMybytewithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Byte.class ) ); - } - else if ( "mShortWithDefault".equals( methodName ) ) { - builder.setMshortwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Short.class ) ); - } - else if ( "myIntWithDefault".equals( methodName ) ) { - builder.setMyintwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) ); - } - else if ( "myLongWithDefault".equals( methodName ) ) { - builder.setMylongwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) ); - } - else if ( "myFloatWithDefault".equals( methodName ) ) { - builder.setMyfloatwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Float.class ) ); - } - else if ( "myDoubleWithDefault".equals( methodName ) ) { - builder.setMydoublewithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Double.class ) ); - } - else if ( "myStringWithDefault".equals( methodName ) ) { - builder.setMystringwithdefault( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), String.class ) ); - } - else if ( "myEnumWithDefault".equals( methodName ) ) { - builder.setMyenumwithdefault( GemValue.createEnum( values.get( methodName ), defaultValues.get( methodName ) ) ); - } - else if ( "myClass".equals( methodName ) ) { - builder.setMyclass( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), TypeMirror.class ) ); - } - else if ( "myBoolean".equals( methodName ) ) { - builder.setMyboolean( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Boolean.class ) ); - } - else if ( "myChar".equals( methodName ) ) { - builder.setMychar( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Character.class ) ); - } - else if ( "myByte".equals( methodName ) ) { - builder.setMybyte( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Byte.class ) ); - } - else if ( "myShort".equals( methodName ) ) { - builder.setMyshort( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Short.class ) ); - } - else if ( "myInt".equals( methodName ) ) { - builder.setMyint( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) ); - } - else if ( "myLong".equals( methodName ) ) { - builder.setMylong( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Integer.class ) ); - } - else if ( "myFloat".equals( methodName ) ) { - builder.setMyfloat( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Float.class ) ); - } - else if ( "myDouble".equals( methodName ) ) { - builder.setMydouble( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), Double.class ) ); - } - else if ( "myString".equals( methodName ) ) { - builder.setMystring( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), String.class ) ); - } - else if ( "myEnum".equals( methodName ) ) { - builder.setMyenum( GemValue.createEnum( values.get( methodName ), defaultValues.get( methodName ) ) ); + for ( Map.Entry defaultMethod : defaultValues.entrySet() ) { + String methodName = defaultMethod.getKey(); + AnnotationValue defaultValue = defaultMethod.getValue(); + AnnotationValue value = values.get( methodName ); + switch ( methodName ) { + case "myClassWithDefault": + builder.setMyclasswithdefault( GemValue.create( value, defaultValue, TypeMirror.class ) ); + break; + case "myBooleanWithDefault": + builder.setMybooleanwithdefault( GemValue.create( value, defaultValue, Boolean.class ) ); + break; + case "myCharWithDefault": + builder.setMycharwithdefault( GemValue.create( value, defaultValue, Character.class ) ); + break; + case "myByteWithDefault": + builder.setMybytewithdefault( GemValue.create( value, defaultValue, Byte.class ) ); + break; + case "mShortWithDefault": + builder.setMshortwithdefault( GemValue.create( value, defaultValue, Short.class ) ); + break; + case "myIntWithDefault": + builder.setMyintwithdefault( GemValue.create( value, defaultValue, Integer.class ) ); + break; + case "myLongWithDefault": + builder.setMylongwithdefault( GemValue.create( value, defaultValue, Integer.class ) ); + break; + case "myFloatWithDefault": + builder.setMyfloatwithdefault( GemValue.create( value, defaultValue, Float.class ) ); + break; + case "myDoubleWithDefault": + builder.setMydoublewithdefault( GemValue.create( value, defaultValue, Double.class ) ); + break; + case "myStringWithDefault": + builder.setMystringwithdefault( GemValue.create( value, defaultValue, String.class ) ); + break; + case "myEnumWithDefault": + builder.setMyenumwithdefault( GemValue.createEnum( value, defaultValue ) ); + break; + case "myClass": + builder.setMyclass( GemValue.create( value, defaultValue, TypeMirror.class ) ); + break; + case "myBoolean": + builder.setMyboolean( GemValue.create( value, defaultValue, Boolean.class ) ); + break; + case "myChar": + builder.setMychar( GemValue.create( value, defaultValue, Character.class ) ); + break; + case "myByte": + builder.setMybyte( GemValue.create( value, defaultValue, Byte.class ) ); + break; + case "myShort": + builder.setMyshort( GemValue.create( value, defaultValue, Short.class ) ); + break; + case "myInt": + builder.setMyint( GemValue.create( value, defaultValue, Integer.class ) ); + break; + case "myLong": + builder.setMylong( GemValue.create( value, defaultValue, Integer.class ) ); + break; + case "myFloat": + builder.setMyfloat( GemValue.create( value, defaultValue, Float.class ) ); + break; + case "myDouble": + builder.setMydouble( GemValue.create( value, defaultValue, Double.class ) ); + break; + case "myString": + builder.setMystring( GemValue.create( value, defaultValue, String.class ) ); + break; + case "myEnum": + builder.setMyenum( GemValue.createEnum( value, defaultValue ) ); + break; } } builder.setMirror( mirror ); diff --git a/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationsGem.java b/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationsGem.java index 83ab83e..f834ad2 100644 --- a/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationsGem.java +++ b/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeAnnotationsGem.java @@ -83,10 +83,12 @@ public static T build(AnnotationMirror mirror, Builder builder ) { mirror.getElementValues().entrySet().forEach( e -> values.put( e.getKey().getSimpleName().toString(), e.getValue() ) ); // iterate and populate builder - for ( String methodName : defaultValues.keySet() ) { - + for ( Map.Entry defaultMethod : defaultValues.entrySet() ) { + String methodName = defaultMethod.getKey(); + AnnotationValue defaultValue = defaultMethod.getValue(); + AnnotationValue value = values.get( methodName ); if ( "value".equals( methodName ) ) { - builder.setValue( GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), SomeAnnotationGem::instanceOn ) ); + builder.setValue( GemValue.createArray( value, defaultValue, SomeAnnotationGem::instanceOn ) ); } } builder.setMirror( mirror ); diff --git a/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeArrayAnnotationGem.java b/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeArrayAnnotationGem.java index dfb0a81..356e00c 100644 --- a/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeArrayAnnotationGem.java +++ b/processor/src/test/resources/fixtures/org/mapstruct/tools/gem/processor/SomeArrayAnnotationGem.java @@ -120,19 +120,23 @@ public static T build(AnnotationMirror mirror, Builder builder ) { mirror.getElementValues().entrySet().forEach( e -> values.put( e.getKey().getSimpleName().toString(), e.getValue() ) ); // iterate and populate builder - for ( String methodName : defaultValues.keySet() ) { - - if ( "myClassWithDefault".equals( methodName ) ) { - builder.setMyclasswithdefault( GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), TypeMirror.class ) ); - } - else if ( "myBooleanWithDefault".equals( methodName ) ) { - builder.setMybooleanwithdefault( GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), Boolean.class ) ); - } - else if ( "myEnumWithDefault".equals( methodName ) ) { - builder.setMyenumwithdefault( GemValue.createEnumArray( values.get( methodName ), defaultValues.get( methodName ) ) ); - } - else if ( "myAnnotation".equals( methodName ) ) { - builder.setMyannotation( GemValue.create( values.get( methodName ), defaultValues.get( methodName ), SomeAnnotationGem::instanceOn ) ); + for ( Map.Entry defaultMethod : defaultValues.entrySet() ) { + String methodName = defaultMethod.getKey(); + AnnotationValue defaultValue = defaultMethod.getValue(); + AnnotationValue value = values.get( methodName ); + switch ( methodName ) { + case "myClassWithDefault": + builder.setMyclasswithdefault( GemValue.createArray( value, defaultValue, TypeMirror.class ) ); + break; + case "myBooleanWithDefault": + builder.setMybooleanwithdefault( GemValue.createArray( value, defaultValue, Boolean.class ) ); + break; + case "myEnumWithDefault": + builder.setMyenumwithdefault( GemValue.createEnumArray( value, defaultValue ) ); + break; + case "myAnnotation": + builder.setMyannotation( GemValue.create( value, defaultValue, SomeAnnotationGem::instanceOn ) ); + break; } } builder.setMirror( mirror );