Enlarge scope for auto-import and completion with extensions (KT-27944)

Android R classes provided with scope enlarger and they can be found
during resolve, but ignored during auto-import search.
This commit is contained in:
Nikolay Krasko
2018-11-15 12:17:38 +03:00
parent be92c5e787
commit 5ab812e29e
2 changed files with 19 additions and 9 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.caches.project.LibraryModuleInfo
import org.jetbrains.kotlin.caches.resolve.resolution
import org.jetbrains.kotlin.config.KotlinSourceRootType
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.util.enlargedSearchScope
import org.jetbrains.kotlin.idea.configuration.BuildSystemType
import org.jetbrains.kotlin.idea.configuration.getBuildSystemType
import org.jetbrains.kotlin.idea.core.isInTestSourceContentKotlinAware
@@ -61,14 +62,6 @@ interface IdeaModuleInfo : org.jetbrains.kotlin.idea.caches.resolve.IdeaModuleIn
override fun dependencies(): List<IdeaModuleInfo>
}
private fun enlargedSearchScope(searchScope: GlobalSearchScope, moduleFile: VirtualFile?): GlobalSearchScope {
if (moduleFile == null) return searchScope
return ResolveScopeEnlarger.EP_NAME.extensions.fold(searchScope) { scope, enlarger ->
val extra = enlarger.getAdditionalResolveScope(moduleFile, scope.project)
if (extra != null) scope.union(extra) else scope
}
}
private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, forProduction: Boolean): List<IdeaModuleInfo> {
fun Module.toInfos() = correspondingModuleInfos().filter { !forProduction || it is ModuleProductionSourceInfo }
@@ -5,6 +5,9 @@
package org.jetbrains.kotlin.idea.caches.resolve.util
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import com.intellij.psi.ResolveScopeEnlarger
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.caches.project.ScriptModuleInfo
@@ -29,8 +32,22 @@ fun getResolveScope(file: KtFile): GlobalSearchScope {
}
return when (file.getModuleInfo()) {
is ModuleSourceInfo -> KotlinSourceFilterScope.projectSourceAndClassFiles(file.resolveScope, file.project)
is ModuleSourceInfo -> enlargedSearchScope(KotlinSourceFilterScope.projectSourceAndClassFiles(file.resolveScope, file.project), file)
is ScriptModuleInfo -> file.getModuleInfo().dependencies().map { it.contentScope() }.let { GlobalSearchScope.union(it.toTypedArray()) }
else -> GlobalSearchScope.EMPTY_SCOPE
}
}
fun enlargedSearchScope(searchScope: GlobalSearchScope, psiFile: PsiFile?): GlobalSearchScope {
val virtualFile = psiFile?.originalFile?.virtualFile
return enlargedSearchScope(searchScope, virtualFile)
}
fun enlargedSearchScope(searchScope: GlobalSearchScope, moduleFile: VirtualFile?): GlobalSearchScope {
if (moduleFile == null) return searchScope
return ResolveScopeEnlarger.EP_NAME.extensions.fold(searchScope) { scope, enlarger ->
val extra = enlarger.getAdditionalResolveScope(moduleFile, scope.project)
if (extra != null) scope.union(extra) else scope
}
}