diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt index c4077364084..e43d42ad856 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/KotlinScriptResolveScopeProvider.kt @@ -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() != null -> null - scriptDefinition is ScriptDefinition.FromConfigurations || scriptDefinition.asLegacyOrNull() != 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() != null + ) { + return GlobalSearchScope.fileScope(project, file).union( + ScriptConfigurationManager.getInstance(project).getScriptDependenciesClassFilesScope(file) + ) } + + return null } } \ No newline at end of file diff --git a/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/lib/test/custom.kt b/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/lib/test/custom.kt new file mode 100644 index 00000000000..e98015f518f --- /dev/null +++ b/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/lib/test/custom.kt @@ -0,0 +1,7 @@ +package test + +object KObject { + fun foo() { + + } +} \ No newline at end of file diff --git a/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/script.kts b/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/script.kts new file mode 100644 index 00000000000..24fba76f883 --- /dev/null +++ b/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/script.kts @@ -0,0 +1,4 @@ +KObje + +// CONFLICTING_MODULE +// EXIST: KObject \ No newline at end of file diff --git a/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/template/template.kt b/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/template/template.kt new file mode 100644 index 00000000000..c3795ceb035 --- /dev/null +++ b/idea/testData/script/definition/completion/conflictingModuleCustomDef/mainModule/template/template.kt @@ -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) + +@Suppress("UNCHECKED_CAST") +object TemplateDefinition : ScriptCompilationConfiguration( + { + baseClass(Base::class) + ide { + acceptedLocations(ScriptAcceptedLocation.Everywhere) + } + } +) + +open class Base \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationCompletionTestGenerated.java index d45e967d5c4..549c852bc1f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationCompletionTestGenerated.java @@ -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/");