blob: 47bdd416e9d607fe285059663e0b5c73b7d76599 [file]
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.gradle.config;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.externalSystem.psi.search.ExternalModuleBuildGlobalSearchScope;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.impl.PackageDirectoryCache;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.NonClasspathClassFinder;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.search.EverythingGlobalScope;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.gradle.service.GradleBuildClasspathManager;
import org.jetbrains.plugins.groovy.GroovyFileType;
import java.util.List;
import java.util.Map;
/**
* @author peter
*/
public final class GradleClassFinder extends NonClasspathClassFinder {
public GradleClassFinder(@NotNull Project project) {
super(project, JavaFileType.DEFAULT_EXTENSION, GroovyFileType.DEFAULT_EXTENSION);
}
@Override
protected List<VirtualFile> calcClassRoots() {
return GradleBuildClasspathManager.getInstance(myProject).getAllClasspathEntries();
}
@NotNull
@Override
protected PackageDirectoryCache getCache(@Nullable GlobalSearchScope scope) {
if (scope instanceof ExternalModuleBuildGlobalSearchScope) {
GradleBuildClasspathManager buildClasspathManager = GradleBuildClasspathManager.getInstance(myProject);
Map<String, PackageDirectoryCache> classFinderCache = buildClasspathManager.getClassFinderCache();
return classFinderCache.get(((ExternalModuleBuildGlobalSearchScope)scope).getExternalModulePath());
}
return super.getCache(scope);
}
@Override
public void clearCache() {
super.clearCache();
GradleBuildClasspathManager buildClasspathManager = GradleBuildClasspathManager.getInstance(myProject);
Map<String, PackageDirectoryCache> classFinderCache = buildClasspathManager.getClassFinderCache();
classFinderCache.clear();
}
@Override
public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
PsiClass aClass = super.findClass(qualifiedName, scope);
if (aClass == null || scope instanceof ExternalModuleBuildGlobalSearchScope || scope instanceof EverythingGlobalScope) {
return aClass;
}
PsiFile containingFile = aClass.getContainingFile();
VirtualFile file = containingFile != null ? containingFile.getVirtualFile() : null;
return file != null &&
!ProjectFileIndex.SERVICE.getInstance(myProject).isInContent(file) &&
!ProjectFileIndex.SERVICE.getInstance(myProject).isInLibrary(file) ? aClass : null;
}
@Override
public PsiPackage @NotNull [] getSubPackages(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) {
return scope instanceof ExternalModuleBuildGlobalSearchScope ? super.getSubPackages(psiPackage, scope) : PsiPackage.EMPTY_ARRAY;
}
}