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;

Reply via email to