resolve to context method parameters from non-physical code blocks

This commit is contained in:
peter
2016-10-28 07:51:38 +02:00
parent 04f6faf096
commit 32fbf57626
2 changed files with 12 additions and 3 deletions
@@ -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);
}
@@ -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);
}
}