[K2] Save inlined java field into special InlineConstTracker
This commit is contained in:
@@ -209,6 +209,7 @@ fun transformFirToIr(
|
||||
linkViaSignatures = false,
|
||||
evaluatedConstTracker = moduleStructure.compilerConfiguration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = null,
|
||||
),
|
||||
IrGenerationExtension.getInstances(moduleStructure.project),
|
||||
signatureComposer = DescriptorSignatureComposerStub(JsManglerDesc),
|
||||
|
||||
+1
@@ -159,6 +159,7 @@ object FirKotlinToJvmBytecodeCompiler {
|
||||
linkViaSignatures = moduleConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
|
||||
evaluatedConstTracker = moduleConfiguration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = moduleConfiguration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
|
||||
)
|
||||
val fir2IrAndIrActualizerResult = firResult.convertToIrAndActualizeForJvm(
|
||||
fir2IrExtensions,
|
||||
|
||||
@@ -179,6 +179,7 @@ fun convertAnalyzedFirToIr(
|
||||
linkViaSignatures = input.configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
|
||||
evaluatedConstTracker = input.configuration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = input.configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
|
||||
)
|
||||
val (irModuleFragment, components, pluginContext, irActualizedResult) =
|
||||
analysisResults.convertToIrAndActualizeForJvm(
|
||||
|
||||
@@ -18,9 +18,11 @@ package org.jetbrains.kotlin.fir.backend
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
|
||||
data class Fir2IrConfiguration(
|
||||
val languageVersionSettings: LanguageVersionSettings,
|
||||
val linkViaSignatures: Boolean,
|
||||
val evaluatedConstTracker: EvaluatedConstTracker,
|
||||
val inlineConstTracker: InlineConstTracker?,
|
||||
)
|
||||
|
||||
@@ -431,7 +431,12 @@ class Fir2IrConverter(
|
||||
val interpreter = IrInterpreter(IrInterpreterEnvironment(irModuleFragment.irBuiltins, configuration))
|
||||
val mode = if (intrinsicConstEvaluation) EvaluationMode.ONLY_INTRINSIC_CONST else EvaluationMode.ONLY_BUILTINS
|
||||
irModuleFragment.files.forEach {
|
||||
it.transformConst(interpreter, mode = mode, evaluatedConstTracker = fir2IrConfiguration.evaluatedConstTracker)
|
||||
it.transformConst(
|
||||
interpreter,
|
||||
mode = mode,
|
||||
evaluatedConstTracker = fir2IrConfiguration.evaluatedConstTracker,
|
||||
inlineConstTracker = fir2IrConfiguration.inlineConstTracker,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -277,6 +277,7 @@ open class IncrementalFirJvmCompilerRunner(
|
||||
linkViaSignatures = false,
|
||||
evaluatedConstTracker = configuration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
|
||||
)
|
||||
val irGenerationExtensions =
|
||||
(projectEnvironment as? VfsBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) }.orEmpty()
|
||||
|
||||
+5
-1
@@ -26,10 +26,14 @@ class ConstEvaluationLowering(
|
||||
) : FileLoweringPass {
|
||||
private val interpreter = IrInterpreter(IrInterpreterEnvironment(context.irBuiltIns, configuration), emptyMap())
|
||||
private val evaluatedConstTracker = context.configuration[CommonConfigurationKeys.EVALUATED_CONST_TRACKER]
|
||||
private val inlineConstTracker = context.configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER]
|
||||
|
||||
override fun lower(irFile: IrFile) {
|
||||
irFile.transformConst(
|
||||
interpreter, mode = EvaluationMode.ONLY_INTRINSIC_CONST, evaluatedConstTracker, onWarning, onError, suppressErrors
|
||||
interpreter,
|
||||
mode = EvaluationMode.ONLY_INTRINSIC_CONST,
|
||||
evaluatedConstTracker, inlineConstTracker,
|
||||
onWarning, onError, suppressErrors
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+5
-13
@@ -12,10 +12,10 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.ir.constantValue
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.util.classId
|
||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
||||
import org.jetbrains.kotlin.ir.interpreter.transformer.reportOnIr
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
|
||||
internal val constPhase1 = makeIrFilePhase(
|
||||
@@ -40,14 +40,6 @@ class ConstLowering(val context: JvmBackendContext) : FileLoweringPass {
|
||||
private class JvmInlineConstTransformer(val irFile: IrFile, val inlineConstTracker: InlineConstTracker?) : InlineConstTransformer() {
|
||||
override val IrField.constantInitializer get() = constantValue()
|
||||
override fun reportInlineConst(field: IrField, value: IrConst<*>) {
|
||||
if (inlineConstTracker == null) return
|
||||
if (field.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) return
|
||||
|
||||
val path = irFile.path
|
||||
val owner = field.parentAsClass.classId?.asString()?.replace(".", "$")?.replace("/", ".") ?: return
|
||||
val name = field.name.asString()
|
||||
val constType = value.kind.asString
|
||||
|
||||
inlineConstTracker.report(path, owner, name, constType)
|
||||
inlineConstTracker?.reportOnIr(irFile, field, value)
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.ir.interpreter.transformer
|
||||
|
||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
@@ -25,10 +26,11 @@ internal abstract class IrConstAnnotationTransformer(
|
||||
mode: EvaluationMode,
|
||||
checker: IrInterpreterChecker,
|
||||
evaluatedConstTracker: EvaluatedConstTracker?,
|
||||
inlineConstTracker: InlineConstTracker?,
|
||||
onWarning: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
onError: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
suppressExceptions: Boolean,
|
||||
) : IrConstTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, onWarning, onError, suppressExceptions) {
|
||||
) : IrConstTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions) {
|
||||
protected fun transformAnnotations(annotationContainer: IrAnnotationContainer) {
|
||||
annotationContainer.annotations.forEach { annotation ->
|
||||
transformAnnotation(annotation)
|
||||
|
||||
+3
-4
@@ -6,17 +6,15 @@
|
||||
package org.jetbrains.kotlin.ir.interpreter.transformer
|
||||
|
||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.expressions.IrErrorExpression
|
||||
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
|
||||
import org.jetbrains.kotlin.ir.interpreter.checker.EvaluationMode
|
||||
import org.jetbrains.kotlin.ir.interpreter.checker.IrInterpreterChecker
|
||||
import org.jetbrains.kotlin.ir.util.primaryConstructor
|
||||
|
||||
internal class IrConstDeclarationAnnotationTransformer(
|
||||
interpreter: IrInterpreter,
|
||||
@@ -24,10 +22,11 @@ internal class IrConstDeclarationAnnotationTransformer(
|
||||
mode: EvaluationMode,
|
||||
checker: IrInterpreterChecker,
|
||||
evaluatedConstTracker: EvaluatedConstTracker?,
|
||||
inlineConstTracker: InlineConstTracker?,
|
||||
onWarning: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
onError: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
suppressExceptions: Boolean,
|
||||
) : IrConstAnnotationTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, onWarning, onError, suppressExceptions) {
|
||||
) : IrConstAnnotationTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions) {
|
||||
override fun visitFile(declaration: IrFile, data: Nothing?): IrFile {
|
||||
transformAnnotations(declaration)
|
||||
return super.visitFile(declaration, data)
|
||||
|
||||
+3
-1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.interpreter.transformer
|
||||
|
||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
@@ -26,10 +27,11 @@ internal class IrConstExpressionTransformer(
|
||||
mode: EvaluationMode,
|
||||
checker: IrInterpreterChecker,
|
||||
evaluatedConstTracker: EvaluatedConstTracker?,
|
||||
inlineConstTracker: InlineConstTracker?,
|
||||
onWarning: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
onError: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
suppressExceptions: Boolean,
|
||||
) : IrConstTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, onWarning, onError, suppressExceptions) {
|
||||
) : IrConstTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions) {
|
||||
private var inAnnotation: Boolean = false
|
||||
|
||||
private inline fun <T> visitAnnotationClass(crossinline block: () -> T): T {
|
||||
|
||||
+34
-9
@@ -7,26 +7,28 @@ package org.jetbrains.kotlin.ir.interpreter.transformer
|
||||
|
||||
import org.jetbrains.kotlin.constant.ErrorValue
|
||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.declarations.nameWithPackage
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConst
|
||||
import org.jetbrains.kotlin.ir.expressions.IrErrorExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
|
||||
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
|
||||
import org.jetbrains.kotlin.ir.interpreter.IrInterpreterConfiguration
|
||||
import org.jetbrains.kotlin.ir.interpreter.checker.*
|
||||
import org.jetbrains.kotlin.ir.interpreter.preprocessor.IrInterpreterKCallableNamePreprocessor
|
||||
import org.jetbrains.kotlin.ir.interpreter.preprocessor.IrInterpreterPreprocessorData
|
||||
import org.jetbrains.kotlin.ir.interpreter.property
|
||||
import org.jetbrains.kotlin.ir.interpreter.toConstantValue
|
||||
import org.jetbrains.kotlin.ir.util.classId
|
||||
import org.jetbrains.kotlin.ir.util.dump
|
||||
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
|
||||
fun IrFile.transformConst(
|
||||
interpreter: IrInterpreter,
|
||||
mode: EvaluationMode,
|
||||
evaluatedConstTracker: EvaluatedConstTracker? = null,
|
||||
inlineConstTracker: InlineConstTracker? = null,
|
||||
onWarning: (IrFile, IrElement, IrErrorExpression) -> Unit = { _, _, _ -> },
|
||||
onError: (IrFile, IrElement, IrErrorExpression) -> Unit = { _, _, _ -> },
|
||||
suppressExceptions: Boolean = false,
|
||||
@@ -43,13 +45,13 @@ fun IrFile.transformConst(
|
||||
|
||||
checkers.fold(preprocessedFile) { file, checker ->
|
||||
val irConstExpressionTransformer = IrConstExpressionTransformer(
|
||||
interpreter, file, mode, checker, evaluatedConstTracker, onWarning, onError, suppressExceptions
|
||||
interpreter, file, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions
|
||||
)
|
||||
val irConstDeclarationAnnotationTransformer = IrConstDeclarationAnnotationTransformer(
|
||||
interpreter, file, mode, checker, evaluatedConstTracker, onWarning, onError, suppressExceptions
|
||||
interpreter, file, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions
|
||||
)
|
||||
val irConstTypeAnnotationTransformer = IrConstTypeAnnotationTransformer(
|
||||
interpreter, file, mode, checker, evaluatedConstTracker, onWarning, onError, suppressExceptions
|
||||
interpreter, file, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions
|
||||
)
|
||||
file.transform(irConstExpressionTransformer, null)
|
||||
file.transform(irConstDeclarationAnnotationTransformer, null)
|
||||
@@ -64,7 +66,8 @@ internal abstract class IrConstTransformer(
|
||||
private val irFile: IrFile,
|
||||
private val mode: EvaluationMode,
|
||||
private val checker: IrInterpreterChecker,
|
||||
private val evaluatedConstTracker: EvaluatedConstTracker? = null,
|
||||
private val evaluatedConstTracker: EvaluatedConstTracker?,
|
||||
private val inlineConstTracker: InlineConstTracker?,
|
||||
private val onWarning: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
private val onError: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
private val suppressExceptions: Boolean,
|
||||
@@ -117,6 +120,28 @@ internal abstract class IrConstTransformer(
|
||||
constant = if (result is IrErrorExpression) ErrorValue.create(result.description)
|
||||
else (result as IrConst<*>).toConstantValue()
|
||||
)
|
||||
|
||||
if (result is IrConst<*>) {
|
||||
val field = when (this) {
|
||||
is IrGetField -> this.symbol.owner
|
||||
is IrCall -> this.symbol.owner.property?.backingField
|
||||
else -> null
|
||||
}
|
||||
|
||||
if (field != null) inlineConstTracker?.reportOnIr(irFile, field, result)
|
||||
}
|
||||
|
||||
return if (failAsError) result.reportIfError(this) else result.warningIfError(this)
|
||||
}
|
||||
}
|
||||
|
||||
fun InlineConstTracker.reportOnIr(irFile: IrFile, field: IrField, value: IrConst<*>) {
|
||||
if (field.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) return
|
||||
|
||||
val path = irFile.path
|
||||
val owner = field.parentAsClass.classId?.asString()?.replace(".", "$")?.replace("/", ".") ?: return
|
||||
val name = field.name.asString()
|
||||
val constType = value.kind.asString
|
||||
|
||||
report(path, owner, name, constType)
|
||||
}
|
||||
|
||||
+3
-1
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.ir.interpreter.transformer
|
||||
|
||||
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
|
||||
import org.jetbrains.kotlin.incremental.components.InlineConstTracker
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.expressions.IrErrorExpression
|
||||
@@ -23,10 +24,11 @@ internal class IrConstTypeAnnotationTransformer(
|
||||
mode: EvaluationMode,
|
||||
checker: IrInterpreterChecker,
|
||||
evaluatedConstTracker: EvaluatedConstTracker?,
|
||||
inlineConstTracker: InlineConstTracker?,
|
||||
onWarning: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
onError: (IrFile, IrElement, IrErrorExpression) -> Unit,
|
||||
suppressExceptions: Boolean,
|
||||
) : IrConstAnnotationTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, onWarning, onError, suppressExceptions),
|
||||
) : IrConstAnnotationTransformer(interpreter, irFile, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions),
|
||||
IrTypeTransformerVoid<Nothing?> {
|
||||
|
||||
override fun <Type : IrType?> transformType(container: IrElement, type: Type, data: Nothing?): Type {
|
||||
|
||||
+1
@@ -175,6 +175,7 @@ fun AbstractFirAnalyzerFacade.convertToJsIr(
|
||||
linkViaSignatures = generateSignatures,
|
||||
evaluatedConstTracker = configuration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = null,
|
||||
)
|
||||
return Fir2IrConverter.createModuleFragmentWithSignaturesIfNeeded(
|
||||
session, scopeSession, firFiles.toList(),
|
||||
|
||||
+1
@@ -302,6 +302,7 @@ open class FirFrontendFacade(
|
||||
linkViaSignatures = compilerConfiguration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
|
||||
evaluatedConstTracker = compilerConfiguration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = compilerConfiguration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
|
||||
),
|
||||
ktFiles,
|
||||
lightTreeFiles,
|
||||
|
||||
@@ -127,6 +127,7 @@ object GenerationUtils {
|
||||
linkViaSignatures = configuration.getBoolean(JVMConfigurationKeys.LINK_VIA_SIGNATURES),
|
||||
evaluatedConstTracker = configuration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = configuration[CommonConfigurationKeys.INLINE_CONST_TRACKER],
|
||||
),
|
||||
files,
|
||||
emptyList(),
|
||||
|
||||
+1
@@ -80,6 +80,7 @@ internal fun PhaseContext.fir2Ir(
|
||||
linkViaSignatures = false,
|
||||
evaluatedConstTracker = configuration
|
||||
.putIfAbsent(CommonConfigurationKeys.EVALUATED_CONST_TRACKER, EvaluatedConstTracker.create()),
|
||||
inlineConstTracker = null,
|
||||
),
|
||||
IrGenerationExtension.getInstances(config.project),
|
||||
signatureComposer = DescriptorSignatureComposerStub(KonanManglerDesc),
|
||||
|
||||
Reference in New Issue
Block a user