IR: remove unused code, cleanup

This commit is contained in:
Alexander Udalov
2020-08-04 12:24:18 +02:00
parent b30b2e0179
commit e4cd7cdbcf
24 changed files with 90 additions and 670 deletions
@@ -28,8 +28,3 @@ fun <E> MutableList<E>.push(element: E) = this.add(element)
fun <E> MutableList<E>.pop() = this.removeAt(size - 1)
fun <E> MutableList<E>.peek(): E? = if (size == 0) null else this[size - 1]
fun <T: Any> T.onlyIf(condition: T.()->Boolean, then: (T)->Unit): T {
if (this.condition()) then(this)
return this
}
@@ -16,25 +16,16 @@
package org.jetbrains.kotlin.backend.common.descriptors
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.getFunctionalClassKind
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeProjectionImpl
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.replace
val String.synthesizedName: Name get() = Name.identifier(this.synthesizedString)
val String.synthesizedString: String get() = "\$$this"
val DeclarationDescriptor.propertyIfAccessor: DeclarationDescriptor
get() = if (this is PropertyAccessorDescriptor)
this.correspondingProperty
else this
val CallableDescriptor.isSuspend: Boolean
get() = this is FunctionDescriptor && isSuspend
@@ -69,20 +60,3 @@ val CallableDescriptor.explicitParameters: List<ParameterDescriptor>
return result
}
// Used in Kotlin/Native
@Suppress("unused")
fun FunctionDescriptor.substitute(vararg types: KotlinType): FunctionDescriptor {
val typeSubstitutor = TypeSubstitutor.create(
typeParameters
.withIndex()
.associateBy({ it.value.typeConstructor }, { TypeProjectionImpl(types[it.index]) })
)
return substitute(typeSubstitutor)!!
}
val KotlinType.isFunctionOrKFunctionType: Boolean
get() {
val kind = constructor.declarationDescriptor?.getFunctionalClassKind()
return kind == FunctionClassDescriptor.Kind.Function || kind == FunctionClassDescriptor.Kind.KFunction
}
@@ -6,15 +6,14 @@
package org.jetbrains.kotlin.backend.common.ir
import org.jetbrains.kotlin.backend.common.lower.VariableRemapper
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl
import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.util.isVararg
import org.jetbrains.kotlin.ir.util.statements
@@ -45,12 +44,6 @@ private fun createParameterMapping(source: IrFunction, target: IrFunction): Map<
return sourceParameters.zip(targetParameters).toMap()
}
fun IrFunction.copyBodyTo(target: IrFunction): IrBody? =
copyBodyTo(target, createParameterMapping(this, target))
fun IrFunction.copyBodyTo(target: IrFunction, arguments: Map<IrValueParameter, IrValueDeclaration>): IrBody? =
body?.deepCopyWithSymbols(target)?.move(this, target, target.symbol, arguments)
fun IrFunction.moveBodyTo(target: IrFunction): IrBody? =
moveBodyTo(target, createParameterMapping(this, target))
@@ -40,7 +40,7 @@ import java.io.StringWriter
fun ir2string(ir: IrElement?): String = ir?.render() ?: ""
// NB: this function is used in native
@Suppress("unused") // Used in kotlin-native
fun ir2stringWhole(ir: IrElement?): String {
val strWriter = StringWriter()
ir?.accept(DumpIrTreeVisitor(strWriter), "")
@@ -107,15 +107,6 @@ fun IrReturnTarget.returnType(context: CommonBackendContext) =
val IrClass.isFinalClass: Boolean
get() = modality == Modality.FINAL && kind != ClassKind.ENUM_CLASS
// For an annotation, get the annotation class.
fun IrCall.getAnnotationClass(): IrClass {
val callable = symbol.owner
assert(callable is IrConstructor) { "Constructor call expected, got ${ir2string(this)}" }
val annotationClass = callable.parentAsClass
assert(annotationClass.isAnnotationClass) { "Annotation class expected, got ${ir2string(annotationClass)}" }
return annotationClass
}
val IrTypeParametersContainer.classIfConstructor get() = if (this is IrConstructor) parentAsClass else this
@OptIn(ObsoleteDescriptorBasedAPI::class)
@@ -348,10 +339,6 @@ fun IrDeclarationContainer.addChild(declaration: IrDeclaration) {
declaration.setDeclarationsParent(this)
}
fun IrDeclarationContainer.addChildren(declarations: List<IrDeclaration>) {
declarations.forEach { this.addChild(it) }
}
fun <T : IrElement> T.setDeclarationsParent(parent: IrDeclarationParent): T {
accept(SetDeclarationsParentVisitor, parent)
return this
@@ -15,6 +15,7 @@ val IrDeclaration.isExpect
// The original isExpect represents what user has written.
// This predicate means "there can possibly exist an 'actual' for the given declaration".
// Shouldn't it be incorporated to descriptor -> ir declaration psi2ir translation phase?
@Suppress("unused")
val IrDeclaration.isProperExpect: Boolean
get() = this is IrClass && isExpect ||
this is IrFunction && isExpect ||
@@ -242,7 +242,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
val klass = function.parentAsClass
return when {
!klass.isInline -> expression
function.isPrimary -> irConstructorCall(expression, function)
function.isPrimary -> irConstructorCall(expression, function.symbol)
else -> irCall(expression, getOrCreateStaticMethod(function))
}
}
@@ -8,7 +8,10 @@ package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES
import org.jetbrains.kotlin.builtins.UnsignedTypes
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
@@ -18,7 +21,6 @@ import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.DFS
import org.jetbrains.kotlin.ir.types.isNullable as irTreeTypeUtils_isNullable
val kotlinPackageFqn = FqName.fromSegments(listOf("kotlin"))
private val kotlinReflectionPackageFqn = kotlinPackageFqn.child(Name.identifier("reflect"))
@@ -31,7 +33,6 @@ fun IrType.isKSuspendFunction(): Boolean = classifierOrNull?.isClassWithNamePref
fun IrClassifierSymbol.isFunction(): Boolean = this.isClassWithNamePrefix("Function", kotlinPackageFqn)
fun IrClassifierSymbol.isKFunction(): Boolean = this.isClassWithNamePrefix("KFunction", kotlinReflectionPackageFqn)
fun IrClassifierSymbol.isSuspendFunction(): Boolean = this.isClassWithNamePrefix("SuspendFunction", kotlinCoroutinesPackageFqn)
fun IrClassifierSymbol.isKSuspendFunction(): Boolean = this.isClassWithNamePrefix("KSuspendFunction", kotlinReflectionPackageFqn)
private fun IrClassifierSymbol.isClassWithNamePrefix(prefix: String, packageFqName: FqName): Boolean {
@@ -56,19 +57,8 @@ fun IrType.isFunctionOrKFunction() = isFunction() || isKFunction()
fun IrType.isSuspendFunctionOrKFunction() = isSuspendFunction() || isKSuspendFunction()
@Deprecated(
"Use org.jetbrains.kotlin.ir.types.isNullable instead.",
ReplaceWith("this.isNullable()", "org.jetbrains.kotlin.ir.types.isNullable")
)
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
@kotlin.internal.LowPriorityInOverloadResolution
fun IrType.isNullable(): Boolean = this.irTreeTypeUtils_isNullable()
fun IrType.isThrowable(): Boolean = isTypeFromKotlinPackage { name -> name.asString() == "Throwable" }
fun IrType.isThrowableTypeOrSubtype(): Boolean = DFS.ifAny(listOf(this), IrType::superTypes, IrType::isThrowable)
fun IrType.isUnsigned(): Boolean = isTypeFromKotlinPackage { name -> UnsignedTypes.isShortNameOfUnsignedType(name) }
private inline fun IrType.isTypeFromKotlinPackage(namePredicate: (Name) -> Boolean): Boolean {