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;