From 28ebf763cd796a8fe27f646ef5e762c0f0d917a4 Mon Sep 17 00:00:00 2001 From: sjaakd Date: Tue, 19 May 2015 23:43:46 +0200 Subject: [PATCH] #551, fix for isAssignable problem in oracle_java_6 --- .../creation/MappingResolverImpl.java | 3 ++- .../ap/util/SpecificCompilerWorkarounds.java | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/processor/src/main/java/org/mapstruct/ap/processor/creation/MappingResolverImpl.java b/processor/src/main/java/org/mapstruct/ap/processor/creation/MappingResolverImpl.java index 01ac2bd5f..d22e22c62 100755 --- a/processor/src/main/java/org/mapstruct/ap/processor/creation/MappingResolverImpl.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/creation/MappingResolverImpl.java @@ -47,6 +47,7 @@ import org.mapstruct.ap.model.source.selector.MethodSelectors; import org.mapstruct.ap.model.source.selector.SelectionCriteria; import org.mapstruct.ap.util.FormattingMessager; import org.mapstruct.ap.util.Message; +import org.mapstruct.ap.util.SpecificCompilerWorkarounds; import org.mapstruct.ap.util.Strings; /** @@ -551,7 +552,7 @@ public class MappingResolverImpl implements MappingResolver { ? typeFactory.getType( Object.class ).getTypeMirror() : targetType.getTypeParameters().get( 0 ).getTypeMirror(); - return typeUtils.isAssignable( sourceElementType, targetElementType ); + return SpecificCompilerWorkarounds.isAssignable( typeUtils, sourceElementType, targetElementType ); } /** diff --git a/processor/src/main/java/org/mapstruct/ap/util/SpecificCompilerWorkarounds.java b/processor/src/main/java/org/mapstruct/ap/util/SpecificCompilerWorkarounds.java index e8095bf91..49940039f 100644 --- a/processor/src/main/java/org/mapstruct/ap/util/SpecificCompilerWorkarounds.java +++ b/processor/src/main/java/org/mapstruct/ap/util/SpecificCompilerWorkarounds.java @@ -34,6 +34,26 @@ public class SpecificCompilerWorkarounds { private SpecificCompilerWorkarounds() { } + /** + * Tests whether one type is assignable to another. + * + *

+ * Work-around for a bug most likely related to problem solved with {@link #isSubType} + * + * @param types the type utils + * @param t1 the first type + * @param t2 the second type + * @return {@code true} if and only if the first type is assignable to the second + * @throws IllegalArgumentException if given an executable or package type + */ + public static boolean isAssignable(Types types, TypeMirror t1, TypeMirror t2) { + if ( t1.getKind() == TypeKind.VOID ) { + return false; + } + + return types.isAssignable( erasure( types, t1 ), erasure( types, t2 ) ); + } + /** * Tests whether one type is a subtype of another. Any type is considered to be a subtype of itself. Also see JLS section 4.10, Subtyping.