From de535511f8e12a25f923a89d936a87330fd60e86 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 21 Sep 2015 09:52:32 +0200 Subject: [PATCH] configure limited resolve scope for out-of-sources java classes via ResolveScopeProvider instead of hacking PsiJavaFileImpl (IDEA-143728) --- .../JavaOutOfSourcesResolveScopeProvider.java | 49 +++++++++++++++++++ .../psi/impl/source/PsiJavaFileImpl.java | 18 ------- resources/src/META-INF/IdeaPlugin.xml | 1 + 3 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaOutOfSourcesResolveScopeProvider.java diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaOutOfSourcesResolveScopeProvider.java b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaOutOfSourcesResolveScopeProvider.java new file mode 100644 index 000000000000..a3e9e87f3a4c --- /dev/null +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaOutOfSourcesResolveScopeProvider.java @@ -0,0 +1,49 @@ +/* + * Copyright 2000-2015 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 com.intellij.psi.impl.file.impl; + +import com.intellij.lang.java.JavaLanguage; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.LanguageFileType; +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.ResolveScopeProvider; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Limited resolve scope for all java files in module content, but not under source roots. + * For example, java files from test data. + * There is still a possibility to modify this scope choice with the ResolveScopeEnlarger. + */ +public class JavaOutOfSourcesResolveScopeProvider extends ResolveScopeProvider { + @Nullable + @Override + public GlobalSearchScope getResolveScope(@NotNull VirtualFile file, Project project) { + // For java only! For other languages resolve may be implemented with different rules, requiring larger scope. + final FileType type = file.getFileType(); + if (type instanceof LanguageFileType && ((LanguageFileType)type).getLanguage() == JavaLanguage.INSTANCE) { + ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex(); + if (index.isInContent(file) && !index.isInSource(file)) { + return GlobalSearchScope.fileScope(project, file); + } + } + return null; + } +} diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java index e56f53cbfbdf..97b43b4db570 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java @@ -16,14 +16,9 @@ package com.intellij.psi.impl.source; import com.intellij.ide.highlighter.JavaFileType; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.roots.FileIndexFacade; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.FileViewProvider; import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.testFramework.LightVirtualFile; import org.jetbrains.annotations.NotNull; public class PsiJavaFileImpl extends PsiJavaFileBaseImpl { @@ -31,19 +26,6 @@ public class PsiJavaFileImpl extends PsiJavaFileBaseImpl { super(JavaStubElementTypes.JAVA_FILE, JavaStubElementTypes.JAVA_FILE, file); } - @NotNull - @Override - public GlobalSearchScope getResolveScope() { - final VirtualFile file = getVirtualFile(); - if (file != null && !(file instanceof LightVirtualFile)) { - final FileIndexFacade index = ServiceManager.getService(getProject(), FileIndexFacade.class); - if (!index.isInSource(file) && !index.isInLibraryClasses(file)) { - return GlobalSearchScope.fileScope(this); - } - } - return super.getResolveScope(); - } - @Override @NotNull public FileType getFileType() { diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index dc491169370d..f4ee697a1045 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1548,6 +1548,7 @@ +