From 75b7a88a45f08dda24bb8dfe466acee0b10f3b40 Mon Sep 17 00:00:00 2001 From: Rawi01 Date: Thu, 20 Aug 2020 09:53:18 +0200 Subject: [fixes #2261] Detect static method access properly --- .../javac/handlers/HandleExtensionMethod.java | 30 +++++++++++++++----- .../after-delombok/ExtensionMethodNames.java | 27 ++++++++++++++++++ .../resource/after-ecj/ExtensionMethodNames.java | 32 +++++++++++++++++++++ .../resource/before/ExtensionMethodNames.java | 33 ++++++++++++++++++++++ 4 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 test/transform/resource/after-delombok/ExtensionMethodNames.java create mode 100644 test/transform/resource/after-ecj/ExtensionMethodNames.java create mode 100644 test/transform/resource/before/ExtensionMethodNames.java diff --git a/src/core/lombok/javac/handlers/HandleExtensionMethod.java b/src/core/lombok/javac/handlers/HandleExtensionMethod.java index 345c5f8e..805a96f8 100644 --- a/src/core/lombok/javac/handlers/HandleExtensionMethod.java +++ b/src/core/lombok/javac/handlers/HandleExtensionMethod.java @@ -28,6 +28,7 @@ import static lombok.javac.handlers.JavacResolver.*; import java.util.ArrayList; import java.util.List; +import java.util.Map; import javax.lang.model.element.ElementKind; @@ -37,12 +38,14 @@ import lombok.core.HandlerPriority; import lombok.experimental.ExtensionMethod; import lombok.javac.JavacAnnotationHandler; import lombok.javac.JavacNode; +import lombok.javac.JavacResolution; import org.mangosdk.spi.ProviderFor; import com.sun.source.tree.MethodInvocationTree; import com.sun.source.util.TreeScanner; import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; import com.sun.tools.javac.code.Symbol.TypeSymbol; import com.sun.tools.javac.code.Type; @@ -51,6 +54,7 @@ import com.sun.tools.javac.code.Type.ErrorType; import com.sun.tools.javac.code.Type.ForAll; import com.sun.tools.javac.code.Type.MethodType; import com.sun.tools.javac.code.Types; +import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCAnnotation; import com.sun.tools.javac.tree.JCTree.JCClassDecl; import com.sun.tools.javac.tree.JCTree.JCExpression; @@ -166,13 +170,25 @@ public class HandleExtensionMethod extends JavacAnnotationHandler resolution = new JavacResolution(methodCallNode.getContext()).resolveMethodMember(methodCallNode); + + JCTree resolvedMethodCall = resolution.get(methodCall); + if (resolvedMethodCall == null || resolvedMethodCall.type == null) return; + if (!suppressBaseMethods && !(resolvedMethodCall.type instanceof ErrorType)) return; + + JCTree resolvedReceiver = resolution.get(receiver); + if (resolvedReceiver == null || resolvedReceiver.type == null) return; + Type receiverType = resolvedReceiver.type; + + // Skip static method access + Symbol sym = null; + if (resolvedReceiver instanceof JCIdent) { + sym = ((JCIdent) resolvedReceiver).sym; + } else if (resolvedReceiver instanceof JCFieldAccess) { + sym = ((JCFieldAccess) resolvedReceiver).sym; + } + if (sym instanceof ClassSymbol) return; Types types = Types.instance(annotationNode.getContext()); for (Extension extension : extensions) { diff --git a/test/transform/resource/after-delombok/ExtensionMethodNames.java b/test/transform/resource/after-delombok/ExtensionMethodNames.java new file mode 100644 index 00000000..45f76ee4 --- /dev/null +++ b/test/transform/resource/after-delombok/ExtensionMethodNames.java @@ -0,0 +1,27 @@ +package a; + +class ExtensionMethodNames { + + public void instanceCalls() { + a.Extensions.ext((new Test())); + Test t = new Test(); + a.Extensions.ext(t); + Test Test = new Test(); + a.Extensions.ext(Test); + } + + public void staticCalls() { + Test.ext(); + a.Test.ext(); + } +} + +class Extensions { + public static void ext(Test t) { + } +} + +class Test { + public static void ext() { + } +} \ No newline at end of file diff --git a/test/transform/resource/after-ecj/ExtensionMethodNames.java b/test/transform/resource/after-ecj/ExtensionMethodNames.java new file mode 100644 index 00000000..015e8ac2 --- /dev/null +++ b/test/transform/resource/after-ecj/ExtensionMethodNames.java @@ -0,0 +1,32 @@ +package a; +import lombok.experimental.ExtensionMethod; +@ExtensionMethod(Extensions.class) class ExtensionMethodNames { + ExtensionMethodNames() { + super(); + } + public void instanceCalls() { + a.Extensions.ext(new Test()); + Test t = new Test(); + a.Extensions.ext(t); + Test Test = new Test(); + a.Extensions.ext(Test); + } + public void staticCalls() { + Test.ext(); + a.Test.ext(); + } +} +class Extensions { + Extensions() { + super(); + } + public static void ext(Test t) { + } +} +class Test { + Test() { + super(); + } + public static void ext() { + } +} \ No newline at end of file diff --git a/test/transform/resource/before/ExtensionMethodNames.java b/test/transform/resource/before/ExtensionMethodNames.java new file mode 100644 index 00000000..4ca63a63 --- /dev/null +++ b/test/transform/resource/before/ExtensionMethodNames.java @@ -0,0 +1,33 @@ +package a; + +import lombok.experimental.ExtensionMethod; + +@ExtensionMethod(Extensions.class) +class ExtensionMethodNames { + + public void instanceCalls() { + (new Test()).ext(); + + Test t = new Test(); + t.ext(); + + Test Test = new Test(); + Test.ext(); + } + + public void staticCalls() { + Test.ext(); + a.Test.ext(); + } +} + +class Extensions { + public static void ext(Test t) { + } +} + +class Test { + public static void ext() { + + } +} \ No newline at end of file -- cgit