diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index 4f396e92e956..e31cb8aca581 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -329,6 +329,8 @@ + + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyFile.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyFile.java index c5105e7093f5..505f4f169db7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyFile.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/GroovyFile.java @@ -15,7 +15,6 @@ */ package org.jetbrains.plugins.groovy.lang.psi; -import com.intellij.psi.FileResolveScopeProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiType; import com.intellij.util.IncorrectOperationException; @@ -28,7 +27,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.packaging.GrPackageDef /** * @author ven */ -public interface GroovyFile extends GroovyFileBase, FileResolveScopeProvider { +public interface GroovyFile extends GroovyFileBase { GroovyFile[] EMPTY_ARRAY = new GroovyFile[0]; GrImportStatement[] getImportStatements(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java index cd86a6e4f513..99cc57a19be1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java @@ -19,21 +19,14 @@ package org.jetbrains.plugins.groovy.lang.psi.impl; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.UserDataCache; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.impl.ElementBase; -import com.intellij.psi.impl.PsiManagerEx; -import com.intellij.psi.impl.file.impl.FileManagerImpl; import com.intellij.psi.scope.DelegatingScopeProcessor; import com.intellij.psi.scope.PsiScopeProcessor; -import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StubElement; -import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; @@ -584,34 +577,5 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { } return this; } - - private static final UserDataCache, GroovyFile, GlobalSearchScope> RESOLVE_SCOPE_CACHE = new UserDataCache, GroovyFile, GlobalSearchScope>("RESOLVE_SCOPE_CACHE") { - @Override - protected CachedValue compute(final GroovyFile file, final GlobalSearchScope baseScope) { - return CachedValuesManager.getManager(file.getProject()).createCachedValue(new CachedValueProvider() { - public Result compute() { - GlobalSearchScope scope = GroovyScriptTypeDetector.getScriptType(file).patchResolveScope(file, baseScope); - return Result.create(scope, file, ProjectRootManager.getInstance(file.getProject())); - } - }, false); - } - }; - public GlobalSearchScope getFileResolveScope() { - final PsiElement context = getContext(); - if (context instanceof GroovyFile) { - return context.getResolveScope(); - } - - final VirtualFile vFile = getOriginalFile().getVirtualFile(); - if (vFile == null) { - return GlobalSearchScope.allScope(getProject()); - } - - final GlobalSearchScope baseScope = ((FileManagerImpl)((PsiManagerEx)getManager()).getFileManager()).getDefaultResolveScope(vFile); - if (isScript()) { - return RESOLVE_SCOPE_CACHE.get(this, baseScope).getValue(); - } - return baseScope; - } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveScopeProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveScopeProvider.java new file mode 100644 index 000000000000..babdf37d41bd --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GroovyResolveScopeProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.resolve; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.ResolveScopeProvider; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector; +import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; + +/** + * @author Max Medvedev + */ +public class GroovyResolveScopeProvider extends ResolveScopeProvider { + @Override + public GlobalSearchScope getResolveScope(@NotNull VirtualFile file, Project project) { + if (file.getFileType() != GroovyFileType.GROOVY_FILE_TYPE) return null; + + ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + Module module = projectFileIndex.getModuleForFile(file); + + if (module == null) return null; //groovy files are only in modules + + boolean includeTests = projectFileIndex.isInTestSourceContent(file) || !projectFileIndex.isInSourceContent(file); + final GlobalSearchScope scope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, includeTests); + + final PsiFile psi = PsiManager.getInstance(project).findFile(file); + if (psi instanceof GroovyFile && ((GroovyFile)psi).isScript()) { + return GroovyScriptTypeDetector.getScriptType((GroovyFile)psi).patchResolveScope((GroovyFile)psi, scope); + } + else { + return scope; + } + } +}