Completion for script inside module should provide classes from related module

^KT-35825 Fixed
This commit is contained in:
Natalia Selezneva
2020-05-18 20:49:35 +03:00
parent 65d3ae6253
commit dd20b9062a
5 changed files with 57 additions and 12 deletions
@@ -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
}
}
@@ -0,0 +1,7 @@
package test
object KObject {
fun foo() {
}
}
@@ -0,0 +1,4 @@
KObje<caret>
// CONFLICTING_MODULE
// EXIST: KObject
@@ -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
@@ -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/");