All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.fir.serialization.constant.ConstantValueUtils.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-RC
Show newest version
/*
 * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
 * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
 */

package org.jetbrains.kotlin.fir.serialization.constant

import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.constant.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.declarations.itOrExpectHasDefaultParameterValue
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.languageVersionSettings
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.runIf

internal fun Map.convertToConstantValues(
    session: FirSession,
    constValueProvider: ConstValueProvider?
): MutableMap> {
    return this.mapValuesTo(mutableMapOf()) { (_, firExpression) ->
        constValueProvider?.findConstantValueFor(firExpression)
            ?: firExpression.toConstantValue(session, constValueProvider)
            ?: runIf(session.languageVersionSettings.getFlag(AnalysisFlags.metadataCompilation)) {
                ErrorValue.ErrorValueWithMessage("Constant conversion can be ignored in metadata compilation mode")
            }
            ?: error("Cannot convert expression ${firExpression.render()} to constant")
    }
}

internal fun MutableMap>.addEmptyVarargValuesFor(
    symbol: FirFunctionSymbol<*>?,
): MutableMap> = apply {
    if (symbol == null) return@apply
    for ((i, parameter) in symbol.valueParameterSymbols.withIndex()) {
        if (parameter.name !in this && parameter.isVararg && !symbol.fir.itOrExpectHasDefaultParameterValue(i)) {
            this[parameter.name] = ArrayValue(emptyList())
        }
    }
}

internal fun LinkedHashMap.convertToConstantValues(
    session: FirSession,
    constValueProvider: ConstValueProvider?,
): MutableMap> {
    return this.entries.associate { (firExpression, firValueParameter) -> firValueParameter.name to firExpression }
        .convertToConstantValues(session, constValueProvider)
}

inline fun  AnnotationValue.coneTypeSafe(): T? {
    return this.value.type as? T
}

inline fun  KClassValue.Value.LocalClass.coneType(): T {
    return this.type as T
}

internal fun create(argumentType: ConeKotlinType): ConstantValue<*>? {
    if (argumentType is ConeErrorType) return null
    if (argumentType !is ConeClassLikeType) return null
    var type = argumentType
    var arrayDimensions = 0
    while (true) {
        if (type.isPrimitiveArray) break
        type = type.arrayElementType() ?: break
        arrayDimensions++
    }
    val classId = type.classId ?: return null
    return KClassValue(classId, arrayDimensions)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy