Completion for script inside module should provide classes from related module
^KT-35825 Fixed
This commit is contained in:
+18
-12
@@ -22,8 +22,9 @@ import com.intellij.psi.PsiManager
|
||||
import com.intellij.psi.ResolveScopeProvider
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||
import org.jetbrains.kotlin.idea.caches.project.ScriptModuleInfo
|
||||
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
|
||||
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
|
||||
import org.jetbrains.kotlin.idea.core.script.StandardIdeScriptDefinition
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
|
||||
@@ -39,17 +40,22 @@ class KotlinScriptResolveScopeProvider : ResolveScopeProvider() {
|
||||
if (file.fileType != KotlinFileType.INSTANCE) return null
|
||||
|
||||
val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return null
|
||||
val scriptDefinition = ktFile.findScriptDefinition()
|
||||
return when {
|
||||
scriptDefinition == null -> null
|
||||
// This is a workaround for completion in scripts and REPL to provide module dependencies
|
||||
scriptDefinition.baseClassType.fromClass == Any::class -> null
|
||||
scriptDefinition.asLegacyOrNull<StandardIdeScriptDefinition>() != null -> null
|
||||
scriptDefinition is ScriptDefinition.FromConfigurations || scriptDefinition.asLegacyOrNull<KotlinScriptDefinitionFromAnnotatedTemplate>() != null -> {
|
||||
GlobalSearchScope.fileScope(project, file)
|
||||
.union(ScriptConfigurationManager.getInstance(project).getScriptDependenciesClassFilesScope(file))
|
||||
}
|
||||
else -> null
|
||||
val scriptDefinition = ktFile.findScriptDefinition() ?: return null
|
||||
|
||||
// This is a workaround for completion in scripts inside module and REPL to provide module dependencies
|
||||
if (ktFile.getModuleInfo() !is ScriptModuleInfo) return null
|
||||
|
||||
// This is a workaround for completion in REPL to provide module dependencies
|
||||
if (scriptDefinition.baseClassType.fromClass == Any::class) return null
|
||||
|
||||
if (scriptDefinition is ScriptDefinition.FromConfigurations ||
|
||||
scriptDefinition.asLegacyOrNull<KotlinScriptDefinitionFromAnnotatedTemplate>() != null
|
||||
) {
|
||||
return GlobalSearchScope.fileScope(project, file).union(
|
||||
ScriptConfigurationManager.getInstance(project).getScriptDependenciesClassFilesScope(file)
|
||||
)
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
}
|
||||
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
package test
|
||||
|
||||
object KObject {
|
||||
fun foo() {
|
||||
|
||||
}
|
||||
}
|
||||
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
KObje<caret>
|
||||
|
||||
// CONFLICTING_MODULE
|
||||
// EXIST: KObject
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package custom.scriptDefinition
|
||||
|
||||
import kotlin.script.experimental.annotations.KotlinScript
|
||||
import kotlin.script.experimental.api.*
|
||||
|
||||
@KotlinScript(
|
||||
displayName = "Definition for tests",
|
||||
fileExtension = "kts",
|
||||
compilationConfiguration = TemplateDefinition::class
|
||||
)
|
||||
open class Template(val args: Array<String>)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
object TemplateDefinition : ScriptCompilationConfiguration(
|
||||
{
|
||||
baseClass(Base::class)
|
||||
ide {
|
||||
acceptedLocations(ScriptAcceptedLocation.Everywhere)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
open class Base
|
||||
Generated
+5
@@ -33,6 +33,11 @@ public class ScriptConfigurationCompletionTestGenerated extends AbstractScriptCo
|
||||
runTest("idea/testData/script/definition/completion/conflictingModule/");
|
||||
}
|
||||
|
||||
@TestMetadata("conflictingModuleCustomDef")
|
||||
public void testConflictingModuleCustomDef() throws Exception {
|
||||
runTest("idea/testData/script/definition/completion/conflictingModuleCustomDef/");
|
||||
}
|
||||
|
||||
@TestMetadata("conflictingModuleJavaLib")
|
||||
public void testConflictingModuleJavaLib() throws Exception {
|
||||
runTest("idea/testData/script/definition/completion/conflictingModuleJavaLib/");
|
||||
|
||||
Reference in New Issue
Block a user