configure limited resolve scope for out-of-sources java classes via ResolveScopeProvi... clion/142.5030
authorEugene Zhuravlev <jeka@intellij.com>
Mon, 21 Sep 2015 07:52:32 +0000 (09:52 +0200)
committerEugene Zhuravlev <jeka@intellij.com>
Mon, 21 Sep 2015 07:56:15 +0000 (09:56 +0200)
java/java-indexing-impl/src/com/intellij/psi/impl/file/impl/JavaOutOfSourcesResolveScopeProvider.java [new file with mode: 0644]
java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java
resources/src/META-INF/IdeaPlugin.xml

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 (file)
index 0000000..a3e9e87
--- /dev/null
@@ -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;
+  }
+}
index e56f53cbfbdfabe1f8fa7ab0b80d045bbf2aed8c..97b43b4db5706b4eb2ff39bf97cdbb7b6f968773 100644 (file)
 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() {
index dc491169370d780e449ebd195e942723cce16eb1..f4ee697a1045e6d8202800bf495df629fc9ed61c 100644 (file)
     <applicationService serviceInterface="com.intellij.profile.codeInspection.InspectionProfileManager"
                         serviceImplementation="com.intellij.profile.codeInspection.JavaAwareInspectionProfileManager"/>
 
+    <resolveScopeProvider implementation="com.intellij.psi.impl.file.impl.JavaOutOfSourcesResolveScopeProvider"/>
     <resolveScopeEnlarger implementation="com.intellij.psi.NonClasspathResolveScopeEnlarger"/>
 
     <xdebugger.debuggerSupport implementation="com.intellij.debugger.ui.JavaDebuggerSupport"/>