org.jetbrains.kotlin.fir.resolve.transformers.TransformUtils.kt Maven / Gradle / Ivy
/*
* 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.resolve.transformers
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.declarations.FirTypedDeclaration
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.visitors.*
internal object StoreType : FirDefaultTransformer() {
override fun transformElement(element: E, data: FirTypeRef): CompositeTransformResult {
return element.compose()
}
override fun transformTypeRef(typeRef: FirTypeRef, data: FirTypeRef): CompositeTransformResult {
return data.compose()
}
}
internal object TransformImplicitType : FirDefaultTransformer() {
override fun transformElement(element: E, data: FirTypeRef): CompositeTransformResult {
return element.compose()
}
override fun transformImplicitTypeRef(
implicitTypeRef: FirImplicitTypeRef,
data: FirTypeRef
): CompositeTransformResult {
return data.compose()
}
}
internal object StoreNameReference : FirDefaultTransformer() {
override fun transformElement(element: E, data: FirNamedReference): CompositeTransformResult {
return element.compose()
}
override fun transformNamedReference(
namedReference: FirNamedReference,
data: FirNamedReference
): CompositeTransformResult {
return data.compose()
}
override fun transformThisReference(thisReference: FirThisReference, data: FirNamedReference): CompositeTransformResult {
return data.compose()
}
override fun transformSuperReference(
superReference: FirSuperReference,
data: FirNamedReference
): CompositeTransformResult {
return data.compose()
}
}
internal object StoreCalleeReference : FirTransformer() {
override fun transformElement(element: E, data: FirNamedReference): CompositeTransformResult {
return element.compose()
}
override fun transformNamedReference(
namedReference: FirNamedReference,
data: FirNamedReference
): CompositeTransformResult {
return data.compose()
}
override fun transformResolvedNamedReference(
resolvedNamedReference: FirResolvedNamedReference,
data: FirNamedReference
): CompositeTransformResult {
return data.compose()
}
}
internal object StoreReceiver : FirTransformer() {
override fun transformElement(element: E, data: FirExpression): CompositeTransformResult {
@Suppress("UNCHECKED_CAST")
return (data as E).compose()
}
}
internal fun FirValueParameter.transformVarargTypeToArrayType() {
if (isVararg) {
this.transformTypeToArrayType()
}
}
internal fun FirTypedDeclaration.transformTypeToArrayType() {
val returnType = returnTypeRef.coneType
transformReturnTypeRef(
StoreType,
returnTypeRef.withReplacedConeType(
ConeKotlinTypeProjectionOut(returnType).createArrayType(),
FirFakeSourceElementKind.ArrayTypeFromVarargParameter
)
)
}
inline fun withScopeCleanup(scopes: MutableList<*>, crossinline l: () -> T): T {
val sizeBefore = scopes.size
return try {
l()
} finally {
val size = scopes.size
assert(size >= sizeBefore)
repeat(size - sizeBefore) {
scopes.let { it.removeAt(it.size - 1) }
}
}
}