diff --git a/src/main/java/com/github/cameltooling/idea/service/extension/camel/JavaCamelIdeaUtils.java b/src/main/java/com/github/cameltooling/idea/service/extension/camel/JavaCamelIdeaUtils.java index d8a968f6..aba23979 100644 --- a/src/main/java/com/github/cameltooling/idea/service/extension/camel/JavaCamelIdeaUtils.java +++ b/src/main/java/com/github/cameltooling/idea/service/extension/camel/JavaCamelIdeaUtils.java @@ -51,6 +51,7 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiMethodCallExpression; import com.intellij.psi.PsiReferenceExpression; +import com.intellij.psi.PsiThisExpression; import com.intellij.psi.PsiType; import com.intellij.psi.PsiTypeParameter; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -61,6 +62,7 @@ import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.testFramework.LightVirtualFile; import java.util.ArrayDeque; @@ -372,6 +374,13 @@ public PsiClass getBeanClass(PsiElement element) { } PsiJavaCodeReferenceElement referenceElement = PsiTreeUtil.findChildOfType(beanPsiElement, PsiJavaCodeReferenceElement.class); + if (referenceElement == null) { + PsiThisExpression thisExpression = PsiTreeUtil.findChildOfType(beanPsiElement, PsiThisExpression.class); + if (thisExpression != null) { + return PsiUtil.resolveClassInClassTypeOnly(thisExpression.getType()); + } + } + final PsiClass psiClass = JavaClassUtils.getService().resolveClassReference(referenceElement); if (psiClass != null && !JAVA_LANG_STRING.equals(psiClass.getQualifiedName())) { @@ -379,7 +388,12 @@ public PsiClass getBeanClass(PsiElement element) { } String beanName = ""; - if (referenceElement instanceof PsiReferenceExpression) { + if (referenceElement instanceof PsiReferenceExpression refExpression) { + PsiType beanType = refExpression.getType(); + PsiClass beanClass = PsiUtil.resolveClassInClassTypeOnly(beanType); + if (beanClass != null && !String.class.getName().equals(beanClass.getQualifiedName())) { + return beanClass; + } beanName = getStaticBeanName(referenceElement, beanName); } else { final String[] beanParameters = beanPsiElement.getText().replace("(", "").replace(")", "").split(","); diff --git a/src/test/java/com/github/cameltooling/idea/reference/CamelBeanMethodReferenceTest.java b/src/test/java/com/github/cameltooling/idea/reference/CamelBeanMethodReferenceTest.java index defeef91..84d0a001 100644 --- a/src/test/java/com/github/cameltooling/idea/reference/CamelBeanMethodReferenceTest.java +++ b/src/test/java/com/github/cameltooling/idea/reference/CamelBeanMethodReferenceTest.java @@ -193,4 +193,27 @@ public void testFindUsageFromWithAmbiguousToBeanDSLWithParameters() { assertThat(referenceElement, instanceOf(PsiLiteralExpression.class)); assertEquals("(beanTestData, \"myAmbiguousMethod(${body})\")", referenceElement.getParent().getText()); } + + public void testThisKeywordUsedAsBean() { + myFixture.configureByText("MyRoute.java", + // language=JAVA + """ + import org.apache.camel.builder.RouteBuilder; + public class MyRoute extends RouteBuilder { + @Override + public void configure() { + from("direct:test") + .bean(this, "myMethod"); + } + + public String myMethod() { return "Hello World"; } + + } + """); + PsiElement element = myFixture.getFile().findElementAt(myFixture.getCaretOffset()).getParent(); + final ResolveResult[] resolveResults = ((CamelBeanMethodReference) element.getReferences()[0]).multiResolve(false); + assertEquals(1, resolveResults.length); + assertEquals("public String myMethod() { return \"Hello World\"; }", resolveResults[0].getElement().getText()); + } + }