KT-56632 Script configuration isn't loaded for embedded code snippets
From now on we load script configurations for embedded Kotlin code snippets. Potentially this might lead to an extra load during a file analysis. IDEA side test for the change is here: `HighlightingTestGenerated.Uncategorized#testKotlinInJavaInjection` ^KT-56632 fixed
This commit is contained in:
committed by
Space Team
parent
3c35328c09
commit
661a2626f3
+15
-7
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.definitions
|
||||
|
||||
import com.intellij.ide.highlighter.JavaClassFileType
|
||||
import com.intellij.ide.highlighter.JavaFileType
|
||||
import com.intellij.injected.editor.VirtualFileWindow
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.fileTypes.FileTypeRegistry
|
||||
import com.intellij.openapi.project.Project
|
||||
@@ -61,19 +62,26 @@ fun VirtualFile.findScriptDefinition(project: Project): ScriptDefinition? {
|
||||
return findScriptDefinition(project, VirtualFileScriptSource(this))
|
||||
}
|
||||
|
||||
fun findScriptDefinition(project: Project, script: SourceCode): ScriptDefinition? {
|
||||
fun findScriptDefinition(project: Project, script: SourceCode): ScriptDefinition {
|
||||
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null
|
||||
?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.")
|
||||
|
||||
return scriptDefinitionProvider.findDefinition(script) ?: scriptDefinitionProvider.getDefaultDefinition()
|
||||
}
|
||||
|
||||
fun VirtualFile.isNonScript(): Boolean =
|
||||
isDirectory ||
|
||||
extension == KotlinFileType.EXTENSION ||
|
||||
extension == JavaFileType.INSTANCE.defaultExtension ||
|
||||
extension == JavaClassFileType.INSTANCE.defaultExtension ||
|
||||
!this.isKotlinFileType()
|
||||
fun VirtualFile.isNonScript(): Boolean = when (this) {
|
||||
is VirtualFileWindow -> {
|
||||
// This file is an embedded Kotlin code snippet.
|
||||
!this.isKotlinFileType()
|
||||
}
|
||||
else -> {
|
||||
isDirectory ||
|
||||
extension == KotlinFileType.EXTENSION ||
|
||||
extension == JavaFileType.INSTANCE.defaultExtension ||
|
||||
extension == JavaClassFileType.INSTANCE.defaultExtension ||
|
||||
!this.isKotlinFileType()
|
||||
}
|
||||
}
|
||||
|
||||
private fun VirtualFile.isKotlinFileType(): Boolean {
|
||||
if (extension == KotlinParserDefinition.STD_SCRIPT_SUFFIX) return true
|
||||
|
||||
-14
@@ -5,24 +5,10 @@
|
||||
|
||||
package org.jetbrains.kotlin.scripting.definitions
|
||||
|
||||
import com.intellij.psi.PsiFile
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult
|
||||
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
||||
import kotlin.script.experimental.api.ScriptDiagnostic
|
||||
import kotlin.script.experimental.api.valueOr
|
||||
|
||||
fun PsiFile.findScriptCompilationConfiguration(): ScriptCompilationConfiguration? {
|
||||
return if (isScript()) {
|
||||
val provider = ScriptDependenciesProvider.getInstance(project)
|
||||
// Ignoring the error here, assuming that it will be reported elsewhere anyway (this is important scenario in IDE)
|
||||
provider?.getScriptConfiguration(this)?.configuration
|
||||
?: findScriptDefinition()?.compilationConfiguration
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
private fun ScriptCompilationConfigurationResult.valueOrError() = valueOr { failure ->
|
||||
val singleCause = failure.reports.singleOrNull { it.severity == ScriptDiagnostic.Severity.ERROR }
|
||||
if (singleCause != null)
|
||||
|
||||
+7
-5
@@ -36,10 +36,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScopeImpl
|
||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
|
||||
import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScope
|
||||
import org.jetbrains.kotlin.resolve.source.toSourceElement
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptPriorities
|
||||
import org.jetbrains.kotlin.scripting.definitions.findScriptCompilationConfiguration
|
||||
import org.jetbrains.kotlin.scripting.definitions.*
|
||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
||||
@@ -121,7 +118,12 @@ class LazyScriptDescriptor(
|
||||
override fun getPriority() = priority
|
||||
|
||||
val scriptCompilationConfiguration: () -> ScriptCompilationConfiguration = resolveSession.storageManager.createLazyValue {
|
||||
scriptInfo.script.containingKtFile.findScriptCompilationConfiguration()
|
||||
run {
|
||||
val containingFile = scriptInfo.script.containingKtFile
|
||||
val provider = ScriptDependenciesProvider.getInstance(containingFile.project)
|
||||
provider?.getScriptConfiguration(containingFile)?.configuration
|
||||
?: containingFile.findScriptDefinition()?.compilationConfiguration
|
||||
}
|
||||
?: throw IllegalArgumentException("Unable to find script compilation configuration for the script ${scriptInfo.script.containingFile}")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user