[K2] Use file name as one of parameters to extract evaluated const

It is not enough to store evaluated constants only by
<startOffset, endOffset> pair. We need to consider case there constant
can be located in different files with the same offset but with
different values.

#KT-57928 Fixed
#KT-57929 Fixed
This commit is contained in:
Ivan Kylchik
2023-04-11 12:56:59 +02:00
committed by Space Team
parent 8cc8e54a9f
commit c00c7ffbe0
13 changed files with 123 additions and 100 deletions
@@ -6,20 +6,12 @@
package org.jetbrains.kotlin.test.backend.handlers
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.codeMetaInfo.model.ParsedCodeMetaInfo
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.constant.ErrorValue
import org.jetbrains.kotlin.constant.EvaluatedConstTracker
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
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.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.ir.declarations.name
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.IGNORE_BACKEND_K2
import org.jetbrains.kotlin.test.model.*
@@ -44,7 +36,7 @@ interface IrInterpreterDumpHandler {
val evaluatedConstTracker = configuration.get(CommonConfigurationKeys.EVALUATED_CONST_TRACKER) ?: return
val irModule = testServices.dependencyProvider.getArtifact(module, BackendKinds.IrBackend).irModuleFragment
for ((irFile, testFile) in matchIrFileWithTestFile(irModule, module)) {
evaluatedConstTracker.processFile(testFile, irFile, testServices.defaultsProvider.defaultTargetBackend ?: module.targetBackend)
evaluatedConstTracker.processFile(testFile, irFile)
}
}
@@ -54,44 +46,18 @@ interface IrInterpreterDumpHandler {
return targetBackend in ignoredBackends || TargetBackend.ANY in ignoredBackends
}
private fun EvaluatedConstTracker.processFile(testFile: TestFile, irFile: IrFile, targetBackend: TargetBackend?) {
irFile.accept(object : IrElementVisitorVoid {
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
}
override fun visitDeclaration(declaration: IrDeclarationBase) {
if (declaration.origin == JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_OR_TYPEALIAS_ANNOTATIONS) return
visitAnnotations(declaration)
super.visitDeclaration(declaration)
}
// TODO can be dropped if we are going to draw one info per line segment
override fun visitField(declaration: IrField) {
if (targetBackend == TargetBackend.JVM_IR) {
declaration.correspondingPropertySymbol?.owner?.let { visitAnnotations(it) }
}
super.visitField(declaration)
}
private fun visitAnnotations(annotationContainer: IrAnnotationContainer) {
annotationContainer.annotations.forEach { annotation ->
annotation.acceptVoid(this)
}
}
override fun visitConst(expression: IrConst<*>) {
val constantValue = this@processFile.load(expression.startOffset, expression.endOffset) ?: return
val message = constantValue.stringTemplateValue()
val metaInfo = ParsedCodeMetaInfo(
expression.startOffset, expression.endOffset,
attributes = mutableListOf(),
tag = if (constantValue is ErrorValue) "WAS_NOT_EVALUATED" else "EVALUATED",
description = StringUtil.escapeLineBreak(message)
)
globalMetadataInfoHandler.addMetadataInfosForFile(testFile, listOf(metaInfo))
}
}, null)
private fun EvaluatedConstTracker.processFile(testFile: TestFile, irFile: IrFile) {
this.load(irFile.name)?.forEach { (pair, constantValue) ->
val (start, end) = pair
val message = constantValue.stringTemplateValue()
val metaInfo = ParsedCodeMetaInfo(
start, end,
attributes = mutableListOf(),
tag = if (constantValue is ErrorValue) "WAS_NOT_EVALUATED" else "EVALUATED",
description = StringUtil.escapeLineBreak(message)
)
globalMetadataInfoHandler.addMetadataInfosForFile(testFile, listOf(metaInfo))
}
}
}