IR: remove base classes IrDeclarationBase and IrFunctionBase

They introduce a diamond class hierarchy which prevents IR element
hierarchy from being transformed to classes.
This commit is contained in:
Alexander Udalov
2020-07-21 23:30:30 +02:00
parent 9152df4702
commit b02653a524
14 changed files with 194 additions and 168 deletions
@@ -19,21 +19,30 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrAnonymousInitializer
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrAnonymousInitializerSymbol
class IrAnonymousInitializerImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrAnonymousInitializerSymbol,
override val isStatic: Boolean = false
) : IrDeclarationBase(startOffset, endOffset, origin), IrAnonymousInitializer {
) : IrAnonymousInitializer {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@ObsoleteDescriptorBasedAPI
override val descriptor: ClassDescriptor
get() = symbol.descriptor
@@ -19,14 +19,15 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
class IrClassImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrClassSymbol,
override val name: Name,
override val kind: ClassKind,
@@ -40,11 +41,17 @@ class IrClassImpl(
override val isExpect: Boolean = false,
override val isFun: Boolean = false,
override val source: SourceElement = SourceElement.NO_SOURCE
) : IrDeclarationBase(startOffset, endOffset, origin), IrClass {
) : IrClass {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@ObsoleteDescriptorBasedAPI
override val descriptor: ClassDescriptor
get() = symbol.descriptor
@@ -19,29 +19,54 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
class IrConstructorImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrConstructorSymbol,
name: Name,
visibility: Visibility,
override val name: Name,
override var visibility: Visibility,
returnType: IrType,
isInline: Boolean,
isExternal: Boolean,
override val isInline: Boolean,
override val isExternal: Boolean,
override val isPrimary: Boolean,
isExpect: Boolean
) : IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType), IrConstructor {
override val isExpect: Boolean,
) : IrConstructor {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@Suppress("DEPRECATION")
override var returnType: IrType = returnType
get() = if (field === org.jetbrains.kotlin.ir.types.impl.IrUninitializedType) {
error("Return type is not initialized")
} else {
field
}
override var typeParameters: List<IrTypeParameter> = emptyList()
override var dispatchReceiverParameter: IrValueParameter? = null
override var extensionReceiverParameter: IrValueParameter? = null
override var valueParameters: List<IrValueParameter> = emptyList()
override var body: IrBody? = null
override var metadata: MetadataSource? = null
@ObsoleteDescriptorBasedAPI
override val descriptor: ClassConstructorDescriptor
get() = symbol.descriptor
@@ -1,43 +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.declarations.impl
import org.jetbrains.kotlin.ir.IrElementBase
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
abstract class IrDeclarationBase(
startOffset: Int,
endOffset: Int,
override var origin: IrDeclarationOrigin
) : IrElementBase(startOffset, endOffset), IrDeclaration {
override val factory: IrFactory
get() = IrFactoryImpl
private var _parent: IrDeclarationParent? = null
override var parent: IrDeclarationParent
get() = _parent
?: throw UninitializedPropertyAccessException("Parent not initialized: $this")
set(v) {
_parent = v
}
override var annotations: List<IrConstructorCall> = emptyList()
}
@@ -18,24 +18,29 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
import org.jetbrains.kotlin.name.Name
class IrEnumEntryImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrEnumEntrySymbol,
override val name: Name
) : IrDeclarationBase(startOffset, endOffset, origin), IrEnumEntry {
) : IrEnumEntry {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@ObsoleteDescriptorBasedAPI
override val descriptor: ClassDescriptor
get() = symbol.descriptor
@@ -18,12 +18,23 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrErrorDeclaration
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
@OptIn(ObsoleteDescriptorBasedAPI::class)
class IrErrorDeclarationImpl(
startOffset: Int,
endOffset: Int,
override val startOffset: Int,
override val endOffset: Int,
override val descriptor: DeclarationDescriptor
) : IrDeclarationBase(startOffset, endOffset, IrDeclarationOrigin.DEFINED), IrErrorDeclaration
) : IrErrorDeclaration {
override var origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
}
@@ -19,9 +19,8 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
@@ -29,9 +28,9 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
class IrFieldImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrFieldSymbol,
override val name: Name,
override val type: IrType,
@@ -39,11 +38,17 @@ class IrFieldImpl(
override val isFinal: Boolean,
override val isExternal: Boolean,
override val isStatic: Boolean,
) : IrDeclarationBase(startOffset, endOffset, origin), IrField {
) : IrField {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@ObsoleteDescriptorBasedAPI
override val descriptor: PropertyDescriptor
get() = symbol.descriptor
@@ -1,53 +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.declarations.impl
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
abstract class IrFunctionBase(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val name: Name,
override var visibility: Visibility,
override val isInline: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean,
returnType: IrType
) : IrDeclarationBase(startOffset, endOffset, origin), IrFunction {
@Suppress("DEPRECATION")
final override var returnType: IrType = returnType
get() = if (field === org.jetbrains.kotlin.ir.types.impl.IrUninitializedType) {
error("Return type is not initialized")
} else {
field
}
override var typeParameters: List<IrTypeParameter> = emptyList()
override var dispatchReceiverParameter: IrValueParameter? = null
override var extensionReceiverParameter: IrValueParameter? = null
override var valueParameters: List<IrValueParameter> = emptyList()
final override var body: IrBody? = null
override var metadata: MetadataSource? = null
}
@@ -9,31 +9,54 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFakeOverrideFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
abstract class IrFunctionCommonImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
name: Name,
visibility: Visibility,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val name: Name,
override var visibility: Visibility,
returnType: IrType,
isInline: Boolean,
isExternal: Boolean,
override val isInline: Boolean,
override val isExternal: Boolean,
override val isTailrec: Boolean,
override val isSuspend: Boolean,
override val isOperator: Boolean,
override val isInfix: Boolean,
isExpect: Boolean,
) : IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType), IrSimpleFunction {
override val isExpect: Boolean,
) : IrSimpleFunction {
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@Suppress("DEPRECATION")
override var returnType: IrType = returnType
get() = if (field === org.jetbrains.kotlin.ir.types.impl.IrUninitializedType) {
error("Return type is not initialized")
} else {
field
}
override var typeParameters: List<IrTypeParameter> = emptyList()
override var dispatchReceiverParameter: IrValueParameter? = null
override var extensionReceiverParameter: IrValueParameter? = null
override var valueParameters: List<IrValueParameter> = emptyList()
override var body: IrBody? = null
override var metadata: MetadataSource? = null
override var overriddenSymbols: List<IrSimpleFunctionSymbol> = emptyList()
@Suppress("LeakingThis")
@@ -19,23 +19,30 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrLocalDelegatedPropertySymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
class IrLocalDelegatedPropertyImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrLocalDelegatedPropertySymbol,
override val name: Name,
override val type: IrType,
override val isVar: Boolean
) : IrDeclarationBase(startOffset, endOffset, origin), IrLocalDelegatedProperty {
) : IrLocalDelegatedProperty {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@ObsoleteDescriptorBasedAPI
override val descriptor: VariableDescriptorWithAccessors
get() = symbol.descriptor
@@ -22,13 +22,14 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.name.Name
abstract class IrPropertyCommonImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val name: Name,
override var visibility: Visibility,
override val isVar: Boolean,
@@ -37,7 +38,13 @@ abstract class IrPropertyCommonImpl(
override val isDelegated: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean,
) : IrDeclarationBase(startOffset, endOffset, origin), IrProperty {
) : IrProperty {
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
override var backingField: IrField? = null
override var getter: IrSimpleFunction? = null
@@ -8,27 +8,32 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrTypeAlias
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
class IrTypeAliasImpl(
startOffset: Int,
endOffset: Int,
override val startOffset: Int,
override val endOffset: Int,
override val symbol: IrTypeAliasSymbol,
override val name: Name,
override var visibility: Visibility,
override val expandedType: IrType,
override val isActual: Boolean,
origin: IrDeclarationOrigin
) : IrDeclarationBase(startOffset, endOffset, origin), IrTypeAlias {
override var origin: IrDeclarationOrigin
) : IrTypeAlias {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@ObsoleteDescriptorBasedAPI
override val descriptor: TypeAliasDescriptor
get() = symbol.descriptor
@@ -18,8 +18,11 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
@@ -27,19 +30,25 @@ import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.SmartList
class IrTypeParameterImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrTypeParameterSymbol,
override val name: Name,
override val index: Int,
override val isReified: Boolean,
override val variance: Variance
) : IrDeclarationBase(startOffset, endOffset, origin), IrTypeParameter {
) : IrTypeParameter {
init {
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
@ObsoleteDescriptorBasedAPI
override val descriptor: TypeParameterDescriptor
get() = symbol.descriptor
@@ -18,17 +18,20 @@ package org.jetbrains.kotlin.ir.declarations.impl
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
class IrValueParameterImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val symbol: IrValueParameterSymbol,
override val name: Name,
override val index: Int,
@@ -36,7 +39,7 @@ class IrValueParameterImpl(
override val varargElementType: IrType?,
override val isCrossinline: Boolean,
override val isNoinline: Boolean
) : IrDeclarationBase(startOffset, endOffset, origin), IrValueParameter {
) : IrValueParameter {
@ObsoleteDescriptorBasedAPI
override val descriptor: ParameterDescriptor
get() = symbol.descriptor
@@ -45,5 +48,11 @@ class IrValueParameterImpl(
symbol.bind(this)
}
override val factory: IrFactory
get() = IrFactoryImpl
override lateinit var parent: IrDeclarationParent
override var annotations: List<IrConstructorCall> = emptyList()
override var defaultValue: IrExpressionBody? = null
}