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>.pop() = this.removeAt(size - 1)
fun <E> MutableList<E>.peek(): E? = if (size == 0) null else this[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 package org.jetbrains.kotlin.backend.common.descriptors
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.builtins.getFunctionalClassKind import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.descriptors.ParameterDescriptor
import org.jetbrains.kotlin.name.Name 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.synthesizedName: Name get() = Name.identifier(this.synthesizedString)
val String.synthesizedString: String get() = "\$$this" val String.synthesizedString: String get() = "\$$this"
val DeclarationDescriptor.propertyIfAccessor: DeclarationDescriptor
get() = if (this is PropertyAccessorDescriptor)
this.correspondingProperty
else this
val CallableDescriptor.isSuspend: Boolean val CallableDescriptor.isSuspend: Boolean
get() = this is FunctionDescriptor && isSuspend get() = this is FunctionDescriptor && isSuspend
@@ -69,20 +60,3 @@ val CallableDescriptor.explicitParameters: List<ParameterDescriptor>
return result 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 package org.jetbrains.kotlin.backend.common.ir
import org.jetbrains.kotlin.backend.common.lower.VariableRemapper 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.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl
import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl 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.isVararg
import org.jetbrains.kotlin.ir.util.statements import org.jetbrains.kotlin.ir.util.statements
@@ -45,12 +44,6 @@ private fun createParameterMapping(source: IrFunction, target: IrFunction): Map<
return sourceParameters.zip(targetParameters).toMap() 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? = fun IrFunction.moveBodyTo(target: IrFunction): IrBody? =
moveBodyTo(target, createParameterMapping(this, target)) moveBodyTo(target, createParameterMapping(this, target))
@@ -40,7 +40,7 @@ import java.io.StringWriter
fun ir2string(ir: IrElement?): String = ir?.render() ?: "" 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 { fun ir2stringWhole(ir: IrElement?): String {
val strWriter = StringWriter() val strWriter = StringWriter()
ir?.accept(DumpIrTreeVisitor(strWriter), "") ir?.accept(DumpIrTreeVisitor(strWriter), "")
@@ -107,15 +107,6 @@ fun IrReturnTarget.returnType(context: CommonBackendContext) =
val IrClass.isFinalClass: Boolean val IrClass.isFinalClass: Boolean
get() = modality == Modality.FINAL && kind != ClassKind.ENUM_CLASS 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 val IrTypeParametersContainer.classIfConstructor get() = if (this is IrConstructor) parentAsClass else this
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
@@ -348,10 +339,6 @@ fun IrDeclarationContainer.addChild(declaration: IrDeclaration) {
declaration.setDeclarationsParent(this) declaration.setDeclarationsParent(this)
} }
fun IrDeclarationContainer.addChildren(declarations: List<IrDeclaration>) {
declarations.forEach { this.addChild(it) }
}
fun <T : IrElement> T.setDeclarationsParent(parent: IrDeclarationParent): T { fun <T : IrElement> T.setDeclarationsParent(parent: IrDeclarationParent): T {
accept(SetDeclarationsParentVisitor, parent) accept(SetDeclarationsParentVisitor, parent)
return this return this
@@ -15,6 +15,7 @@ val IrDeclaration.isExpect
// The original isExpect represents what user has written. // The original isExpect represents what user has written.
// This predicate means "there can possibly exist an 'actual' for the given declaration". // 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? // Shouldn't it be incorporated to descriptor -> ir declaration psi2ir translation phase?
@Suppress("unused")
val IrDeclaration.isProperExpect: Boolean val IrDeclaration.isProperExpect: Boolean
get() = this is IrClass && isExpect || get() = this is IrClass && isExpect ||
this is IrFunction && isExpect || this is IrFunction && isExpect ||
@@ -242,7 +242,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
val klass = function.parentAsClass val klass = function.parentAsClass
return when { return when {
!klass.isInline -> expression !klass.isInline -> expression
function.isPrimary -> irConstructorCall(expression, function) function.isPrimary -> irConstructorCall(expression, function.symbol)
else -> irCall(expression, getOrCreateStaticMethod(function)) 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.KotlinBuiltIns.FQ_NAMES
import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.builtins.UnsignedTypes
import org.jetbrains.kotlin.descriptors.ClassKind 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.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.DFS
import org.jetbrains.kotlin.ir.types.isNullable as irTreeTypeUtils_isNullable
val kotlinPackageFqn = FqName.fromSegments(listOf("kotlin")) val kotlinPackageFqn = FqName.fromSegments(listOf("kotlin"))
private val kotlinReflectionPackageFqn = kotlinPackageFqn.child(Name.identifier("reflect")) 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.isFunction(): Boolean = this.isClassWithNamePrefix("Function", kotlinPackageFqn)
fun IrClassifierSymbol.isKFunction(): Boolean = this.isClassWithNamePrefix("KFunction", kotlinReflectionPackageFqn) fun IrClassifierSymbol.isKFunction(): Boolean = this.isClassWithNamePrefix("KFunction", kotlinReflectionPackageFqn)
fun IrClassifierSymbol.isSuspendFunction(): Boolean = this.isClassWithNamePrefix("SuspendFunction", kotlinCoroutinesPackageFqn)
fun IrClassifierSymbol.isKSuspendFunction(): Boolean = this.isClassWithNamePrefix("KSuspendFunction", kotlinReflectionPackageFqn) fun IrClassifierSymbol.isKSuspendFunction(): Boolean = this.isClassWithNamePrefix("KSuspendFunction", kotlinReflectionPackageFqn)
private fun IrClassifierSymbol.isClassWithNamePrefix(prefix: String, packageFqName: FqName): Boolean { private fun IrClassifierSymbol.isClassWithNamePrefix(prefix: String, packageFqName: FqName): Boolean {
@@ -56,19 +57,8 @@ fun IrType.isFunctionOrKFunction() = isFunction() || isKFunction()
fun IrType.isSuspendFunctionOrKFunction() = isSuspendFunction() || isKSuspendFunction() 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.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) } fun IrType.isUnsigned(): Boolean = isTypeFromKotlinPackage { name -> UnsignedTypes.isShortNameOfUnsignedType(name) }
private inline fun IrType.isTypeFromKotlinPackage(namePredicate: (Name) -> Boolean): Boolean { private inline fun IrType.isTypeFromKotlinPackage(namePredicate: (Name) -> Boolean): Boolean {
@@ -1,71 +0,0 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.PropertyGetterDescriptor
import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor
import org.jetbrains.kotlin.ir.descriptors.IrSyntheticPropertyAccessorDescriptor.Kind.MEMBER_PROPERTY
import org.jetbrains.kotlin.ir.descriptors.IrSyntheticPropertyAccessorDescriptor.Kind.STATIC_PROPERTY
import org.jetbrains.kotlin.ir.descriptors.IrSyntheticPropertyGetterDescriptorImpl
import org.jetbrains.kotlin.ir.descriptors.IrSyntheticPropertySetterDescriptorImpl
import java.lang.AssertionError
import java.util.*
class SyntheticDescriptorsFactory {
private val propertyGetters = HashMap<PropertyDescriptor, PropertyGetterDescriptor>()
private fun generateGetter(property: PropertyDescriptor): PropertyGetterDescriptor {
return when {
isStaticPropertyInClass(property) ->
IrSyntheticPropertyGetterDescriptorImpl(property, STATIC_PROPERTY)
isPropertyInClass(property) ->
IrSyntheticPropertyGetterDescriptorImpl(property, MEMBER_PROPERTY)
else ->
throw AssertionError("Don't know how to create synthetic getter for $property")
}
}
private val propertySetters = HashMap<PropertyDescriptor, PropertySetterDescriptor>()
private fun generateSetter(property: PropertyDescriptor): PropertySetterDescriptor {
return when {
isStaticPropertyInClass(property) ->
IrSyntheticPropertySetterDescriptorImpl(property, STATIC_PROPERTY)
isPropertyInClass(property) ->
IrSyntheticPropertySetterDescriptorImpl(property, MEMBER_PROPERTY)
else ->
throw AssertionError("Don't know how to create synthetic setter for $property")
}
}
private fun isStaticPropertyInClass(propertyDescriptor: PropertyDescriptor): Boolean =
propertyDescriptor.containingDeclaration is ClassDescriptor &&
propertyDescriptor.dispatchReceiverParameter == null &&
propertyDescriptor.extensionReceiverParameter == null
private fun isPropertyInClass(propertyDescriptor: PropertyDescriptor): Boolean =
propertyDescriptor.containingDeclaration is ClassDescriptor
fun getOrCreatePropertyGetter(propertyDescriptor: PropertyDescriptor): PropertyGetterDescriptor =
propertyGetters.getOrPut(propertyDescriptor) { generateGetter(propertyDescriptor) }
fun getOrCreatePropertySetter(propertyDescriptor: PropertyDescriptor): PropertySetterDescriptor =
propertySetters.getOrPut(propertyDescriptor) { generateSetter(propertyDescriptor) }
}
@@ -80,7 +80,7 @@ class IrBuiltIns(
val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor) val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor)
irFactory.createValueParameter( irFactory.createValueParameter(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, valueParameterSymbol, Name.identifier("arg$i"), i, UNDEFINED_OFFSET, UNDEFINED_OFFSET, BUILTIN_OPERATOR, valueParameterSymbol, Name.identifier("arg$i"), i,
valueParameterType, null, false, false valueParameterType, null, isCrossinline = false, isNoinline = false
).apply { ).apply {
parent = operator parent = operator
} }
@@ -120,7 +120,8 @@ class IrBuiltIns(
valueParameterDescriptor = ValueParameterDescriptorImpl( valueParameterDescriptor = ValueParameterDescriptorImpl(
this, null, 0, Annotations.EMPTY, Name.identifier("arg0"), valueKotlinType, this, null, 0, Annotations.EMPTY, Name.identifier("arg0"), valueKotlinType,
false, false, false, null, SourceElement.NO_SOURCE declaresDefaultValue = false, isCrossinline = false, isNoinline = false, varargElementType = null,
source = SourceElement.NO_SOURCE
) )
returnKotlinType = typeParameterDescriptor.typeConstructor.makeNonNullType() returnKotlinType = typeParameterDescriptor.typeConstructor.makeNonNullType()
@@ -184,7 +185,6 @@ class IrBuiltIns(
associate { it.classifierOrFail to defineComparisonOperator(name, it) } associate { it.classifierOrFail to defineComparisonOperator(name, it) }
val any = builtIns.anyType val any = builtIns.anyType
val anyN = builtIns.nullableAnyType
val anyType = any.toIrType() val anyType = any.toIrType()
val anyClass = builtIns.any.toIrSymbol() val anyClass = builtIns.any.toIrSymbol()
val anyNType = anyType.withHasQuestionMark(true) val anyNType = anyType.withHasQuestionMark(true)
@@ -226,7 +226,6 @@ class IrBuiltIns(
val doubleClass = builtIns.double.toIrSymbol() val doubleClass = builtIns.double.toIrSymbol()
val nothing = builtIns.nothingType val nothing = builtIns.nothingType
val nothingN = builtIns.nullableNothingType
val nothingType = nothing.toIrType() val nothingType = nothing.toIrType()
val nothingClass = builtIns.nothing.toIrSymbol() val nothingClass = builtIns.nothing.toIrSymbol()
val nothingNType = nothingType.withHasQuestionMark(true) val nothingNType = nothingType.withHasQuestionMark(true)
@@ -321,9 +320,6 @@ class IrBuiltIns(
fun function(n: Int): IrClassSymbol = functionFactory.functionN(n).symbol fun function(n: Int): IrClassSymbol = functionFactory.functionN(n).symbol
fun suspendFunction(n: Int): IrClassSymbol = functionFactory.suspendFunctionN(n).symbol fun suspendFunction(n: Int): IrClassSymbol = functionFactory.suspendFunctionN(n).symbol
fun kFunction(n: Int): IrClassSymbol = functionFactory.kFunctionN(n).symbol
fun kSuspendFunction(n: Int): IrClassSymbol = functionFactory.kSuspendFunctionN(n).symbol
companion object { companion object {
val KOTLIN_INTERNAL_IR_FQN = FqName("kotlin.internal.ir") val KOTLIN_INTERNAL_IR_FQN = FqName("kotlin.internal.ir")
val BUILTIN_OPERATOR = object : IrDeclarationOriginImpl("OPERATOR") {} val BUILTIN_OPERATOR = object : IrDeclarationOriginImpl("OPERATOR") {}
@@ -1,79 +0,0 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.ir.descriptors
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl
interface IrSyntheticPropertyAccessorDescriptor : PropertyAccessorDescriptor {
enum class Kind {
STATIC_PROPERTY,
MEMBER_PROPERTY
}
val kind: Kind
}
interface IrSyntheticPropertyGetterDescriptor : IrSyntheticPropertyAccessorDescriptor
interface IrSyntheticPropertySetterDescriptor : IrSyntheticPropertyAccessorDescriptor
class IrSyntheticPropertyGetterDescriptorImpl(
correspondingProperty: PropertyDescriptor,
override val kind: IrSyntheticPropertyAccessorDescriptor.Kind
) : PropertyGetterDescriptorImpl(
correspondingProperty,
Annotations.EMPTY,
Modality.FINAL,
correspondingProperty.visibility,
true, // isDefault
false, // isExternal
false, // isInline
CallableMemberDescriptor.Kind.SYNTHESIZED,
null,
correspondingProperty.source
), IrSyntheticPropertyGetterDescriptor {
init {
initialize(correspondingProperty.type)
}
}
class IrSyntheticPropertySetterDescriptorImpl(
correspondingProperty: PropertyDescriptor,
override val kind: IrSyntheticPropertyAccessorDescriptor.Kind
) : PropertySetterDescriptorImpl(
correspondingProperty,
Annotations.EMPTY,
Modality.FINAL,
correspondingProperty.visibility,
true, // isDefault
false, // isExternal
false, // isInline
CallableMemberDescriptor.Kind.SYNTHESIZED,
null,
correspondingProperty.source
), IrSyntheticPropertySetterDescriptor {
init {
initializeDefault()
}
}
@@ -1,3 +1,8 @@
/*
* 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.ir.symbols package org.jetbrains.kotlin.ir.symbols
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
@@ -19,10 +19,8 @@ package org.jetbrains.kotlin.ir.symbols
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrScript
import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.IrSymbolVisitor
import org.jetbrains.kotlin.types.model.TypeConstructorMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker
import org.jetbrains.kotlin.types.model.TypeParameterMarker import org.jetbrains.kotlin.types.model.TypeParameterMarker
@@ -37,8 +35,6 @@ interface IrSymbol {
val signature: IdSignature val signature: IdSignature
val isPublicApi: Boolean val isPublicApi: Boolean
fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R
} }
interface IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolOwner> : IrSymbol { interface IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolOwner> : IrSymbol {
@@ -53,161 +49,59 @@ interface IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolOwner> : I
interface IrPackageFragmentSymbol : IrSymbol { interface IrPackageFragmentSymbol : IrSymbol {
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
override val descriptor: PackageFragmentDescriptor override val descriptor: PackageFragmentDescriptor
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitPackageFragmentSymbol(this, data)
} }
interface IrFileSymbol : interface IrFileSymbol : IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrFile>
IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrFile> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R = interface IrExternalPackageFragmentSymbol : IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrExternalPackageFragment>
visitor.visitFileSymbol(this, data)
}
interface IrExternalPackageFragmentSymbol : interface IrAnonymousInitializerSymbol : IrBindableSymbol<ClassDescriptor, IrAnonymousInitializer>
IrPackageFragmentSymbol, IrBindableSymbol<PackageFragmentDescriptor, IrExternalPackageFragment> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R = interface IrEnumEntrySymbol : IrBindableSymbol<ClassDescriptor, IrEnumEntry>
visitor.visitExternalPackageFragmentSymbol(this, data)
}
interface IrAnonymousInitializerSymbol : interface IrFieldSymbol : IrBindableSymbol<PropertyDescriptor, IrField>
IrBindableSymbol<ClassDescriptor, IrAnonymousInitializer> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitAnonymousInitializerSymbol(this, data)
}
interface IrEnumEntrySymbol :
IrBindableSymbol<ClassDescriptor, IrEnumEntry> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitEnumEntrySymbol(this, data)
}
interface IrFieldSymbol :
IrBindableSymbol<PropertyDescriptor, IrField> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitFieldSymbol(this, data)
}
interface IrClassifierSymbol :
IrSymbol, TypeConstructorMarker {
interface IrClassifierSymbol : IrSymbol, TypeConstructorMarker {
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
override val descriptor: ClassifierDescriptor override val descriptor: ClassifierDescriptor
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitClassifierSymbol(this, data)
} }
interface IrClassSymbol : interface IrClassSymbol : IrClassifierSymbol, IrBindableSymbol<ClassDescriptor, IrClass>
IrClassifierSymbol, IrBindableSymbol<ClassDescriptor, IrClass> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R = interface IrScriptSymbol : IrSymbol, IrBindableSymbol<ScriptDescriptor, IrScript>
visitor.visitClassSymbol(this, data)
}
interface IrScriptSymbol : interface IrTypeParameterSymbol : IrClassifierSymbol, IrBindableSymbol<TypeParameterDescriptor, IrTypeParameter>, TypeParameterMarker
IrSymbol, IrBindableSymbol<ScriptDescriptor, IrScript> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitSymbol(this, data)
}
interface IrTypeParameterSymbol :
IrClassifierSymbol, IrBindableSymbol<TypeParameterDescriptor, IrTypeParameter>, TypeParameterMarker {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitTypeParameterSymbol(this, data)
}
interface IrValueSymbol :
IrSymbol {
interface IrValueSymbol : IrSymbol {
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
override val descriptor: ValueDescriptor override val descriptor: ValueDescriptor
override val owner: IrValueDeclaration override val owner: IrValueDeclaration
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitValueSymbol(this, data)
} }
interface IrValueParameterSymbol : interface IrValueParameterSymbol : IrValueSymbol, IrBindableSymbol<ParameterDescriptor, IrValueParameter>
IrValueSymbol, IrBindableSymbol<ParameterDescriptor, IrValueParameter> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R = interface IrVariableSymbol : IrValueSymbol, IrBindableSymbol<VariableDescriptor, IrVariable>
visitor.visitValueParameterSymbol(this, data)
}
interface IrVariableSymbol :
IrValueSymbol, IrBindableSymbol<VariableDescriptor, IrVariable> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitVariableSymbol(this, data)
}
interface IrReturnTargetSymbol :
IrSymbol {
interface IrReturnTargetSymbol : IrSymbol {
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
override val descriptor: FunctionDescriptor override val descriptor: FunctionDescriptor
override val owner: IrReturnTarget override val owner: IrReturnTarget
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitReturnTargetSymbol(this, data)
} }
interface IrFunctionSymbol : interface IrFunctionSymbol : IrReturnTargetSymbol {
IrReturnTargetSymbol {
override val owner: IrFunction override val owner: IrFunction
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitFunctionSymbol(this, data)
} }
interface IrConstructorSymbol : interface IrConstructorSymbol : IrFunctionSymbol, IrBindableSymbol<ClassConstructorDescriptor, IrConstructor>
IrFunctionSymbol, IrBindableSymbol<ClassConstructorDescriptor, IrConstructor> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R = interface IrSimpleFunctionSymbol : IrFunctionSymbol, IrBindableSymbol<FunctionDescriptor, IrSimpleFunction>
visitor.visitConstructorSymbol(this, data)
}
interface IrSimpleFunctionSymbol :
IrFunctionSymbol, IrBindableSymbol<FunctionDescriptor, IrSimpleFunction> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R = interface IrReturnableBlockSymbol : IrReturnTargetSymbol, IrBindableSymbol<FunctionDescriptor, IrReturnableBlock>
visitor.visitSimpleFunctionSymbol(this, data)
}
interface IrReturnableBlockSymbol : interface IrPropertySymbol : IrBindableSymbol<PropertyDescriptor, IrProperty>
IrReturnTargetSymbol, IrBindableSymbol<FunctionDescriptor, IrReturnableBlock> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R = interface IrLocalDelegatedPropertySymbol : IrBindableSymbol<VariableDescriptorWithAccessors, IrLocalDelegatedProperty>
visitor.visitReturnableBlockSymbol(this, data)
}
interface IrPropertySymbol : interface IrTypeAliasSymbol : IrBindableSymbol<TypeAliasDescriptor, IrTypeAlias>
IrBindableSymbol<PropertyDescriptor, IrProperty> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitPropertySymbol(this, data)
}
interface IrLocalDelegatedPropertySymbol :
IrBindableSymbol<VariableDescriptorWithAccessors, IrLocalDelegatedProperty> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitLocalDelegatedPropertySymbol(this, data)
}
interface IrTypeAliasSymbol :
IrBindableSymbol<TypeAliasDescriptor, IrTypeAlias> {
override fun <D, R> accept(visitor: IrSymbolVisitor<R, D>, data: D): R =
visitor.visitTypeAliasSymbol(this, data)
}
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.ir.symbols.impl
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.descriptors.WrappedDeclarationDescriptor
import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
@@ -90,48 +90,40 @@ class IrExternalPackageFragmentSymbolImpl(descriptor: PackageFragmentDescriptor)
class IrAnonymousInitializerSymbolImpl(descriptor: ClassDescriptor) : class IrAnonymousInitializerSymbolImpl(descriptor: ClassDescriptor) :
IrBindableSymbolBase<ClassDescriptor, IrAnonymousInitializer>(descriptor), IrBindableSymbolBase<ClassDescriptor, IrAnonymousInitializer>(descriptor),
IrAnonymousInitializerSymbol { IrAnonymousInitializerSymbol {
constructor(irClassSymbol: IrClassSymbol) : this(irClassSymbol.descriptor) {} constructor(irClassSymbol: IrClassSymbol) : this(irClassSymbol.descriptor)
} }
class IrClassSymbolImpl(descriptor: ClassDescriptor) : class IrClassSymbolImpl(descriptor: ClassDescriptor) :
IrBindableSymbolBase<ClassDescriptor, IrClass>(descriptor), IrBindableSymbolBase<ClassDescriptor, IrClass>(descriptor),
IrClassSymbol { IrClassSymbol
}
class IrEnumEntrySymbolImpl(descriptor: ClassDescriptor) : class IrEnumEntrySymbolImpl(descriptor: ClassDescriptor) :
IrBindableSymbolBase<ClassDescriptor, IrEnumEntry>(descriptor), IrBindableSymbolBase<ClassDescriptor, IrEnumEntry>(descriptor),
IrEnumEntrySymbol { IrEnumEntrySymbol
}
class IrFieldSymbolImpl(descriptor: PropertyDescriptor) : class IrFieldSymbolImpl(descriptor: PropertyDescriptor) :
IrBindableSymbolBase<PropertyDescriptor, IrField>(descriptor), IrBindableSymbolBase<PropertyDescriptor, IrField>(descriptor),
IrFieldSymbol { IrFieldSymbol
}
class IrTypeParameterSymbolImpl(descriptor: TypeParameterDescriptor) : class IrTypeParameterSymbolImpl(descriptor: TypeParameterDescriptor) :
IrBindableSymbolBase<TypeParameterDescriptor, IrTypeParameter>(descriptor), IrBindableSymbolBase<TypeParameterDescriptor, IrTypeParameter>(descriptor),
IrTypeParameterSymbol { IrTypeParameterSymbol
}
class IrValueParameterSymbolImpl(descriptor: ParameterDescriptor) : class IrValueParameterSymbolImpl(descriptor: ParameterDescriptor) :
IrBindableSymbolBase<ParameterDescriptor, IrValueParameter>(descriptor), IrBindableSymbolBase<ParameterDescriptor, IrValueParameter>(descriptor),
IrValueParameterSymbol { IrValueParameterSymbol
}
class IrVariableSymbolImpl(descriptor: VariableDescriptor) : class IrVariableSymbolImpl(descriptor: VariableDescriptor) :
IrBindableSymbolBase<VariableDescriptor, IrVariable>(descriptor), IrBindableSymbolBase<VariableDescriptor, IrVariable>(descriptor),
IrVariableSymbol { IrVariableSymbol
}
class IrSimpleFunctionSymbolImpl(descriptor: FunctionDescriptor) : class IrSimpleFunctionSymbolImpl(descriptor: FunctionDescriptor) :
IrBindableSymbolBase<FunctionDescriptor, IrSimpleFunction>(descriptor), IrBindableSymbolBase<FunctionDescriptor, IrSimpleFunction>(descriptor),
IrSimpleFunctionSymbol { IrSimpleFunctionSymbol
}
class IrConstructorSymbolImpl(descriptor: ClassConstructorDescriptor) : class IrConstructorSymbolImpl(descriptor: ClassConstructorDescriptor) :
IrBindableSymbolBase<ClassConstructorDescriptor, IrConstructor>(descriptor), IrBindableSymbolBase<ClassConstructorDescriptor, IrConstructor>(descriptor),
IrConstructorSymbol { IrConstructorSymbol
}
class IrReturnableBlockSymbolImpl(descriptor: FunctionDescriptor) : class IrReturnableBlockSymbolImpl(descriptor: FunctionDescriptor) :
IrBindableSymbolBase<FunctionDescriptor, IrReturnableBlock>(descriptor), IrBindableSymbolBase<FunctionDescriptor, IrReturnableBlock>(descriptor),
@@ -139,8 +131,7 @@ class IrReturnableBlockSymbolImpl(descriptor: FunctionDescriptor) :
class IrPropertySymbolImpl(descriptor: PropertyDescriptor) : class IrPropertySymbolImpl(descriptor: PropertyDescriptor) :
IrBindableSymbolBase<PropertyDescriptor, IrProperty>(descriptor), IrBindableSymbolBase<PropertyDescriptor, IrProperty>(descriptor),
IrPropertySymbol { IrPropertySymbol
}
class IrLocalDelegatedPropertySymbolImpl(descriptor: VariableDescriptorWithAccessors) : class IrLocalDelegatedPropertySymbolImpl(descriptor: VariableDescriptorWithAccessors) :
IrBindableSymbolBase<VariableDescriptorWithAccessors, IrLocalDelegatedProperty>(descriptor), IrBindableSymbolBase<VariableDescriptorWithAccessors, IrLocalDelegatedProperty>(descriptor),
@@ -148,8 +139,7 @@ class IrLocalDelegatedPropertySymbolImpl(descriptor: VariableDescriptorWithAcces
class IrTypeAliasSymbolImpl(descriptor: TypeAliasDescriptor) : class IrTypeAliasSymbolImpl(descriptor: TypeAliasDescriptor) :
IrBindableSymbolBase<TypeAliasDescriptor, IrTypeAlias>(descriptor), IrBindableSymbolBase<TypeAliasDescriptor, IrTypeAlias>(descriptor),
IrTypeAliasSymbol { IrTypeAliasSymbol
}
class IrScriptSymbolImpl(descriptor: ScriptDescriptor) : class IrScriptSymbolImpl(descriptor: ScriptDescriptor) :
IrScriptSymbol, IrBindableSymbolBase<ScriptDescriptor, IrScript>(descriptor) IrScriptSymbol, IrBindableSymbolBase<ScriptDescriptor, IrScript>(descriptor)
@@ -60,30 +60,24 @@ abstract class IrBindablePublicSymbolBase<out D : DeclarationDescriptor, B : IrS
class IrClassPublicSymbolImpl(descriptor: ClassDescriptor, sig: IdSignature) : class IrClassPublicSymbolImpl(descriptor: ClassDescriptor, sig: IdSignature) :
IrBindablePublicSymbolBase<ClassDescriptor, IrClass>(descriptor, sig), IrBindablePublicSymbolBase<ClassDescriptor, IrClass>(descriptor, sig),
IrClassSymbol { IrClassSymbol
}
class IrEnumEntryPublicSymbolImpl(descriptor: ClassDescriptor, sig: IdSignature) : class IrEnumEntryPublicSymbolImpl(descriptor: ClassDescriptor, sig: IdSignature) :
IrBindablePublicSymbolBase<ClassDescriptor, IrEnumEntry>(descriptor, sig), IrBindablePublicSymbolBase<ClassDescriptor, IrEnumEntry>(descriptor, sig),
IrEnumEntrySymbol { IrEnumEntrySymbol
}
class IrSimpleFunctionPublicSymbolImpl(descriptor: FunctionDescriptor, sig: IdSignature) : class IrSimpleFunctionPublicSymbolImpl(descriptor: FunctionDescriptor, sig: IdSignature) :
IrBindablePublicSymbolBase<FunctionDescriptor, IrSimpleFunction>(descriptor, sig), IrBindablePublicSymbolBase<FunctionDescriptor, IrSimpleFunction>(descriptor, sig),
IrSimpleFunctionSymbol { IrSimpleFunctionSymbol
}
class IrConstructorPublicSymbolImpl(descriptor: ClassConstructorDescriptor, sig: IdSignature) : class IrConstructorPublicSymbolImpl(descriptor: ClassConstructorDescriptor, sig: IdSignature) :
IrBindablePublicSymbolBase<ClassConstructorDescriptor, IrConstructor>(descriptor, sig), IrBindablePublicSymbolBase<ClassConstructorDescriptor, IrConstructor>(descriptor, sig),
IrConstructorSymbol { IrConstructorSymbol
}
class IrPropertyPublicSymbolImpl(descriptor: PropertyDescriptor, sig: IdSignature) : class IrPropertyPublicSymbolImpl(descriptor: PropertyDescriptor, sig: IdSignature) :
IrBindablePublicSymbolBase<PropertyDescriptor, IrProperty>(descriptor, sig), IrBindablePublicSymbolBase<PropertyDescriptor, IrProperty>(descriptor, sig),
IrPropertySymbol { IrPropertySymbol
}
class IrTypeAliasPublicSymbolImpl(descriptor: TypeAliasDescriptor, sig: IdSignature) : class IrTypeAliasPublicSymbolImpl(descriptor: TypeAliasDescriptor, sig: IdSignature) :
IrBindablePublicSymbolBase<TypeAliasDescriptor, IrTypeAlias>(descriptor, sig), IrBindablePublicSymbolBase<TypeAliasDescriptor, IrTypeAlias>(descriptor, sig),
IrTypeAliasSymbol { IrTypeAliasSymbol
}
@@ -12,16 +12,13 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.resolve.calls.NewCommonSuperTypeCalculator
import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.AbstractTypeCheckerContext import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
import org.jetbrains.kotlin.utils.DFS
fun IrClassifierSymbol.superTypes() = when (this) { fun IrClassifierSymbol.superTypes(): List<IrType> = when (this) {
is IrClassSymbol -> owner.superTypes is IrClassSymbol -> owner.superTypes
is IrTypeParameterSymbol -> owner.superTypes is IrTypeParameterSymbol -> owner.superTypes
else -> emptyList<IrType>() else -> emptyList()
} }
fun IrClassifierSymbol.isSubtypeOfClass(superClass: IrClassSymbol): Boolean { fun IrClassifierSymbol.isSubtypeOfClass(superClass: IrClassSymbol): Boolean {
@@ -34,50 +31,10 @@ fun IrType.isSubtypeOfClass(superClass: IrClassSymbol): Boolean {
return classifier.isSubtypeOfClass(superClass) return classifier.isSubtypeOfClass(superClass)
} }
fun Collection<IrClassifierSymbol>.commonSuperclass(): IrClassifierSymbol {
var superClassifiers: MutableSet<IrClassifierSymbol>? = null
require(isNotEmpty())
val order = fold(emptyList<IrClassifierSymbol>()) { _, classifierSymbol ->
val visited = mutableSetOf<IrClassifierSymbol>()
DFS.topologicalOrder(
listOf(classifierSymbol), { it.superTypes().map { s -> (s as IrSimpleType).classifier } },
DFS.VisitedWithSet(visited)
).also {
if (superClassifiers == null) {
superClassifiers = visited
} else {
superClassifiers!!.apply {
retainAll { c -> visited.any { v -> FqNameEqualityChecker.areEqual(c, v) } }
}
}
}
}
requireNotNull(superClassifiers)
return order.firstOrNull { o -> superClassifiers!!.any { s -> FqNameEqualityChecker.areEqual(o, s) } }
?: error(
"No common superType found for non-empty set of classifiers: ${joinToString(
prefix = "[",
postfix = "]"
) { it.owner.render() }}"
)
}
fun IrType.isSubtypeOf(superType: IrType, irBuiltIns: IrBuiltIns): Boolean { fun IrType.isSubtypeOf(superType: IrType, irBuiltIns: IrBuiltIns): Boolean {
return AbstractTypeChecker.isSubtypeOf(IrTypeCheckerContext(irBuiltIns) as AbstractTypeCheckerContext, this, superType) return AbstractTypeChecker.isSubtypeOf(IrTypeCheckerContext(irBuiltIns) as AbstractTypeCheckerContext, this, superType)
} }
// no searchable usages
// delete or FIXME: implement TypeConstructorMarker.isError and TypeConstructorMarker.toErrorType in IrTypeSystemContext
fun Collection<IrType>.commonSupertype(irBuiltIns: IrBuiltIns): IrType {
return NewCommonSuperTypeCalculator.run {
IrTypeCheckerContext(irBuiltIns).commonSuperType(map { it }) as IrType
}
}
fun IrType.isNullable(): Boolean = fun IrType.isNullable(): Boolean =
when (this) { when (this) {
is IrSimpleType -> when (val classifier = classifier) { is IrSimpleType -> when (val classifier = classifier) {
@@ -80,9 +80,6 @@ fun IrSimpleTypeBuilder.buildTypeProjection() =
inline fun IrSimpleType.buildSimpleType(b: IrSimpleTypeBuilder.() -> Unit): IrSimpleType = inline fun IrSimpleType.buildSimpleType(b: IrSimpleTypeBuilder.() -> Unit): IrSimpleType =
toBuilder().apply(b).buildSimpleType() toBuilder().apply(b).buildSimpleType()
inline fun IrSimpleType.buildTypeProjection(b: IrSimpleTypeBuilder.() -> Unit): IrTypeProjection =
toBuilder().apply(b).buildTypeProjection()
class IrTypeProjectionImpl internal constructor( class IrTypeProjectionImpl internal constructor(
override val type: IrType, override val type: IrType,
override val variance: Variance override val variance: Variance
@@ -6,14 +6,12 @@
package org.jetbrains.kotlin.ir.types package org.jetbrains.kotlin.ir.types
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName
private fun IrType.isNotNullClassType(fqName: FqNameUnsafe) = isClassType(fqName, hasQuestionMark = false) private fun IrType.isNotNullClassType(fqName: FqNameUnsafe) = isClassType(fqName, hasQuestionMark = false)
private fun IrType.isNullableClassType(fqName: FqNameUnsafe) = isClassType(fqName, hasQuestionMark = true) private fun IrType.isNullableClassType(fqName: FqNameUnsafe) = isClassType(fqName, hasQuestionMark = true)
@@ -35,9 +33,6 @@ private fun classFqNameEquals(symbol: IrClassSymbol, fqName: FqNameUnsafe): Bool
private fun classFqNameEquals(declaration: IrClass, fqName: FqNameUnsafe): Boolean = private fun classFqNameEquals(declaration: IrClass, fqName: FqNameUnsafe): Boolean =
declaration.name == fqName.shortName() && fqName == declaration.fqNameWhenAvailable?.toUnsafe() declaration.name == fqName.shortName() && fqName == declaration.fqNameWhenAvailable?.toUnsafe()
private fun classFqNameEquals(descriptor: ClassDescriptor, fqName: FqNameUnsafe): Boolean =
descriptor.name == fqName.shortName() && fqName == getFqName(descriptor)
fun IrType.isAny(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.any) fun IrType.isAny(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.any)
fun IrType.isNullableAny(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES.any) fun IrType.isNullableAny(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES.any)
@@ -56,8 +51,6 @@ fun IrType.isNullablePrimitiveType(): Boolean = KotlinBuiltIns.FQ_NAMES.fqNameTo
fun IrType.isMarkedNullable() = (this as? IrSimpleType)?.hasQuestionMark ?: false fun IrType.isMarkedNullable() = (this as? IrSimpleType)?.hasQuestionMark ?: false
fun IrType.isUnit() = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.unit) fun IrType.isUnit() = isNotNullClassType(KotlinBuiltIns.FQ_NAMES.unit)
fun IrType.isNullableUnit() = isNullableClassType(KotlinBuiltIns.FQ_NAMES.unit)
fun IrType.isUnitOrNullableUnit() = this.isUnit() || this.isNullableUnit()
fun IrType.isBoolean(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES._boolean) fun IrType.isBoolean(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES._boolean)
fun IrType.isChar(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES._char) fun IrType.isChar(): Boolean = isNotNullClassType(KotlinBuiltIns.FQ_NAMES._char)
@@ -87,10 +80,5 @@ fun IrType.isLongArray(): Boolean = isNotNullClassType(FqNameUnsafe("kotlin.Long
fun IrType.isFloatArray(): Boolean = isNotNullClassType(FqNameUnsafe("kotlin.FloatArray")) fun IrType.isFloatArray(): Boolean = isNotNullClassType(FqNameUnsafe("kotlin.FloatArray"))
fun IrType.isDoubleArray(): Boolean = isNotNullClassType(FqNameUnsafe("kotlin.DoubleArray")) fun IrType.isDoubleArray(): Boolean = isNotNullClassType(FqNameUnsafe("kotlin.DoubleArray"))
fun IrType.isNullableBoolean(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._boolean)
fun IrType.isNullableLong(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._long)
fun IrType.isNullableChar(): Boolean = isNullableClassType(KotlinBuiltIns.FQ_NAMES._char)
fun IrType.isKotlinResult(): Boolean = isNotNullClassType(DescriptorUtils.RESULT_FQ_NAME.toUnsafe()) fun IrType.isKotlinResult(): Boolean = isNotNullClassType(DescriptorUtils.RESULT_FQ_NAME.toUnsafe())
fun IrType.isContinuation(): Boolean = isNotNullClassType(DescriptorUtils.CONTINUATION_INTERFACE_FQ_NAME_RELEASE.toUnsafe())
fun IrType.isNullableContinuation(): Boolean = isNullableClassType(DescriptorUtils.CONTINUATION_INTERFACE_FQ_NAME_RELEASE.toUnsafe()) fun IrType.isNullableContinuation(): Boolean = isNullableClassType(DescriptorUtils.CONTINUATION_INTERFACE_FQ_NAME_RELEASE.toUnsafe())
@@ -5,7 +5,9 @@
package org.jetbrains.kotlin.ir.util package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
@@ -16,12 +18,11 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import java.io.File import java.io.File
val IrConstructor.constructedClass get() = this.parent as IrClass val IrConstructor.constructedClass get() = this.parent as IrClass
val <T : IrDeclaration> T.original get() = this
val IrDeclarationParent.fqNameForIrSerialization: FqName val IrDeclarationParent.fqNameForIrSerialization: FqName
get() = when (this) { get() = when (this) {
is IrPackageFragment -> this.fqName is IrPackageFragment -> this.fqName
@@ -29,14 +30,6 @@ val IrDeclarationParent.fqNameForIrSerialization: FqName
else -> error(this) else -> error(this)
} }
@Deprecated(
"Use fqNameForIrSerialization instead.",
ReplaceWith("fqNameForIrSerialization", "org.jetbrains.kotlin.ir.util.fqNameForIrSerialization"),
DeprecationLevel.ERROR
)
val IrDeclarationParent.fqNameSafe: FqName
get() = fqNameForIrSerialization
val IrClass.classId: ClassId? val IrClass.classId: ClassId?
get() = when (val parent = this.parent) { get() = when (val parent = this.parent) {
is IrClass -> parent.classId?.createNestedClassId(this.name) is IrClass -> parent.classId?.createNestedClassId(this.name)
@@ -50,13 +43,6 @@ val IrDeclaration.nameForIrSerialization: Name
is IrConstructor -> SPECIAL_INIT_NAME is IrConstructor -> SPECIAL_INIT_NAME
else -> error(this) else -> error(this)
} }
@Deprecated(
"Use nameForIrSerialization instead.",
ReplaceWith("nameForIrSerialization", "org.jetbrains.kotlin.ir.util.nameForIrSerialization"),
DeprecationLevel.ERROR
)
val IrDeclaration.name: Name
get() = nameForIrSerialization
private val SPECIAL_INIT_NAME = Name.special("<init>") private val SPECIAL_INIT_NAME = Name.special("<init>")
@@ -114,17 +100,6 @@ val IrDeclaration.isPropertyField get() =
val IrDeclaration.isTopLevelDeclaration get() = val IrDeclaration.isTopLevelDeclaration get() =
parent !is IrDeclaration && !this.isPropertyAccessor && !this.isPropertyField parent !is IrDeclaration && !this.isPropertyAccessor && !this.isPropertyField
fun IrDeclaration.findTopLevelDeclaration(): IrDeclaration = when {
this.isTopLevelDeclaration ->
this
this.isPropertyAccessor ->
(this as IrSimpleFunction).correspondingPropertySymbol!!.owner.findTopLevelDeclaration()
this.isPropertyField ->
(this as IrField).correspondingPropertySymbol!!.owner.findTopLevelDeclaration()
else ->
(this.parent as IrDeclaration).findTopLevelDeclaration()
}
val IrDeclaration.isAnonymousObject get() = this is IrClass && name == SpecialNames.NO_NAME_PROVIDED val IrDeclaration.isAnonymousObject get() = this is IrClass && name == SpecialNames.NO_NAME_PROVIDED
val IrDeclaration.isLocal: Boolean val IrDeclaration.isLocal: Boolean
@@ -173,10 +148,10 @@ val SourceManager.FileEntry.lineStartOffsets
if (it.exists() && it.isFile) it.lineStartOffsets else IntArray(0) if (it.exists() && it.isFile) it.lineStartOffsets else IntArray(0)
} }
class NaiveSourceBasedFileEntryImpl(override val name: String, val lineStartOffsets: IntArray = IntArray(0)) : SourceManager.FileEntry { class NaiveSourceBasedFileEntryImpl(
override val name: String,
//-------------------------------------------------------------------------// private val lineStartOffsets: IntArray = intArrayOf()
) : SourceManager.FileEntry {
override fun getLineNumber(offset: Int): Int { override fun getLineNumber(offset: Int): Int {
assert(offset != UNDEFINED_OFFSET) assert(offset != UNDEFINED_OFFSET)
if (offset == SYNTHETIC_OFFSET) return 0 if (offset == SYNTHETIC_OFFSET) return 0
@@ -184,8 +159,6 @@ class NaiveSourceBasedFileEntryImpl(override val name: String, val lineStartOffs
return if (index >= 0) index else -index - 2 return if (index >= 0) index else -index - 2
} }
//-------------------------------------------------------------------------//
override fun getColumnNumber(offset: Int): Int { override fun getColumnNumber(offset: Int): Int {
assert(offset != UNDEFINED_OFFSET) assert(offset != UNDEFINED_OFFSET)
if (offset == SYNTHETIC_OFFSET) return 0 if (offset == SYNTHETIC_OFFSET) return 0
@@ -193,16 +166,11 @@ class NaiveSourceBasedFileEntryImpl(override val name: String, val lineStartOffs
return offset - lineStartOffsets[lineNumber] return offset - lineStartOffsets[lineNumber]
} }
//-------------------------------------------------------------------------//
override val maxOffset: Int override val maxOffset: Int
//get() = TODO("not implemented")
get() = UNDEFINED_OFFSET get() = UNDEFINED_OFFSET
override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo { override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo {
//TODO("not implemented")
return SourceRangeInfo(name, beginOffset, -1, -1, endOffset, -1, -1) return SourceRangeInfo(name, beginOffset, -1, -1, endOffset, -1, -1)
} }
} }
@@ -231,3 +199,6 @@ fun IrClass.getPropertySetter(name: String): IrSimpleFunctionSymbol? =
fun IrClassSymbol.getSimpleFunction(name: String): IrSimpleFunctionSymbol? = owner.getSimpleFunction(name) fun IrClassSymbol.getSimpleFunction(name: String): IrSimpleFunctionSymbol? = owner.getSimpleFunction(name)
fun IrClassSymbol.getPropertyGetter(name: String): IrSimpleFunctionSymbol? = owner.getPropertyGetter(name) fun IrClassSymbol.getPropertyGetter(name: String): IrSimpleFunctionSymbol? = owner.getPropertyGetter(name)
fun IrClassSymbol.getPropertySetter(name: String): IrSimpleFunctionSymbol? = owner.getPropertySetter(name) fun IrClassSymbol.getPropertySetter(name: String): IrSimpleFunctionSymbol? = owner.getPropertySetter(name)
inline fun MemberScope.findFirstFunction(name: String, predicate: (CallableMemberDescriptor) -> Boolean) =
getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).first(predicate)
@@ -129,12 +129,14 @@ abstract class DataClassMembersGenerator(
private val intType = context.builtIns.intType private val intType = context.builtIns.intType
private val intTimesSymbol: IrSimpleFunctionSymbol = private val intTimesSymbol: IrSimpleFunctionSymbol =
intClass.findFirstFunction("times") { KotlinTypeChecker.DEFAULT.equalTypes(it.valueParameters[0].type, intType) } intClass.unsubstitutedMemberScope.findFirstFunction("times") {
.let { symbolTable.referenceSimpleFunction(it) } KotlinTypeChecker.DEFAULT.equalTypes(it.valueParameters[0].type, intType)
}.let { symbolTable.referenceSimpleFunction(it) }
private val intPlusSymbol: IrSimpleFunctionSymbol = private val intPlusSymbol: IrSimpleFunctionSymbol =
intClass.findFirstFunction("plus") { KotlinTypeChecker.DEFAULT.equalTypes(it.valueParameters[0].type, intType) } intClass.unsubstitutedMemberScope.findFirstFunction("plus") {
.let { symbolTable.referenceSimpleFunction(it) } KotlinTypeChecker.DEFAULT.equalTypes(it.valueParameters[0].type, intType)
}.let { symbolTable.referenceSimpleFunction(it) }
fun generateHashCodeMethodBody(properties: List<PropertyDescriptor>) { fun generateHashCodeMethodBody(properties: List<PropertyDescriptor>) {
val irIntType = context.irBuiltIns.intType val irIntType = context.irBuiltIns.intType
@@ -1,72 +0,0 @@
/*
* Copyright 2010-2019 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.ir.util
import org.jetbrains.kotlin.ir.symbols.*
interface IrSymbolVisitor<out R, in D> {
fun visitSymbol(symbol: IrSymbol, data: D): R
fun visitPackageFragmentSymbol(symbol: IrPackageFragmentSymbol, data: D) =
visitSymbol(symbol, data)
fun visitFileSymbol(symbol: IrFileSymbol, data: D) =
visitPackageFragmentSymbol(symbol, data)
fun visitExternalPackageFragmentSymbol(symbol: IrExternalPackageFragmentSymbol, data: D) =
visitPackageFragmentSymbol(symbol, data)
fun visitClassifierSymbol(symbol: IrClassifierSymbol, data: D) =
visitSymbol(symbol, data)
fun visitClassSymbol(symbol: IrClassSymbol, data: D) =
visitClassifierSymbol(symbol, data)
fun visitTypeParameterSymbol(symbol: IrTypeParameterSymbol, data: D) =
visitClassifierSymbol(symbol, data)
fun visitValueSymbol(symbol: IrValueSymbol, data: D) =
visitSymbol(symbol, data)
fun visitVariableSymbol(symbol: IrVariableSymbol, data: D) =
visitValueSymbol(symbol, data)
fun visitValueParameterSymbol(symbol: IrValueParameterSymbol, data: D) =
visitValueSymbol(symbol, data)
fun visitReturnTargetSymbol(symbol: IrReturnTargetSymbol, data: D) =
visitSymbol(symbol, data)
fun visitFunctionSymbol(symbol: IrFunctionSymbol, data: D) =
visitReturnTargetSymbol(symbol, data)
fun visitSimpleFunctionSymbol(symbol: IrSimpleFunctionSymbol, data: D) =
visitFunctionSymbol(symbol, data)
fun visitConstructorSymbol(symbol: IrConstructorSymbol, data: D) =
visitFunctionSymbol(symbol, data)
fun visitReturnableBlockSymbol(symbol: IrReturnableBlockSymbol, data: D) =
visitReturnTargetSymbol(symbol, data)
fun visitAnonymousInitializerSymbol(symbol: IrAnonymousInitializerSymbol, data: D) =
visitSymbol(symbol, data)
fun visitEnumEntrySymbol(symbol: IrEnumEntrySymbol, data: D) =
visitSymbol(symbol, data)
fun visitFieldSymbol(symbol: IrFieldSymbol, data: D) =
visitSymbol(symbol, data)
fun visitPropertySymbol(symbol: IrPropertySymbol, data: D) =
visitSymbol(symbol, data)
fun visitLocalDelegatedPropertySymbol(symbol: IrLocalDelegatedPropertySymbol, data: D) =
visitSymbol(symbol, data)
fun visitTypeAliasSymbol(symbol: IrTypeAliasSymbol, data: D) =
visitSymbol(symbol, data)
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.ir.util package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
@@ -20,11 +19,6 @@ import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.utils.DFS import org.jetbrains.kotlin.utils.DFS
@@ -64,6 +58,7 @@ fun IrMemberAccessExpression<*>.getArguments(): List<Pair<ParameterDescriptor, I
* The arguments are to be evaluated in the same order as they appear in the resulting list. * The arguments are to be evaluated in the same order as they appear in the resulting list.
*/ */
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
@Suppress("unused") // Used in kotlin-native
fun IrFunctionAccessExpression.getArgumentsWithSymbols(): List<Pair<IrValueParameterSymbol, IrExpression>> { fun IrFunctionAccessExpression.getArgumentsWithSymbols(): List<Pair<IrValueParameterSymbol, IrExpression>> {
val res = mutableListOf<Pair<IrValueParameterSymbol, IrExpression>>() val res = mutableListOf<Pair<IrValueParameterSymbol, IrExpression>>()
val irFunction = symbol.owner val irFunction = symbol.owner
@@ -149,6 +144,7 @@ fun IrMemberAccessExpression<*>.addArguments(args: Map<ParameterDescriptor, IrEx
} }
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
@Suppress("unused") // Used in kotlin-native
fun IrMemberAccessExpression<*>.addArguments(args: List<Pair<ParameterDescriptor, IrExpression>>) = fun IrMemberAccessExpression<*>.addArguments(args: List<Pair<ParameterDescriptor, IrExpression>>) =
this.addArguments(args.toMap()) this.addArguments(args.toMap())
@@ -162,14 +158,9 @@ fun IrExpression.isIntegerConst(value: Int) = this is IrConst<*> && this.kind ==
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
fun IrExpression.coerceToUnit(builtins: IrBuiltIns): IrExpression { fun IrExpression.coerceToUnit(builtins: IrBuiltIns): IrExpression {
val valueType = getKotlinType(this) return coerceToUnitIfNeeded(type.toKotlinType(), builtins)
return coerceToUnitIfNeeded(valueType, builtins)
} }
@ObsoleteDescriptorBasedAPI
private fun getKotlinType(irExpression: IrExpression) =
irExpression.type.toKotlinType()
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
fun IrExpression.coerceToUnitIfNeeded(valueType: KotlinType, irBuiltIns: IrBuiltIns): IrExpression { fun IrExpression.coerceToUnitIfNeeded(valueType: KotlinType, irBuiltIns: IrBuiltIns): IrExpression {
return if (KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType, irBuiltIns.unitType.toKotlinType())) return if (KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType, irBuiltIns.unitType.toKotlinType()))
@@ -201,9 +192,6 @@ fun IrExpression.coerceToUnitIfNeeded(valueType: IrType, irBuiltIns: IrBuiltIns)
fun IrMemberAccessExpression<*>.usesDefaultArguments(): Boolean = fun IrMemberAccessExpression<*>.usesDefaultArguments(): Boolean =
(symbol.descriptor as CallableDescriptor).valueParameters.any { this.getValueArgument(it) == null } (symbol.descriptor as CallableDescriptor).valueParameters.any { this.getValueArgument(it) == null }
val DeclarationDescriptorWithSource.startOffset: Int? get() = (this.source as? PsiSourceElement)?.psi?.startOffset
val DeclarationDescriptorWithSource.endOffset: Int? get() = (this.source as? PsiSourceElement)?.psi?.endOffset
val IrClass.functions: Sequence<IrSimpleFunction> val IrClass.functions: Sequence<IrSimpleFunction>
get() = declarations.asSequence().filterIsInstance<IrSimpleFunction>() get() = declarations.asSequence().filterIsInstance<IrSimpleFunction>()
@@ -297,10 +285,9 @@ fun IrClass.isLocalClass(): Boolean {
tailrec fun IrElement.getPackageFragment(): IrPackageFragment? { tailrec fun IrElement.getPackageFragment(): IrPackageFragment? {
if (this is IrPackageFragment) return this if (this is IrPackageFragment) return this
val vParent = (this as? IrDeclaration)?.parent return when (val parent = (this as? IrDeclaration)?.parent) {
return when (vParent) { is IrPackageFragment -> parent
is IrPackageFragment -> vParent else -> parent?.getPackageFragment()
else -> vParent?.getPackageFragment()
} }
} }
@@ -366,22 +353,12 @@ fun IrFunction.isExternalOrInheritedFromExternal(): Boolean {
inline fun <reified T : IrDeclaration> IrDeclarationContainer.findDeclaration(predicate: (T) -> Boolean): T? = inline fun <reified T : IrDeclaration> IrDeclarationContainer.findDeclaration(predicate: (T) -> Boolean): T? =
declarations.find { it is T && predicate(it) } as? T declarations.find { it is T && predicate(it) } as? T
@Suppress("UNCHECKED_CAST")
inline fun <reified T : IrDeclaration> IrDeclarationContainer.filterDeclarations(predicate: (T) -> Boolean): List<T> =
declarations.filter { it is T && predicate(it) } as List<T>
fun IrValueParameter.hasDefaultValue(): Boolean = DFS.ifAny( fun IrValueParameter.hasDefaultValue(): Boolean = DFS.ifAny(
listOf(this), listOf(this),
{ current -> (current.parent as? IrSimpleFunction)?.overriddenSymbols?.map { it.owner.valueParameters[current.index] } ?: listOf() }, { current -> (current.parent as? IrSimpleFunction)?.overriddenSymbols?.map { it.owner.valueParameters[current.index] } ?: listOf() },
{ current -> current.defaultValue != null } { current -> current.defaultValue != null }
) )
// In presence of `IrBlock`s, return the expression that actually serves as the value (the last one).
tailrec fun IrExpression.removeBlocks(): IrExpression? = when (this) {
is IrBlock -> (statements.last() as? IrExpression)?.removeBlocks()
else -> this
}
fun ReferenceSymbolTable.referenceClassifier(classifier: ClassifierDescriptor): IrClassifierSymbol = fun ReferenceSymbolTable.referenceClassifier(classifier: ClassifierDescriptor): IrClassifierSymbol =
when (classifier) { when (classifier) {
is TypeParameterDescriptor -> is TypeParameterDescriptor ->
@@ -403,19 +380,10 @@ fun ReferenceSymbolTable.referenceFunction(callable: CallableDescriptor): IrFunc
} }
/** /**
* Create new call based on given [call] and [newFunction] * Create new call based on given [call] and [newSymbol]
* [receiversAsArguments]: optionally convert call with dispatch receiver to static call * [receiversAsArguments]: optionally convert call with dispatch receiver to static call
* [argumentsAsReceivers]: optionally convert static call to call with dispatch receiver * [argumentsAsDispatchers]: optionally convert static call to call with dispatch receiver
*/ */
fun irConstructorCall(
call: IrFunctionAccessExpression,
newFunction: IrConstructor,
receiversAsArguments: Boolean = false,
argumentsAsReceivers: Boolean = false
): IrConstructorCall =
irConstructorCall(call, newFunction.symbol, receiversAsArguments, argumentsAsReceivers)
fun irConstructorCall( fun irConstructorCall(
call: IrFunctionAccessExpression, call: IrFunctionAccessExpression,
newSymbol: IrConstructorSymbol, newSymbol: IrConstructorSymbol,
@@ -568,42 +536,6 @@ val IrFunctionReference.typeSubstitutionMap: Map<IrTypeParameterSymbol, IrType>
val IrFunctionAccessExpression.typeSubstitutionMap: Map<IrTypeParameterSymbol, IrType> val IrFunctionAccessExpression.typeSubstitutionMap: Map<IrTypeParameterSymbol, IrType>
get() = getTypeSubstitutionMap(symbol.owner) get() = getTypeSubstitutionMap(symbol.owner)
// Note: there is not enough information in a descriptor to choose between an enum entry and its corresponding class,
// so the entry itself is chosen in that case.
fun SymbolTable.referenceMember(descriptor: DeclarationDescriptor, correspondingClassForEnum: Boolean = false): IrSymbol =
descriptor.accept(
object : DeclarationDescriptorVisitorEmptyBodies<IrSymbol, Unit?>() {
override fun visitClassDescriptor(descriptor: ClassDescriptor, data: Unit?) =
if (DescriptorUtils.isEnumEntry(descriptor) && !correspondingClassForEnum)
referenceEnumEntry(descriptor)
else
referenceClass(descriptor)
override fun visitConstructorDescriptor(constructorDescriptor: ConstructorDescriptor, data: Unit?) =
referenceConstructor(descriptor as ClassConstructorDescriptor)
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: Unit?) = referenceSimpleFunction(descriptor)
override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit?) = referenceProperty(descriptor)
override fun visitTypeParameterDescriptor(descriptor: TypeParameterDescriptor, data: Unit?) = referenceTypeParameter(descriptor)
override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, data: Unit?) = referenceTypeAlias(descriptor)
override fun visitDeclarationDescriptor(descriptor: DeclarationDescriptor?, data: Unit?): IrSymbol {
throw AssertionError("Unexpected member descriptor: $descriptor")
}
},
null
)
fun SymbolTable.findOrDeclareExternalPackageFragment(descriptor: PackageFragmentDescriptor) =
referenceExternalPackageFragment(descriptor).also {
if (!it.isBound) {
declareExternalPackageFragment(descriptor)
}
}.owner
val IrDeclaration.isFileClass: Boolean val IrDeclaration.isFileClass: Boolean
get() = origin == IrDeclarationOrigin.FILE_CLASS || origin == IrDeclarationOrigin.SYNTHETIC_FILE_CLASS get() = origin == IrDeclarationOrigin.FILE_CLASS || origin == IrDeclarationOrigin.SYNTHETIC_FILE_CLASS
@@ -1,18 +0,0 @@
/*
* 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.ir.util
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.MemberScope
inline fun ClassDescriptor.findFirstFunction(name: String, predicate: (CallableMemberDescriptor) -> Boolean) =
unsubstitutedMemberScope.findFirstFunction(name, predicate)
inline fun MemberScope.findFirstFunction(name: String, predicate: (CallableMemberDescriptor) -> Boolean) =
getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).first(predicate)
@@ -5,14 +5,12 @@
package org.jetbrains.kotlin.backend.common.serialization package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.descriptors.propertyIfAccessor
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.konan.kotlinLibrary import org.jetbrains.kotlin.descriptors.konan.kotlinLibrary
import org.jetbrains.kotlin.library.metadata.DeserializedSourceFile import org.jetbrains.kotlin.library.metadata.DeserializedSourceFile
import org.jetbrains.kotlin.library.metadata.KlibMetadataDeserializedPackageFragment import org.jetbrains.kotlin.library.metadata.KlibMetadataDeserializedPackageFragment
import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
@@ -29,11 +27,6 @@ tailrec fun DeclarationDescriptor.findPackage(): PackageFragmentDescriptor {
else this.containingDeclaration!!.findPackage() else this.containingDeclaration!!.findPackage()
} }
fun DeclarationDescriptor.findTopLevelDescriptor(): DeclarationDescriptor {
return if (this.containingDeclaration is PackageFragmentDescriptor) this.propertyIfAccessor
else this.containingDeclaration!!.findTopLevelDescriptor()
}
// This is Native specific. Try to eliminate. // This is Native specific. Try to eliminate.
val ModuleDescriptor.isForwardDeclarationModule get() = val ModuleDescriptor.isForwardDeclarationModule get() =
name == Name.special("<forward declarations>") name == Name.special("<forward declarations>")
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.scripting.ide_services.compiler.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.tree.TokenSet import com.intellij.psi.tree.TokenSet
import org.jetbrains.kotlin.backend.common.onlyIf
import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.builtins.isFunctionType
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
@@ -236,7 +235,9 @@ private class KJvmReplCompleter(
) )
Triple(it, presentation, (presentation.presentableText + presentation.tailText).toLowerCase()) Triple(it, presentation, (presentation.presentableText + presentation.tailText).toLowerCase())
} }
.onlyIf({ isSortNeeded }) { it.sortedBy { descTriple -> descTriple.third } } .let {
if (isSortNeeded) it.sortedBy { descTriple -> descTriple.third } else it
}
.forEach { .forEach {
val descriptor = it.first val descriptor = it.first
val (rawName, presentableText, tailText, completionText) = it.second val (rawName, presentableText, tailText, completionText) = it.second