mirror of
https://github.com/mapstruct/mapstruct.git
synced 2025-07-26 00:00:05 +08:00
#147 patch for JDK6 java.lang.AssertionError: isSubtype 15 problem, including some test updates
This commit is contained in:
parent
2b633211dd
commit
c10a5a6e31
@ -123,16 +123,16 @@ public class TypeFactory {
|
|||||||
Type implementationType = getImplementationType( mirror );
|
Type implementationType = getImplementationType( mirror );
|
||||||
|
|
||||||
boolean isIterableType = typeUtils.isSubtype(
|
boolean isIterableType = typeUtils.isSubtype(
|
||||||
mirror,
|
typeUtils.erasure( mirror ),
|
||||||
iterableType
|
typeUtils.erasure( iterableType )
|
||||||
);
|
);
|
||||||
boolean isCollectionType = typeUtils.isSubtype(
|
boolean isCollectionType = typeUtils.isSubtype(
|
||||||
mirror,
|
typeUtils.erasure( mirror ),
|
||||||
collectionType
|
typeUtils.erasure( collectionType )
|
||||||
);
|
);
|
||||||
boolean isMapType = typeUtils.isSubtype(
|
boolean isMapType = typeUtils.isSubtype(
|
||||||
mirror,
|
typeUtils.erasure( mirror ),
|
||||||
mapType
|
typeUtils.erasure( mapType )
|
||||||
);
|
);
|
||||||
|
|
||||||
boolean isEnumType;
|
boolean isEnumType;
|
||||||
|
@ -207,7 +207,8 @@ public class MethodMatcher {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// check if types are in bound
|
// check if types are in bound
|
||||||
if ( typeUtils.isSubtype( t.getLowerBound(), p ) && typeUtils.isSubtype( p, t.getUpperBound() ) ) {
|
if ( typeUtils.isSubtype( typeUtils.erasure( t.getLowerBound() ), typeUtils.erasure( p ) ) &&
|
||||||
|
typeUtils.isSubtype( typeUtils.erasure( p ), typeUtils.erasure( t.getUpperBound() ) ) ) {
|
||||||
genericTypesMap.put( t, p );
|
genericTypesMap.put( t, p );
|
||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
}
|
}
|
||||||
@ -227,7 +228,7 @@ public class MethodMatcher {
|
|||||||
case DECLARED:
|
case DECLARED:
|
||||||
// for example method: String method(? extends String)
|
// for example method: String method(? extends String)
|
||||||
// isSubType checks range [subtype, type], e.g. isSubtype [Object, String]==true
|
// isSubType checks range [subtype, type], e.g. isSubtype [Object, String]==true
|
||||||
return typeUtils.isSubtype( p, extendsBound );
|
return typeUtils.isSubtype( typeUtils.erasure( p ), extendsBound );
|
||||||
|
|
||||||
case TYPEVAR:
|
case TYPEVAR:
|
||||||
// for example method: <T extends String & Serializable> T method(? extends T)
|
// for example method: <T extends String & Serializable> T method(? extends T)
|
||||||
@ -249,7 +250,8 @@ public class MethodMatcher {
|
|||||||
// for example method: String method(? super String)
|
// for example method: String method(? super String)
|
||||||
// to check super type, we can simply reverse the argument, but that would initially yield
|
// to check super type, we can simply reverse the argument, but that would initially yield
|
||||||
// a result: <type, superType] (so type not included) so we need to check sameType also.
|
// a result: <type, superType] (so type not included) so we need to check sameType also.
|
||||||
return ( typeUtils.isSubtype( superBound, p ) || typeUtils.isSameType( p, superBound ) );
|
return ( typeUtils.isSubtype( typeUtils.erasure( superBound ), p ) ||
|
||||||
|
typeUtils.isSameType( p, superBound ) );
|
||||||
|
|
||||||
case TYPEVAR:
|
case TYPEVAR:
|
||||||
|
|
||||||
@ -267,11 +269,9 @@ public class MethodMatcher {
|
|||||||
// to check super type, we can simply reverse the argument, but that would initially yield
|
// to check super type, we can simply reverse the argument, but that would initially yield
|
||||||
// a result: <type, superType] (so type not included) so we need to check sameType also.
|
// a result: <type, superType] (so type not included) so we need to check sameType also.
|
||||||
TypeMirror superBoundAsDeclared = typeParameter.getBounds().get( 0 );
|
TypeMirror superBoundAsDeclared = typeParameter.getBounds().get( 0 );
|
||||||
return ( typeUtils.isSubtype( superBoundAsDeclared, p ) || typeUtils.isSameType(
|
return ( typeUtils.isSubtype( typeUtils.erasure( superBoundAsDeclared ),
|
||||||
p,
|
typeUtils.erasure( p ) ) ||
|
||||||
superBoundAsDeclared
|
typeUtils.isSameType( p, superBoundAsDeclared ) );
|
||||||
) );
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// does this situation occur?
|
// does this situation occur?
|
||||||
return Boolean.FALSE;
|
return Boolean.FALSE;
|
||||||
@ -310,7 +310,8 @@ public class MethodMatcher {
|
|||||||
List<? extends TypeMirror> bounds = tpe.getBounds();
|
List<? extends TypeMirror> bounds = tpe.getBounds();
|
||||||
if ( t != null && bounds != null ) {
|
if ( t != null && bounds != null ) {
|
||||||
for ( TypeMirror bound : bounds ) {
|
for ( TypeMirror bound : bounds ) {
|
||||||
if ( !( bound.getKind().equals( TypeKind.DECLARED ) && typeUtils.isSubtype( t, bound ) ) ) {
|
if ( !( bound.getKind().equals( TypeKind.DECLARED ) &&
|
||||||
|
typeUtils.isSubtype( typeUtils.erasure( t ), typeUtils.erasure( bound ) ) ) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,4 +158,18 @@ public class ConversionTest extends MapperTestBase {
|
|||||||
})
|
})
|
||||||
public void shouldFailOnSuperBounds2() {
|
public void shouldFailOnSuperBounds2() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@WithClasses({ ErroneousSource6.class, ErroneousTarget6.class, ErroneousSourceTargetMapper6.class })
|
||||||
|
@ExpectedCompilationOutcome(value = CompilationResult.FAILED,
|
||||||
|
diagnostics = {
|
||||||
|
@Diagnostic(type = ErroneousSourceTargetMapper6.class,
|
||||||
|
kind = javax.tools.Diagnostic.Kind.ERROR,
|
||||||
|
line = 29,
|
||||||
|
messageRegExp = "Can't map property \"org.mapstruct.ap.test.conversion.generics.WildCardSuperWrapper"
|
||||||
|
+ "<java.lang.String> foo\" to"
|
||||||
|
+ " \"org.mapstruct.ap.test.conversion.generics.WildCardSuperWrapper<java.lang.Integer> foo\"")
|
||||||
|
})
|
||||||
|
public void shouldFailOnNonMatchingWildCards() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2014 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.conversion.generics;
|
||||||
|
|
||||||
|
public class ErroneousSource6 {
|
||||||
|
|
||||||
|
private WildCardSuperWrapper<String> foo;
|
||||||
|
|
||||||
|
public WildCardSuperWrapper<String> getFoo() {
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFoo(WildCardSuperWrapper<String> foo) {
|
||||||
|
this.foo = foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2014 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.conversion.generics;
|
||||||
|
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
@Mapper( uses = GenericTypeMapper.class )
|
||||||
|
public interface ErroneousSourceTargetMapper6 {
|
||||||
|
|
||||||
|
ErroneousSourceTargetMapper6 INSTANCE = Mappers.getMapper( ErroneousSourceTargetMapper6.class );
|
||||||
|
|
||||||
|
ErroneousTarget6 sourceToTarget(ErroneousSource6 source);
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2014 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.conversion.generics;
|
||||||
|
|
||||||
|
public class ErroneousTarget6 {
|
||||||
|
|
||||||
|
private WildCardSuperWrapper<Integer> foo;
|
||||||
|
|
||||||
|
public WildCardSuperWrapper<Integer> getFoo() {
|
||||||
|
return foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFoo(WildCardSuperWrapper<Integer> foo) {
|
||||||
|
this.foo = foo;
|
||||||
|
}
|
||||||
|
}
|
@ -45,11 +45,11 @@ public class FactoryTest extends MapperTestBase {
|
|||||||
@Diagnostic(type = BarFactory.class,
|
@Diagnostic(type = BarFactory.class,
|
||||||
kind = javax.tools.Diagnostic.Kind.ERROR,
|
kind = javax.tools.Diagnostic.Kind.ERROR,
|
||||||
line = 29,
|
line = 29,
|
||||||
messageRegExp = "^Ambiguous factory methods: \"org\\.mapstruct\\.ap\\.test\\.erroneous\\."
|
messageRegExp = "Ambiguous factory methods: \"org\\.mapstruct\\.ap\\.test\\.erroneous\\."
|
||||||
+ "ambiguousfactorymethod\\.Bar createBar\\(\\)\" conflicts with "
|
+ "ambiguousfactorymethod\\.Bar createBar\\(\\)\" conflicts with "
|
||||||
+ "\"org\\.mapstruct\\.ap\\.test\\.erroneous\\.ambiguousfactorymethod\\.Bar "
|
+ "\"org\\.mapstruct\\.ap\\.test\\.erroneous\\.ambiguousfactorymethod\\.Bar "
|
||||||
+ "org\\.mapstruct\\.ap\\.test\\.erroneous\\.ambiguousfactorymethod"
|
+ "org\\.mapstruct\\.ap\\.test\\.erroneous\\.ambiguousfactorymethod"
|
||||||
+ "\\.a\\.BarFactory\\.createBar\\(\\)\"\\.$")
|
+ "\\.a\\.BarFactory\\.createBar\\(\\)\"\\")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
public void shouldUseTwoFactoryMethods() {
|
public void shouldUseTwoFactoryMethods() {
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.mapstruct.ap.test.severalsources;
|
package org.mapstruct.ap.test.severalsources;
|
||||||
|
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
|
|
||||||
import org.mapstruct.ap.testutil.IssueKey;
|
import org.mapstruct.ap.testutil.IssueKey;
|
||||||
@ -101,12 +102,22 @@ public class SeveralSourceParametersTest extends MapperTestBase {
|
|||||||
@ExpectedCompilationOutcome(
|
@ExpectedCompilationOutcome(
|
||||||
value = CompilationResult.FAILED,
|
value = CompilationResult.FAILED,
|
||||||
diagnostics = {
|
diagnostics = {
|
||||||
|
@Diagnostic(type = ErroneousSourceTargetMapper.class,
|
||||||
|
kind = Kind.ERROR,
|
||||||
|
line = 29,
|
||||||
|
messageRegExp = "Several possible source properties for target property \"description\".",
|
||||||
|
javaVersions = { SourceVersion.RELEASE_6 } ),
|
||||||
|
@Diagnostic(type = ErroneousSourceTargetMapper.class,
|
||||||
|
kind = Kind.ERROR,
|
||||||
|
line = 29,
|
||||||
|
messageRegExp = "Several possible source properties for target property \"zipCode\".",
|
||||||
|
javaVersions = { SourceVersion.RELEASE_6 } ),
|
||||||
@Diagnostic(type = ErroneousSourceTargetMapper.class,
|
@Diagnostic(type = ErroneousSourceTargetMapper.class,
|
||||||
kind = Kind.ERROR,
|
kind = Kind.ERROR,
|
||||||
line = 29,
|
line = 29,
|
||||||
messageRegExp = "Several possible source properties for target property \"street\".")
|
messageRegExp = "Several possible source properties for target property \"street\".")
|
||||||
}
|
})
|
||||||
)
|
|
||||||
public void shouldFailToGenerateMappingsForAmbigiousSourceProperty() {
|
public void shouldFailToGenerateMappingsForAmbigiousSourceProperty() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -344,4 +344,8 @@ public abstract class MapperTestBase {
|
|||||||
return o1.getMessage().compareTo( o2.getMessage() );
|
return o1.getMessage().compareTo( o2.getMessage() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isJdk6() {
|
||||||
|
return ( Integer.parseInt( System.getProperty( "java.version" ).split( "\\." )[1]) == 6 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.mapstruct.ap.testutil.compilation.annotation;
|
package org.mapstruct.ap.testutil.compilation.annotation;
|
||||||
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An expected diagnostic of a compilation.
|
* An expected diagnostic of a compilation.
|
||||||
@ -57,4 +58,11 @@ public @interface Diagnostic {
|
|||||||
* diagnostic.
|
* diagnostic.
|
||||||
*/
|
*/
|
||||||
String messageRegExp() default ".*";
|
String messageRegExp() default ".*";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The java version for which this this diagnostic is valid.
|
||||||
|
*
|
||||||
|
* @return versions for which this Diagnostic should be evaluated. Default it evaluates for all
|
||||||
|
*/
|
||||||
|
SourceVersion[] javaVersions() default { };
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ package org.mapstruct.ap.testutil.compilation.model;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.tools.Diagnostic;
|
import javax.tools.Diagnostic;
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import javax.tools.JavaFileObject;
|
import javax.tools.JavaFileObject;
|
||||||
@ -56,13 +57,27 @@ public class CompilationOutcomeDescriptor {
|
|||||||
List<DiagnosticDescriptor> diagnosticDescriptors = new ArrayList<DiagnosticDescriptor>();
|
List<DiagnosticDescriptor> diagnosticDescriptors = new ArrayList<DiagnosticDescriptor>();
|
||||||
for ( org.mapstruct.ap.testutil.compilation.annotation.Diagnostic diagnostic :
|
for ( org.mapstruct.ap.testutil.compilation.annotation.Diagnostic diagnostic :
|
||||||
expectedCompilationResult.diagnostics() ) {
|
expectedCompilationResult.diagnostics() ) {
|
||||||
|
if ( requiresEvaluation( diagnostic.javaVersions() ) ) {
|
||||||
diagnosticDescriptors.add( DiagnosticDescriptor.forDiagnostic( diagnostic ) );
|
diagnosticDescriptors.add( DiagnosticDescriptor.forDiagnostic( diagnostic ) );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return new CompilationOutcomeDescriptor( expectedCompilationResult.value(), diagnosticDescriptors );
|
return new CompilationOutcomeDescriptor( expectedCompilationResult.value(), diagnosticDescriptors );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean requiresEvaluation(SourceVersion[] sourceVersions) {
|
||||||
|
if ( sourceVersions.length == 0 ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (SourceVersion sourceVersion : sourceVersions) {
|
||||||
|
if (SourceVersion.latestSupported().equals( sourceVersion ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static CompilationOutcomeDescriptor forResult(String sourceDir, boolean compilationSuccessful,
|
public static CompilationOutcomeDescriptor forResult(String sourceDir, boolean compilationSuccessful,
|
||||||
List<Diagnostic<? extends JavaFileObject>> diagnostics) {
|
List<Diagnostic<? extends JavaFileObject>> diagnostics) {
|
||||||
CompilationResult compilationResult =
|
CompilationResult compilationResult =
|
||||||
|
Loading…
x
Reference in New Issue
Block a user