From d4975cf6dd959120fe91614907800de058993d50 Mon Sep 17 00:00:00 2001 From: Rawi01 Date: Tue, 29 Mar 2022 23:14:56 +0200 Subject: [PATCH] [fixes #3153] Improve the handling of ExtensionMethod arguments --- .../eclipse/agent/PatchExtensionMethod.java | 24 +++++++++++++++---- .../ExtensionMethodFunctional.java | 1 + .../after-ecj/ExtensionMethodFunctional.java | 1 + .../before/ExtensionMethodFunctional.java | 2 ++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java b/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java index 2e540b5e39..7743f9c6e6 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2021 The Project Lombok Authors. + * Copyright (C) 2012-2022 The Project Lombok Authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -47,6 +47,7 @@ import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; +import org.eclipse.jdt.internal.compiler.ast.ConditionalExpression; import org.eclipse.jdt.internal.compiler.ast.Expression; import org.eclipse.jdt.internal.compiler.ast.MessageSend; import org.eclipse.jdt.internal.compiler.ast.NameReference; @@ -298,7 +299,7 @@ public static TypeBinding resolveType(TypeBinding resolvedType, MessageSend meth List argumentTypes = new ArrayList(); for (Expression argument : arguments) { TypeBinding argumentType = argument.resolvedType; - if (argumentType == null && Reflection.isFunctionalExpression(argument)) { + if (argumentType == null && requiresPolyBinding(argument)) { argumentType = Reflection.getPolyTypeBinding(argument); } if (argumentType == null) { @@ -338,8 +339,8 @@ public static TypeBinding resolveType(TypeBinding resolvedType, MessageSend meth } else { param = parameters[i]; } - // Resolve types for lambdas - if (Reflection.isFunctionalExpression(arg)) { + // Resolve types for polys + if (requiresPolyBinding(arg)) { arg.setExpectedType(param); arg.resolveType(scope); } @@ -377,6 +378,10 @@ public static TypeBinding resolveType(TypeBinding resolvedType, MessageSend meth MessageSend_postponedErrors.clear(methodCall); return resolvedType; } + + private static boolean requiresPolyBinding(Expression argument) { + return Reflection.isFunctionalExpression(argument) || argument instanceof ConditionalExpression && Reflection.isPolyExpression(argument); + } private static NameReference createNameRef(TypeBinding typeBinding, ASTNode source) { long p = ((long) source.sourceStart << 32) | source.sourceEnd; @@ -407,6 +412,7 @@ private static final class Reflection { public static final Field argumentTypes = Permit.permissiveGetField(MessageSend.class, "argumentTypes"); public static final Field argumentsHaveErrors = Permit.permissiveGetField(MessageSend.class, "argumentsHaveErrors"); public static final Field inferenceContexts = Permit.permissiveGetField(MessageSend.class, "inferenceContexts"); + private static final Method isPolyExpression = Permit.permissiveGetMethod(Expression.class, "isPolyExpression"); private static final Class functionalExpression; private static final Constructor polyTypeBindingConstructor; @@ -432,6 +438,16 @@ public static boolean isFunctionalExpression(Expression expression) { return functionalExpression.isInstance(expression); } + public static boolean isPolyExpression(Expression expression) { + if (isPolyExpression == null) return false; + try { + return (Boolean) isPolyExpression.invoke(expression); + } catch (Exception e) { + // Ignore + } + return false; + } + public static TypeBinding getPolyTypeBinding(Expression expression) { if (polyTypeBindingConstructor == null) return null; try { diff --git a/test/transform/resource/after-delombok/ExtensionMethodFunctional.java b/test/transform/resource/after-delombok/ExtensionMethodFunctional.java index 2b82a9575e..40d0d4dfa2 100644 --- a/test/transform/resource/after-delombok/ExtensionMethodFunctional.java +++ b/test/transform/resource/after-delombok/ExtensionMethodFunctional.java @@ -11,6 +11,7 @@ public void test() { test = ExtensionMethodFunctional.Extensions.map(test, s -> ExtensionMethodFunctional.Extensions.reverse(s)); ExtensionMethodFunctional.Extensions.consume(test, s -> System.out.println("1: " + s), s -> System.out.println("2: " + s)); ExtensionMethodFunctional.Extensions.consume(test, System.out::println, System.out::println); + ExtensionMethodFunctional.Extensions.consume(test, test.length() > 0 ? System.out::println : null); ExtensionMethodFunctional.Extensions.toList1(Stream.of("a", "b", "c").map(String::toUpperCase)); List i2 = ExtensionMethodFunctional.Extensions.toList2(Stream.of("a", "b", "c").map(String::toUpperCase)); } diff --git a/test/transform/resource/after-ecj/ExtensionMethodFunctional.java b/test/transform/resource/after-ecj/ExtensionMethodFunctional.java index 0971a9bea7..3cd29e44c5 100644 --- a/test/transform/resource/after-ecj/ExtensionMethodFunctional.java +++ b/test/transform/resource/after-ecj/ExtensionMethodFunctional.java @@ -36,6 +36,7 @@ public void test() { test = ExtensionMethodFunctional.Extensions.map(test, ( s) -> ExtensionMethodFunctional.Extensions.reverse(s)); ExtensionMethodFunctional.Extensions.consume(test, ( s) -> System.out.println(("1: " + s)), ( s) -> System.out.println(("2: " + s))); ExtensionMethodFunctional.Extensions.consume(test, System.out::println, System.out::println); + ExtensionMethodFunctional.Extensions.consume(test, ((test.length() > 0) ? System.out::println : null)); ExtensionMethodFunctional.Extensions.toList1(Stream.of("a", "b", "c").map(String::toUpperCase)); List i2 = ExtensionMethodFunctional.Extensions.toList2(Stream.of("a", "b", "c").map(String::toUpperCase)); } diff --git a/test/transform/resource/before/ExtensionMethodFunctional.java b/test/transform/resource/before/ExtensionMethodFunctional.java index 8586dd7a00..20fe2a366d 100644 --- a/test/transform/resource/before/ExtensionMethodFunctional.java +++ b/test/transform/resource/before/ExtensionMethodFunctional.java @@ -16,6 +16,8 @@ public void test() { test.consume(s -> System.out.println("1: " + s), s -> System.out.println("2: " + s)); test.consume(System.out::println, System.out::println); + test.consume(test.length() > 0 ? System.out::println : null); + Stream.of("a", "b", "c").map(String::toUpperCase).toList1(); List i2 = Stream.of("a", "b", "c").map(String::toUpperCase).toList2(); }