diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/DelegateHandler.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/DelegateHandler.java index 9811fac945b0..742d7fe73e7b 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/DelegateHandler.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/DelegateHandler.java @@ -9,6 +9,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.problem.ProblemSink; +import de.plushnikov.intellij.plugin.psi.LombokDelegateMethod; import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder; import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil; @@ -205,7 +206,7 @@ public final class DelegateHandler { @NotNull PsiSubstitutor psiSubstitutor) { final PsiType returnType = psiSubstitutor.substitute(psiMethod.getReturnType()); - final LombokLightMethodBuilder methodBuilder = new LombokLightMethodBuilder(psiClass.getManager(), psiMethod.getName()) + final LombokLightMethodBuilder methodBuilder = new LombokDelegateMethod(psiMethod) .withModifier(PsiModifier.PUBLIC) .withMethodReturnType(returnType) .withContainingClass(psiClass) diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/method/ExtensionMethodsHelper.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/method/ExtensionMethodsHelper.java index d803c3f2f898..35e08ec067bf 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/method/ExtensionMethodsHelper.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/method/ExtensionMethodsHelper.java @@ -11,7 +11,7 @@ import com.intellij.psi.util.*; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import de.plushnikov.intellij.plugin.LombokClassNames; -import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder; +import de.plushnikov.intellij.plugin.psi.LombokExtensionMethod; import de.plushnikov.intellij.plugin.psi.LombokLightParameter; import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; @@ -126,8 +126,7 @@ public final class ExtensionMethodsHelper { PsiSubstitutor substitutor = result.getSubstitutor(); final LombokExtensionMethod lightMethod = new LombokExtensionMethod(staticMethod); - lightMethod - .addModifiers(PsiModifier.PUBLIC); + lightMethod.addModifiers(PsiModifier.PUBLIC); PsiParameter @NotNull [] parameters = staticMethod.getParameterList().getParameters(); if (targetClass.isInterface()) { @@ -156,31 +155,4 @@ public final class ExtensionMethodsHelper { lightMethod.setContainingClass(targetClass); return lightMethod; } - - private static class LombokExtensionMethod extends LombokLightMethodBuilder implements PsiExtensionMethod { - private final @NotNull PsiMethod myStaticMethod; - - LombokExtensionMethod(@NotNull PsiMethod staticMethod) { - super(staticMethod.getManager(), staticMethod.getName()); - myStaticMethod = staticMethod; - } - - @Override - public boolean isEquivalentTo(final PsiElement another) { return myStaticMethod.isEquivalentTo(another); } - - @Override - public @NotNull PsiMethod getTargetMethod() { - return myStaticMethod; - } - - @Override - public @Nullable PsiParameter getTargetReceiverParameter() { - return myStaticMethod.getParameterList().getParameter(0); - } - - @Override - public @Nullable PsiParameter getTargetParameter(int index) { - return myStaticMethod.getParameterList().getParameter(index + 1); - } - } } diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/psi/LombokDelegateMethod.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/psi/LombokDelegateMethod.java new file mode 100644 index 000000000000..63137dfb6895 --- /dev/null +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/psi/LombokDelegateMethod.java @@ -0,0 +1,35 @@ +package de.plushnikov.intellij.plugin.psi; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiParameter; +import com.intellij.psi.augment.PsiExtensionMethod; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class LombokDelegateMethod extends LombokLightMethodBuilder implements PsiExtensionMethod { + private final @NotNull PsiMethod myMethod; + + public LombokDelegateMethod(@NotNull PsiMethod method) { + super(method.getManager(), method.getName()); + myMethod = method; + } + + @Override + public boolean isEquivalentTo(final PsiElement another) { return myMethod.isEquivalentTo(another); } + + @Override + public @NotNull PsiMethod getTargetMethod() { + return myMethod; + } + + @Override + public @Nullable PsiParameter getTargetReceiverParameter() { + return null; + } + + @Override + public @Nullable PsiParameter getTargetParameter(int index) { + return null; + } +} diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/psi/LombokExtensionMethod.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/psi/LombokExtensionMethod.java new file mode 100644 index 000000000000..c7ea84a12af4 --- /dev/null +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/psi/LombokExtensionMethod.java @@ -0,0 +1,22 @@ +package de.plushnikov.intellij.plugin.psi; + +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiParameter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class LombokExtensionMethod extends LombokDelegateMethod { + public LombokExtensionMethod(@NotNull PsiMethod staticMethod) { + super(staticMethod); + } + + @Override + public @Nullable PsiParameter getTargetReceiverParameter() { + return getTargetMethod().getParameterList().getParameter(0); + } + + @Override + public @Nullable PsiParameter getTargetParameter(int index) { + return getTargetMethod().getParameterList().getParameter(index + 1); + } +} diff --git a/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java b/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java index ea6a4fb062e5..7056384f88ea 100644 --- a/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java +++ b/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java @@ -65,6 +65,16 @@ public class LombokUsageTest extends AbstractLombokLightCodeInsightTestCase { "FindUsageSingularBuilder.builder().clearBars", "findUsageBuilder.getBars"); } + public void testFindUsageDelegateField() { + final Collection usages = loadTestClass(); + assertUsages(usages, "ctx.getId"); + } + + public void testFindUsageDelegateMethod() { + final Collection usages = loadTestClass(); + assertUsages(usages, "classA.foo"); + } + public void testFieldUsages() { myFixture.configureByFile(getTestName(false) + ".java"); PsiClass aClass = myFixture.findClass("Apple"); diff --git a/plugins/lombok/testData/usage/FindUsageDelegateField.java b/plugins/lombok/testData/usage/FindUsageDelegateField.java new file mode 100644 index 000000000000..1a99dbea24ad --- /dev/null +++ b/plugins/lombok/testData/usage/FindUsageDelegateField.java @@ -0,0 +1,20 @@ +import lombok.Getter; +import lombok.experimental.Delegate; + +public class FindUsageDelegateField { + public static void main(String[] args) { + Ctx ctx = new Ctx<>(); + String data = ctx.getId(); + System.out.println(data); + } + + public static class Ctx { + @Delegate + private Param param; + } + + @Getter + public static class Param { + private final String id; + } +} \ No newline at end of file diff --git a/plugins/lombok/testData/usage/FindUsageDelegateMethod.java b/plugins/lombok/testData/usage/FindUsageDelegateMethod.java new file mode 100644 index 000000000000..60c614155840 --- /dev/null +++ b/plugins/lombok/testData/usage/FindUsageDelegateMethod.java @@ -0,0 +1,19 @@ +import lombok.experimental.Delegate; + +public class FindUsageDelegateMethod { + @Delegate + private ClassB classB; +} + +class ClassB { + public void foo() { + } +} + +class ClassC { + private FindUsageDelegateMethod classA; + + public void bar() { + classA.foo(); + } +} \ No newline at end of file