From 3baf7f1f862bbab8eafe781ea57713ab1525bdfb Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 10 Feb 2015 21:39:58 +0100 Subject: [PATCH] ask each intermediate context file for a forced resolve scope (IDEA-136304) --- .../psi/resolve/ResolveInCodeFragmentTest.java | 12 ++++++++++++ .../impl/file/impl/ResolveScopeManagerImpl.java | 17 +++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java b/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java index b934877c48bf..f108ad67742b 100644 --- a/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInCodeFragmentTest.java @@ -1,6 +1,7 @@ package com.intellij.psi.resolve; import com.intellij.psi.*; +import com.intellij.psi.impl.search.JavaSourceFilterScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.ResolveTestCase; @@ -45,4 +46,15 @@ public class ResolveInCodeFragmentTest extends ResolveTestCase { private PsiReference configure() throws Exception { return configureByFile("codeFragment/" + getTestName(false) + ".java"); } + + public void testResolveScopeWithFragmentContext() throws Exception { + PsiElement physical = configureByFile("codeFragment/LocalVariable.java").getElement(); + JavaCodeFragment fragment = JavaCodeFragmentFactory.getInstance(myProject) + .createExpressionCodeFragment("ref", physical, null, true); + fragment.forceResolveScope(new JavaSourceFilterScope(physical.getResolveScope())); + assertFalse(fragment.getResolveScope().equals(physical.getResolveScope())); + + PsiExpression lightExpr = JavaPsiFacade.getElementFactory(myProject).createExpressionFromText("xxx.xxx", fragment); + assertEquals(lightExpr.getResolveScope(), fragment.getResolveScope()); + } } diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java index f3a9c183874d..c60d30739852 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java @@ -26,7 +26,6 @@ import com.intellij.openapi.vfs.VirtualFileWithId; import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.ResolveScopeManager; -import com.intellij.psi.impl.source.resolve.FileContextUtil; import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.SearchScope; @@ -145,15 +144,17 @@ public class ResolveScopeManagerImpl extends ResolveScopeManager { if (forcedScope != null) { return forcedScope; } - final PsiElement context = containingFile.getContext(); - if (context == null) { - return GlobalSearchScope.allScope(myProject); - } - return getResolveScope(context); } - contextFile = containingFile != null ? FileContextUtil.getContextFile(containingFile) : null; - if (contextFile == null) { + if (containingFile != null) { + PsiElement context = containingFile.getContext(); + if (context != null) { + return getResolveScope(context); + } + } + + contextFile = containingFile; + if (containingFile == null) { return GlobalSearchScope.allScope(myProject); } else if (contextFile instanceof FileResolveScopeProvider) {