You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2019/04/08 12:59:04 UTC
[groovy] 12/20: Handle types properly when using Java 9+
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 <su...@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;