Implement support for static resolving to scripts in source roots in IDEA
This commit is contained in:
committed by
Ilya Chernikov
parent
9453834fb1
commit
2ecddc996a
@@ -205,11 +205,6 @@ private inline fun <T> collectInfosByVirtualFile(
|
|||||||
isScript: Boolean = getScriptDefinition(virtualFile, project) != null,
|
isScript: Boolean = getScriptDefinition(virtualFile, project) != null,
|
||||||
onOccurrence: (IdeaModuleInfo?) -> T
|
onOccurrence: (IdeaModuleInfo?) -> T
|
||||||
): T {
|
): T {
|
||||||
if (isScript) {
|
|
||||||
getScriptDefinition(virtualFile, project)?.let {
|
|
||||||
onOccurrence(ScriptModuleInfo(project, virtualFile, it))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project)
|
val projectFileIndex = ProjectFileIndex.SERVICE.getInstance(project)
|
||||||
|
|
||||||
@@ -218,6 +213,12 @@ private inline fun <T> collectInfosByVirtualFile(
|
|||||||
onOccurrence(moduleRelatedModuleInfo)
|
onOccurrence(moduleRelatedModuleInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (moduleRelatedModuleInfo == null && isScript) {
|
||||||
|
getScriptDefinition(virtualFile, project)?.let {
|
||||||
|
onOccurrence(ScriptModuleInfo(project, virtualFile, it))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
projectFileIndex.getOrderEntriesForFile(virtualFile).forEach {
|
projectFileIndex.getOrderEntriesForFile(virtualFile).forEach {
|
||||||
it.toIdeaModuleInfo(project, virtualFile, treatAsLibrarySource)?.let(onOccurrence)
|
it.toIdeaModuleInfo(project, virtualFile, treatAsLibrarySource)?.let(onOccurrence)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -391,13 +391,13 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
private fun getFacadeToAnalyzeFiles(files: Collection<KtFile>): ResolutionFacade {
|
private fun getFacadeToAnalyzeFiles(files: Collection<KtFile>): ResolutionFacade {
|
||||||
val file = files.first()
|
val file = files.first()
|
||||||
val moduleInfo = file.getModuleInfo()
|
val moduleInfo = file.getModuleInfo()
|
||||||
val scripts = files.filterScripts()
|
val specialFiles = files.filterNotInProjectSource(moduleInfo)
|
||||||
|
val scripts = specialFiles.filterScripts()
|
||||||
if (scripts.isNotEmpty()) {
|
if (scripts.isNotEmpty()) {
|
||||||
val projectFacade = getFacadeForScripts(scripts)
|
val projectFacade = getFacadeForScripts(scripts)
|
||||||
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
|
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
val specialFiles = files.filterNotInProjectSource(moduleInfo)
|
|
||||||
if (specialFiles.isNotEmpty()) {
|
if (specialFiles.isNotEmpty()) {
|
||||||
val projectFacade = getFacadeForSpecialFiles(specialFiles)
|
val projectFacade = getFacadeForSpecialFiles(specialFiles)
|
||||||
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
|
return ModuleResolutionFacadeImpl(projectFacade, moduleInfo)
|
||||||
|
|||||||
+7
-2
@@ -9,6 +9,7 @@ import com.intellij.util.indexing.*
|
|||||||
import com.intellij.util.io.DataExternalizer
|
import com.intellij.util.io.DataExternalizer
|
||||||
import com.intellij.util.io.EnumeratorStringDescriptor
|
import com.intellij.util.io.EnumeratorStringDescriptor
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
|
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import java.io.DataInput
|
import java.io.DataInput
|
||||||
@@ -28,7 +29,7 @@ object KotlinPackageSourcesMemberNamesIndex : FileBasedIndexExtension<String, Co
|
|||||||
override fun getValueExternalizer() = StringSetExternalizer
|
override fun getValueExternalizer() = StringSetExternalizer
|
||||||
|
|
||||||
override fun getInputFilter(): FileBasedIndex.InputFilter =
|
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
|
override fun getVersion(): Int = 2
|
||||||
|
|
||||||
@@ -40,7 +41,11 @@ object KotlinPackageSourcesMemberNamesIndex : FileBasedIndexExtension<String, Co
|
|||||||
val ktFile = inputData.psiFile as? KtFile ?: return@DataIndexer emptyMap()
|
val ktFile = inputData.psiFile as? KtFile ?: return@DataIndexer emptyMap()
|
||||||
val packageName = ktFile.packageDirective?.fqName?.asString() ?: ""
|
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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user