Implement support for static resolving to scripts in source roots in IDEA

This commit is contained in:
Pavel Talanov
2018-06-27 11:01:04 +02:00
committed by Ilya Chernikov
parent 9453834fb1
commit 2ecddc996a
3 changed files with 15 additions and 9 deletions
@@ -205,11 +205,6 @@ private inline fun <T> collectInfosByVirtualFile(
isScript: Boolean = getScriptDefinition(virtualFile, project) != null,
onOccurrence: (IdeaModuleInfo?) -> T
): T {
if (isScript) {
getScriptDefinition(virtualFile, project)?.let {
onOccurrence(ScriptModuleInfo(project, virtualFile, it))
}
}
val projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project)
@@ -218,6 +213,12 @@ private inline fun <T> collectInfosByVirtualFile(
onOccurrence(moduleRelatedModuleInfo)
}
if (moduleRelatedModuleInfo == null && isScript) {
getScriptDefinition(virtualFile, project)?.let {
onOccurrence(ScriptModuleInfo(project, virtualFile, it))
}
}
projectFileIndex.getOrderEntriesForFile(virtualFile).forEach {
it.toIdeaModuleInfo(project, virtualFile, treatAsLibrarySource)?.let(onOccurrence)
}
@@ -391,13 +391,13 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
private fun getFacadeToAnalyzeFiles(files: Collection<KtFile>): ResolutionFacade {
val file = files.first()
val moduleInfo = file.getModuleInfo()
val scripts = files.filterScripts()
val specialFiles = files.filterNotInProjectSource(moduleInfo)
val scripts = specialFiles.filterScripts()
if (scripts.isNotEmpty()) {
val projectFacade = getFacadeForScripts(scripts)
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
}
val specialFiles = files.filterNotInProjectSource(moduleInfo)
if (specialFiles.isNotEmpty()) {
val projectFacade = getFacadeForSpecialFiles(specialFiles)
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
@@ -9,6 +9,7 @@ import com.intellij.util.indexing.*
import com.intellij.util.io.DataExternalizer
import com.intellij.util.io.EnumeratorStringDescriptor
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFile
import java.io.DataInput
@@ -28,7 +29,7 @@ object KotlinPackageSourcesMemberNamesIndex : FileBasedIndexExtension<String, Co
override fun getValueExternalizer() = StringSetExternalizer
override fun getInputFilter(): FileBasedIndex.InputFilter =
FileBasedIndex.InputFilter { file -> file.extension == KotlinFileType.EXTENSION }
FileBasedIndex.InputFilter { file -> file.extension == KotlinFileType.EXTENSION || file.extension == KotlinParserDefinition.STD_SCRIPT_SUFFIX }
override fun getVersion(): Int = 2
@@ -40,7 +41,11 @@ object KotlinPackageSourcesMemberNamesIndex : FileBasedIndexExtension<String, Co
val ktFile = inputData.psiFile as? KtFile ?: return@DataIndexer emptyMap()
val packageName = ktFile.packageDirective?.fqName?.asString() ?: ""
mapOf(packageName to ktFile.declarations.mapNotNullTo(hashSetOf(), KtDeclaration::getName))
if (!ktFile.isScript()) {
mapOf(packageName to ktFile.declarations.mapNotNullTo(hashSetOf(), KtDeclaration::getName))
} else {
mapOf(packageName to listOfNotNull(ktFile.script?.name).toHashSet())
}
}
}