[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:
+14
-48
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user