#1332 Fix exceptions declaration missing in generated nested private methods

This commit is contained in:
Richard Lea 2017-11-24 07:41:42 +09:00 committed by Filip Hrisafov
parent e4839fce5d
commit 49e39e0ed5
11 changed files with 306 additions and 6 deletions

View File

@ -24,7 +24,7 @@ import java.util.Set;
import org.mapstruct.ap.internal.model.common.Parameter; import org.mapstruct.ap.internal.model.common.Parameter;
import org.mapstruct.ap.internal.model.common.Type; import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.model.source.Method; import org.mapstruct.ap.internal.model.source.ForgedMethod;
import org.mapstruct.ap.internal.model.source.PropertyEntry; import org.mapstruct.ap.internal.model.source.PropertyEntry;
import org.mapstruct.ap.internal.util.Strings; import org.mapstruct.ap.internal.util.Strings;
import org.mapstruct.ap.internal.util.ValueProvider; import org.mapstruct.ap.internal.util.ValueProvider;
@ -44,10 +44,11 @@ public class NestedPropertyMappingMethod extends MappingMethod {
public static class Builder { public static class Builder {
private Method method; private MappingBuilderContext ctx;
private ForgedMethod method;
private List<PropertyEntry> propertyEntries; private List<PropertyEntry> propertyEntries;
public Builder method( Method sourceMethod ) { public Builder method( ForgedMethod sourceMethod ) {
this.method = sourceMethod; this.method = sourceMethod;
return this; return this;
} }
@ -57,22 +58,31 @@ public class NestedPropertyMappingMethod extends MappingMethod {
return this; return this;
} }
public Builder mappingContext(MappingBuilderContext mappingContext) {
this.ctx = mappingContext;
return this;
}
public NestedPropertyMappingMethod build() { public NestedPropertyMappingMethod build() {
List<String> existingVariableNames = new ArrayList<String>(); List<String> existingVariableNames = new ArrayList<String>();
for ( Parameter parameter : method.getSourceParameters() ) { for ( Parameter parameter : method.getSourceParameters() ) {
existingVariableNames.add( parameter.getName() ); existingVariableNames.add( parameter.getName() );
} }
final List<Type> thrownTypes = new ArrayList<Type>();
List<SafePropertyEntry> safePropertyEntries = new ArrayList<SafePropertyEntry>(); List<SafePropertyEntry> safePropertyEntries = new ArrayList<SafePropertyEntry>();
for ( PropertyEntry propertyEntry : propertyEntries ) { for ( PropertyEntry propertyEntry : propertyEntries ) {
String safeName = Strings.getSaveVariableName( propertyEntry.getName(), existingVariableNames ); String safeName = Strings.getSaveVariableName( propertyEntry.getName(), existingVariableNames );
safePropertyEntries.add( new SafePropertyEntry( propertyEntry, safeName ) ); safePropertyEntries.add( new SafePropertyEntry( propertyEntry, safeName ) );
existingVariableNames.add( safeName ); existingVariableNames.add( safeName );
thrownTypes.addAll( ctx.getTypeFactory().getThrownTypes(
propertyEntry.getReadAccessor() ) );
} }
method.addThrownTypes( thrownTypes );
return new NestedPropertyMappingMethod( method, safePropertyEntries ); return new NestedPropertyMappingMethod( method, safePropertyEntries );
} }
} }
private NestedPropertyMappingMethod( Method method, List<SafePropertyEntry> sourcePropertyEntries ) { private NestedPropertyMappingMethod( ForgedMethod method, List<SafePropertyEntry> sourcePropertyEntries ) {
super( method ); super( method );
this.safePropertyEntries = sourcePropertyEntries; this.safePropertyEntries = sourcePropertyEntries;
} }

View File

