From 97e320b57f15c6b8e6c5e835127bfd423c22a3b9 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 27 Feb 2020 17:36:00 +0300 Subject: [PATCH] Don't show IR_COMPILED_CLASS error in IJ when it arises in module with backend IR enabled The problem here is that library resolver uses global project compiler settings instead of the module ones. That behaviour is caused by more global problem described in #KT-21246 As a temporary solution we just do not show IR_COMPILED_CLASS error in IDE if it arises in a module which have -XuseIR or -Xallow-jvm-ir-dependencies option provided #KT-36907 fixed --- .../idea/highlighter/KotlinPsiChecker.kt | 15 +++++++++++++++ .../kotlin/config/KotlinFacetSettings.kt | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt index 0404143e6cd..d098e0a51af 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt @@ -30,6 +30,8 @@ import com.intellij.psi.MultiRangeReference import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.util.containers.MultiMap +import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments +import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory @@ -41,10 +43,12 @@ import org.jetbrains.kotlin.idea.fir.firResolveState import org.jetbrains.kotlin.idea.fir.getOrBuildFirWithDiagnostics import org.jetbrains.kotlin.idea.quickfix.QuickFixes import org.jetbrains.kotlin.idea.references.mainReference +import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.utils.addToStdlib.safeAs import java.lang.reflect.* import java.util.* @@ -236,6 +240,9 @@ private class ElementAnnotator( val diagnostic = diagnostics.first() val factory = diagnostic.factory + // hack till the root cause #KT-21246 is fixed + if (isIrCompileClassDiagnosticForModulesWithEnabledIR(diagnostic)) return + assert(diagnostics.all { it.psiElement == element && it.factory == factory }) val ranges = diagnostic.textRanges @@ -314,6 +321,14 @@ private class ElementAnnotator( data.processDiagnostics(holder, diagnostics, fixesMap) } + private fun isIrCompileClassDiagnosticForModulesWithEnabledIR(diagnostic: Diagnostic): Boolean { + if (diagnostic.factory != Errors.IR_COMPILED_CLASS) return false + val module = element.module ?: return false + val moduleFacetSettings = KotlinFacetSettingsProvider.getInstance(element.project)?.getSettings(module) ?: return false + return moduleFacetSettings.isCompilerSettingPresent(K2JVMCompilerArguments::useIR) + || moduleFacetSettings.isCompilerSettingPresent(K2JVMCompilerArguments::allowJvmIrDependencies) + } + companion object { val LOG = Logger.getInstance(ElementAnnotator::class.java) } diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt index 93df5bc43ad..c11fbd99dfa 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.config import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.cli.common.arguments.Argument import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.copyBean import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments @@ -18,6 +19,9 @@ import org.jetbrains.kotlin.platform.compat.toIdePlatform import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.utils.DescriptionAware +import org.jetbrains.kotlin.utils.addToStdlib.safeAs +import kotlin.reflect.KProperty1 +import kotlin.reflect.full.findAnnotation @Deprecated("Use IdePlatformKind instead.", level = DeprecationLevel.ERROR) sealed class TargetPlatformKind( @@ -188,6 +192,20 @@ class KotlinFacetSettings { updateMergedArguments() } + /* + This function is needed as some setting values may not be present in compilerArguments + but present in additional arguments instead, so we have to check both cases manually + */ + inline fun isCompilerSettingPresent(settingReference: KProperty1): Boolean { + val isEnabledByCompilerArgument = compilerArguments?.safeAs()?.let(settingReference::get) + if (isEnabledByCompilerArgument == true) return true + val isEnabledByAdditionalSettings = run { + val stringArgumentName = settingReference.findAnnotation()?.value ?: return@run null + compilerSettings?.additionalArguments?.contains(stringArgumentName, ignoreCase = true) + } + return isEnabledByAdditionalSettings ?: false + } + var languageLevel: LanguageVersion? get() = compilerArguments?.languageVersion?.let { LanguageVersion.fromFullVersionString(it) } set(value) {