resolve to context method parameters from non-physical code blocks
authorpeter <peter@jetbrains.com>
Fri, 28 Oct 2016 05:49:58 +0000 (07:49 +0200)
committerpeter <peter@jetbrains.com>
Fri, 28 Oct 2016 05:51:38 +0000 (07:51 +0200)
java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java

index 7fe84830d8aa8f5bec12d85f22e61db4f85ac6fd..69d353e49edcea43b3306a5755d18d94eb6fce50 100644 (file)
@@ -30,6 +30,7 @@ import com.intellij.psi.*;
 import com.intellij.psi.filters.ElementFilter;
 import com.intellij.psi.impl.light.LightClassReference;
 import com.intellij.psi.impl.light.LightJavaModule;
+import com.intellij.psi.impl.source.DummyHolder;
 import com.intellij.psi.impl.source.PsiClassReferenceType;
 import com.intellij.psi.impl.source.PsiImmediateClassType;
 import com.intellij.psi.impl.source.resolve.ResolveCache;
@@ -182,10 +183,11 @@ public class PsiImplUtil {
   public static boolean processDeclarationsInMethod(@NotNull final PsiMethod method,
                                                     @NotNull final PsiScopeProcessor processor,
                                                     @NotNull final ResolveState state,
-                                                    final PsiElement lastParent,
+                                                    PsiElement lastParent,
                                                     @NotNull final PsiElement place) {
-    final boolean fromBody = lastParent instanceof PsiCodeBlock;
-    final PsiTypeParameterList typeParameterList = method.getTypeParameterList();
+    if (lastParent instanceof DummyHolder) lastParent = lastParent.getFirstChild();
+    boolean fromBody = lastParent instanceof PsiCodeBlock;
+    PsiTypeParameterList typeParameterList = method.getTypeParameterList();
     return processDeclarationsInMethodLike(method, processor, state, place, fromBody, typeParameterList);
   }
 
index 3ec97af77491b50907b592fb805be5eaf9a9ae0a..5633acd5ba7d3689e31e9b8af5a5a2c304c7e997 100644 (file)
@@ -88,4 +88,11 @@ public class ResolveInCodeFragmentTest extends ResolveTestCase {
     assertTrue(ref.getElement().getResolveScope().contains(file.getViewProvider().getVirtualFile()));
     assertInstanceOf(ref.resolve(), PsiMethod.class);
   }
+
+  public void testResolveMethodParamsFromNonPhysicalCodeBlock() {
+    PsiElementFactory factory = JavaPsiFacade.getElementFactory(getProject());
+    PsiMethod method = factory.createMethodFromText("void foo(Object o);", null);
+    PsiCodeBlock block = factory.createCodeBlockFromText("{ return o; }", method);
+    assertInstanceOf(block.findReferenceAt(block.getText().indexOf("o")).resolve(), PsiParameter.class);
+  }
 }