@ -504,6 +504,7 @@ public class PropertyMapping extends ModelElement {
NestedPropertyMappingMethod nestedPropertyMapping = builder NestedPropertyMappingMethod nestedPropertyMapping = builder
.method( methodRef ) .method( methodRef )
.propertyEntries( sourceReference.getPropertyEntries() ) .propertyEntries( sourceReference.getPropertyEntries() )
.mappingContext( ctx )
.build(); .build();
// add if not yet existing // add if not yet existing

View File

@ -382,7 +382,24 @@ public class TypeFactory {
public List<Type> getThrownTypes(ExecutableType method) { public List<Type> getThrownTypes(ExecutableType method) {
List<Type> thrownTypes = new ArrayList<Type>(); List<Type> thrownTypes = new ArrayList<Type>();
for ( TypeMirror exceptionType : method.getThrownTypes() ) { for ( TypeMirror exceptionType : method.getThrownTypes() ) {
thrownTypes.add( getType( exceptionType ) ); Type t = getType( exceptionType );
if (!thrownTypes.contains( t )) {
thrownTypes.add( t );
}
}
return thrownTypes;
}
public List<Type> getThrownTypes(Accessor accessor) {
if (accessor.getExecutable() == null) {
return new ArrayList<Type>();
}
List<Type> thrownTypes = new ArrayList<Type>();
for (TypeMirror thrownType : accessor.getExecutable().getThrownTypes()) {
Type t = getType( thrownType );
if (!thrownTypes.contains( t )) {
thrownTypes.add( t );
}
} }
return thrownTypes; return thrownTypes;
} }

View File

@ -19,7 +19,7 @@
limitations under the License. limitations under the License.
--> -->
<#lt>private <@includeModel object=returnType/> ${name}(<#list parameters as param><@includeModel object=param/><#if param_has_next>, </#if></#list>) { <#lt>private <@includeModel object=returnType/> ${name}(<#list parameters as param><@includeModel object=param/><#if param_has_next>, </#if></#list>)<@throws/> {
if ( ${sourceParameter.name} == null ) { if ( ${sourceParameter.name} == null ) {
return ${returnType.null}; return ${returnType.null};
} }
@ -43,3 +43,11 @@
</#list> </#list>
} }
<#macro localVarName index><#if index == 0>${sourceParameter.name}<#else>${propertyEntries[index-1].name}</#if></#macro> <#macro localVarName index><#if index == 0>${sourceParameter.name}<#else>${propertyEntries[index-1].name}</#if></#macro>
<#macro throws>
<#if (thrownTypes?size > 0)><#lt> throws </#if><@compress single_line=true>
<#list thrownTypes as exceptionType>
<@includeModel object=exceptionType/>
<#if exceptionType_has_next>, </#if><#t>
</#list>
</@compress>
</#macro>

View File

@ -0,0 +1,37 @@
/**
* Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.nestedsource.exceptions;
/**
*
* @author Richard Lea <chigix@zoho.com>
*/
public class Bucket {
String userId;
public Bucket(String userId) {
this.userId = userId;
}
public User getUser() throws NoSuchUser {
throw new NoSuchUser();
}
}

View File

@ -0,0 +1,47 @@
/**
* Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.nestedsource.exceptions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mapstruct.ap.testutil.IssueKey;
import org.mapstruct.ap.testutil.WithClasses;
import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner;
/**
*
* @author Richard Lea <chigix@zoho.com>
*/
@WithClasses({
Bucket.class,
User.class,
Resource.class,
ResourceDto.class,
NoSuchUser.class,
ResourceMapper.class
})
@IssueKey("1332")
@RunWith(AnnotationProcessorTestRunner.class)
public class NestedExceptionTest {
@Test
public void shouldGenerateCodeThatCompiles() {
}
}

View File

@ -0,0 +1,30 @@
/**
* Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.nestedsource.exceptions;
/**
*
* @author Richard Lea <chigix@zoho.com>
*/
public class NoSuchUser extends Exception {
public NoSuchUser() {
}
}

View File

@ -0,0 +1,32 @@
/**
* Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.nestedsource.exceptions;
/**
*
* @author Richard Lea <chigix@zoho.com>
*/
public class Resource {
private final Bucket bucket = new Bucket("2345");
public Bucket getBucket() {
return bucket;
}
}

View File

@ -0,0 +1,37 @@
/**
* Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.nestedsource.exceptions;
/**
*
* @author Richard Lea <chigix@zoho.com>
*/
public class ResourceDto {
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}

View File

@ -0,0 +1,37 @@
/**
* Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.nestedsource.exceptions;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
/**
*
* @author Richard Lea <chigix@zoho.com>
*/
@Mapper()
public interface ResourceMapper {
@Mappings({
@Mapping(source = "bucket.user.uuid", target = "userId")
})
ResourceDto map(Resource r) throws NoSuchUser;
}

View File

@ -0,0 +1,44 @@
/**
* Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.nestedsource.exceptions;
/**
*
* @author Richard Lea <chigix@zoho.com>
*/
public class User {
private final String uuid;
private final String name;
public User(String uuid, String name) {
this.uuid = uuid;
this.name = name;
}
public String getName() {
return name;
}
public String getUuid() {
return uuid;
}
}