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.ResolveScopeProvider
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
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.ScriptConfigurationManager
|
||||||
import org.jetbrains.kotlin.idea.core.script.StandardIdeScriptDefinition
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||||
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
|
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
|
||||||
@@ -39,17 +40,22 @@ class KotlinScriptResolveScopeProvider : ResolveScopeProvider() {
|
|||||||
if (file.fileType != KotlinFileType.INSTANCE) return null
|
if (file.fileType != KotlinFileType.INSTANCE) return null
|
||||||
|
|
||||||
val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return null
|
val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return null
|
||||||
val scriptDefinition = ktFile.findScriptDefinition()
|
val scriptDefinition = ktFile.findScriptDefinition() ?: return null
|
||||||
return when {
|
|
||||||
scriptDefinition == null -> null
|
// This is a workaround for completion in scripts inside module and REPL to provide module dependencies
|
||||||
// This is a workaround for completion in scripts and REPL to provide module dependencies
|
if (ktFile.getModuleInfo() !is ScriptModuleInfo) return null
|
||||||
scriptDefinition.baseClassType.fromClass == Any::class -> null
|
|
||||||
scriptDefinition.asLegacyOrNull<StandardIdeScriptDefinition>() != null -> null
|
// This is a workaround for completion in REPL to provide module dependencies
|
||||||
scriptDefinition is ScriptDefinition.FromConfigurations || scriptDefinition.asLegacyOrNull<KotlinScriptDefinitionFromAnnotatedTemplate>() != null -> {
|
if (scriptDefinition.baseClassType.fromClass == Any::class) return null
|
||||||
GlobalSearchScope.fileScope(project, file)
|
|
||||||
.union(ScriptConfigurationManager.getInstance(project).getScriptDependenciesClassFilesScope(file))
|
if (scriptDefinition is ScriptDefinition.FromConfigurations ||
|
||||||
}
|
scriptDefinition.asLegacyOrNull<KotlinScriptDefinitionFromAnnotatedTemplate>() != null
|
||||||
else -> 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/");
|
runTest("idea/testData/script/definition/completion/conflictingModule/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("conflictingModuleCustomDef")
|
||||||
|
public void testConflictingModuleCustomDef() throws Exception {
|
||||||
|
runTest("idea/testData/script/definition/completion/conflictingModuleCustomDef/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("conflictingModuleJavaLib")
|
@TestMetadata("conflictingModuleJavaLib")
|
||||||
public void testConflictingModuleJavaLib() throws Exception {
|
public void testConflictingModuleJavaLib() throws Exception {
|
||||||
runTest("idea/testData/script/definition/completion/conflictingModuleJavaLib/");
|
runTest("idea/testData/script/definition/completion/conflictingModuleJavaLib/");
|
||||||
|
|||||||
Reference in New Issue
Block a user