This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/groovy.git
commit c18fbf174a6a36d514618dcacbc26a1175a7778b Author: Daniel Sun <sun...@apache.org> AuthorDate: Sat Mar 16 21:50:34 2019 +0800 Handle types properly when using Java 9+ --- .../asm/sc/AbstractFunctionInterfaceWriter.java | 20 ++++++++++++++++++++ .../classgen/asm/sc/StaticTypesLambdaWriter.java | 10 ++++------ .../StaticTypesMethodReferenceExpressionWriter.java | 9 ++++----- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionInterfaceWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionInterfaceWriter.java index 4cfeef9..dea1d02 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionInterfaceWriter.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/AbstractFunctionInterfaceWriter.java @@ -18,6 +18,7 @@ */ package org.codehaus.groovy.classgen.asm.sc; +import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.MethodNode; import org.codehaus.groovy.ast.Parameter; @@ -30,6 +31,7 @@ import org.objectweb.asm.Type; import java.util.Arrays; import java.util.List; +import static org.codehaus.groovy.ast.ClassHelper.getWrapper; import static org.codehaus.groovy.transform.stc.StaticTypesMarker.INFERRED_FUNCTIONAL_INTERFACE_TYPE; import static org.codehaus.groovy.transform.stc.StaticTypesMarker.PARAMETER_TYPE; @@ -83,6 +85,24 @@ public interface AbstractFunctionInterfaceWriter { }; } + default ClassNode convertParameterType(ClassNode parameterType, ClassNode inferredType) { + ClassNode type; + boolean isParameterTypePrimitive = ClassHelper.isPrimitiveType(parameterType); + boolean isInferredTypePrimitive = ClassHelper.isPrimitiveType(inferredType); + if (!isParameterTypePrimitive && isInferredTypePrimitive) { + // The non-primitive type and primitive type are not allowed to mix since Java 9+ + // java.lang.invoke.LambdaConversionException: Type mismatch for instantiated parameter 0: int is not a subtype of class java.lang.Object + type = getWrapper(inferredType); + } else if (isParameterTypePrimitive && !isInferredTypePrimitive) { + // The non-primitive type and primitive type are not allowed to mix since Java 9+ + // java.lang.invoke.LambdaConversionException: Type mismatch for instantiated parameter 0: class java.lang.Integer is not a subtype of int + type = ClassHelper.getUnwrapper(inferredType); + } else { + type = inferredType; + } + return type; + } + default Parameter prependParameter(List<Parameter> methodParameterList, String parameterName, ClassNode parameterType) { Parameter parameter = new Parameter(parameterType, parameterName); diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java index 8978061..1f0524b 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesLambdaWriter.java @@ -52,7 +52,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static org.codehaus.groovy.ast.ClassHelper.getWrapper; import static org.objectweb.asm.Opcodes.ACC_FINAL; import static org.objectweb.asm.Opcodes.ACC_PUBLIC; import static org.objectweb.asm.Opcodes.ACC_STATIC; @@ -272,18 +271,17 @@ public class StaticTypesLambdaWriter extends LambdaWriter implements AbstractFun } for (Parameter parameter : parameters) { + ClassNode parameterType = parameter.getType(); ClassNode inferredType = parameter.getNodeMetaData(StaticTypesMarker.INFERRED_TYPE); if (null == inferredType) { continue; } - // Java 11 does not allow primitive type, we should use the wrapper type - // java.lang.invoke.LambdaConversionException: Type mismatch for instantiated parameter 0: int is not a subtype of class java.lang.Object - ClassNode wrappedType = getWrapper(inferredType); + ClassNode type = convertParameterType(parameterType, inferredType); - parameter.setType(wrappedType); - parameter.setOriginType(wrappedType); + parameter.setType(type); + parameter.setOriginType(type); } return parameters; diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java index b3fb945..9ea102c 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesMethodReferenceExpressionWriter.java @@ -206,18 +206,17 @@ public class StaticTypesMethodReferenceExpressionWriter extends MethodReferenceE for (int i = 0; i < parameters.length; i++) { Parameter parameter = parameters[i]; + ClassNode parameterType = parameter.getType(); ClassNode inferredType = inferredParameterTypes[i]; if (null == inferredType) { continue; } - // Java 11 does not allow primitive type, we should use the wrapper type - // java.lang.invoke.LambdaConversionException: Type mismatch for instantiated parameter 0: int is not a subtype of class java.lang.Object - ClassNode wrappedType = getWrapper(inferredType); + ClassNode type = convertParameterType(parameterType, inferredType); - parameter.setType(wrappedType); - parameter.setOriginType(wrappedType); + parameter.setType(type); + parameter.setOriginType(type); } return parameters;