diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt index 271319860f8..67ec0092e50 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.backend.common.ir.Ir import org.jetbrains.kotlin.backend.common.ir.SharedVariablesManager import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol @@ -35,4 +36,5 @@ interface BackendContext { val transformedFunction: MutableMap val lateinitNullableFields: MutableMap val extractedLocalClasses: MutableSet + val irFactory: IrFactory } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index 7d4cfa27805..60f12759c3a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.backend.js.ir.JsIrDeclarationBuilder import org.jetbrains.kotlin.ir.backend.js.lower.JsInnerClassesSupport import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns @@ -54,6 +55,7 @@ class JsIrBackendContext( override var inVerbosePhase: Boolean = false + override val irFactory: IrFactory = IrFactoryImpl override val jsIrDeclarationBuilder: JsIrDeclarationBuilder = JsIrDeclarationBuilder() val devMode = configuration[JSConfigurationKeys.DEVELOPER_MODE] ?: false diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index 5d5ae944e31..30151cadfb9 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.irBlock import org.jetbrains.kotlin.ir.builders.irNull import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionReference @@ -60,6 +61,8 @@ class JvmBackendContext( override val extractedLocalClasses: MutableSet = hashSetOf() + override val irFactory: IrFactory = IrFactoryImpl + override val scriptMode: Boolean = false override val lateinitNullableFields = mutableMapOf() diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt index fd355a8866a..197806ba059 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.ir.backend.js.JsSharedVariablesManager import org.jetbrains.kotlin.ir.backend.js.ir.JsIrDeclarationBuilder import org.jetbrains.kotlin.ir.backend.js.lower.JsInnerClassesSupport import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol @@ -42,6 +43,7 @@ class WasmBackendContext( override val transformedFunction = mutableMapOf() override val lateinitNullableFields = mutableMapOf() override val extractedLocalClasses: MutableSet = hashSetOf() + override val irFactory: IrFactory = IrFactoryImpl override val jsIrDeclarationBuilder: JsIrDeclarationBuilder = JsIrDeclarationBuilder() // Place to store declarations excluded from code generation diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFactory.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFactory.kt new file mode 100644 index 00000000000..e71bc5a571b --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFactory.kt @@ -0,0 +1,195 @@ +/* + * 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.declarations + +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.ir.symbols.* +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.types.Variance + +interface IrFactory { + fun createAnonymousInitializer( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrAnonymousInitializerSymbol, + isStatic: Boolean = false, + ): IrAnonymousInitializer + + fun createClass( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrClassSymbol, + name: Name, + kind: ClassKind, + visibility: Visibility, + modality: Modality, + isCompanion: Boolean = false, + isInner: Boolean = false, + isData: Boolean = false, + isExternal: Boolean = false, + isInline: Boolean = false, + isExpect: Boolean = false, + isFun: Boolean = false, + source: SourceElement = SourceElement.NO_SOURCE, + ): IrClass + + fun createConstructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrConstructorSymbol, + name: Name, + visibility: Visibility, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + isPrimary: Boolean, + isExpect: Boolean, + ): IrConstructor + + fun createEnumEntry( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrEnumEntrySymbol, + name: Name, + ): IrEnumEntry + + fun createErrorDeclaration( + startOffset: Int, + endOffset: Int, + descriptor: DeclarationDescriptor, + ): IrErrorDeclaration + + fun createField( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrFieldSymbol, + name: Name, + type: IrType, + visibility: Visibility, + isFinal: Boolean, + isExternal: Boolean, + isStatic: Boolean, + ): IrField + + fun createFunction( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrSimpleFunctionSymbol, + name: Name, + visibility: Visibility, + modality: Modality, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + isTailrec: Boolean, + isSuspend: Boolean, + isOperator: Boolean, + isInfix: Boolean, + isExpect: Boolean, + isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE, + ): IrSimpleFunction + + fun createFakeOverrideFunction( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + visibility: Visibility, + modality: Modality, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + isTailrec: Boolean, + isSuspend: Boolean, + isOperator: Boolean, + isInfix: Boolean, + isExpect: Boolean, + ): IrSimpleFunction + + fun createLocalDelegatedProperty( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrLocalDelegatedPropertySymbol, + name: Name, + type: IrType, + isVar: Boolean, + ): IrLocalDelegatedProperty + + fun createProperty( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrPropertySymbol, + name: Name, + visibility: Visibility, + modality: Modality, + isVar: Boolean, + isConst: Boolean, + isLateinit: Boolean, + isDelegated: Boolean, + isExternal: Boolean, + isExpect: Boolean = false, + isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE, + ): IrProperty + + fun createFakeOverrideProperty( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + visibility: Visibility, + modality: Modality, + isVar: Boolean, + isConst: Boolean, + isLateinit: Boolean, + isDelegated: Boolean, + isExternal: Boolean, + isExpect: Boolean, + ): IrFakeOverrideProperty + + fun createTypeAlias( + startOffset: Int, + endOffset: Int, + symbol: IrTypeAliasSymbol, + name: Name, + visibility: Visibility, + expandedType: IrType, + isActual: Boolean, + origin: IrDeclarationOrigin, + ): IrTypeAlias + + fun createTypeParameter( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrTypeParameterSymbol, + name: Name, + index: Int, + isReified: Boolean, + variance: Variance, + ): IrTypeParameter + + fun createValueParameter( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrValueParameterSymbol, + name: Name, + index: Int, + type: IrType, + varargElementType: IrType?, + isCrossinline: Boolean, + isNoinline: Boolean, + ): IrValueParameter +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFactoryImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFactoryImpl.kt new file mode 100644 index 00000000000..fcd4d7c3cc4 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFactoryImpl.kt @@ -0,0 +1,225 @@ +/* + * 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.declarations.impl + +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.symbols.* +import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.types.Variance + +object IrFactoryImpl : IrFactory { + override fun createAnonymousInitializer( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrAnonymousInitializerSymbol, + isStatic: Boolean, + ): IrAnonymousInitializer = + IrAnonymousInitializerImpl(startOffset, endOffset, origin, symbol, isStatic) + + override fun createClass( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrClassSymbol, + name: Name, + kind: ClassKind, + visibility: Visibility, + modality: Modality, + isCompanion: Boolean, + isInner: Boolean, + isData: Boolean, + isExternal: Boolean, + isInline: Boolean, + isExpect: Boolean, + isFun: Boolean, + source: SourceElement, + ): IrClass = + IrClassImpl( + startOffset, endOffset, origin, symbol, name, kind, visibility, modality, + isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun, source, + ) + + override fun createConstructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrConstructorSymbol, + name: Name, + visibility: Visibility, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + isPrimary: Boolean, + isExpect: Boolean, + ): IrConstructor = + IrConstructorImpl(startOffset, endOffset, origin, symbol, name, visibility, returnType, isInline, isExternal, isPrimary, isExpect) + + override fun createEnumEntry( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrEnumEntrySymbol, + name: Name, + ): IrEnumEntry = + IrEnumEntryImpl(startOffset, endOffset, origin, symbol, name) + + override fun createErrorDeclaration( + startOffset: Int, + endOffset: Int, + descriptor: DeclarationDescriptor, + ): IrErrorDeclaration = + IrErrorDeclarationImpl(startOffset, endOffset, descriptor) + + override fun createField( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrFieldSymbol, + name: Name, + type: IrType, + visibility: Visibility, + isFinal: Boolean, + isExternal: Boolean, + isStatic: Boolean, + ): IrField = + IrFieldImpl(startOffset, endOffset, origin, symbol, name, type, visibility, isFinal, isExternal, isStatic) + + override fun createFunction( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrSimpleFunctionSymbol, + name: Name, + visibility: Visibility, + modality: Modality, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + isTailrec: Boolean, + isSuspend: Boolean, + isOperator: Boolean, + isInfix: Boolean, + isExpect: Boolean, + isFakeOverride: Boolean, + ): IrSimpleFunction = + IrFunctionImpl( + startOffset, endOffset, origin, symbol, name, visibility, modality, returnType, + isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride, + ) + + override fun createFakeOverrideFunction( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + visibility: Visibility, + modality: Modality, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + isTailrec: Boolean, + isSuspend: Boolean, + isOperator: Boolean, + isInfix: Boolean, + isExpect: Boolean, + ): IrSimpleFunction = + IrFakeOverrideFunctionImpl( + startOffset, endOffset, origin, name, visibility, modality, returnType, + isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, + ) + + override fun createLocalDelegatedProperty( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrLocalDelegatedPropertySymbol, + name: Name, + type: IrType, + isVar: Boolean, + ): IrLocalDelegatedProperty = + IrLocalDelegatedPropertyImpl(startOffset, endOffset, origin, symbol, name, type, isVar) + + override fun createProperty( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrPropertySymbol, + name: Name, + visibility: Visibility, + modality: Modality, + isVar: Boolean, + isConst: Boolean, + isLateinit: Boolean, + isDelegated: Boolean, + isExternal: Boolean, + isExpect: Boolean, + isFakeOverride: Boolean, + ): IrProperty = + IrPropertyImpl( + startOffset, endOffset, origin, symbol, name, visibility, modality, + isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride, + ) + + override fun createFakeOverrideProperty( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + visibility: Visibility, + modality: Modality, + isVar: Boolean, + isConst: Boolean, + isLateinit: Boolean, + isDelegated: Boolean, + isExternal: Boolean, + isExpect: Boolean, + ): IrFakeOverrideProperty = + IrFakeOverridePropertyImpl( + startOffset, endOffset, origin, name, visibility, modality, + isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, + ) + + override fun createTypeAlias( + startOffset: Int, + endOffset: Int, + symbol: IrTypeAliasSymbol, + name: Name, + visibility: Visibility, + expandedType: IrType, + isActual: Boolean, + origin: IrDeclarationOrigin, + ): IrTypeAlias = + IrTypeAliasImpl(startOffset, endOffset, symbol, name, visibility, expandedType, isActual, origin) + + override fun createTypeParameter( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrTypeParameterSymbol, + name: Name, + index: Int, + isReified: Boolean, + variance: Variance, + ): IrTypeParameter = + IrTypeParameterImpl(startOffset, endOffset, origin, symbol, name, index, isReified, variance) + + override fun createValueParameter( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrValueParameterSymbol, + name: Name, + index: Int, + type: IrType, + varargElementType: IrType?, + isCrossinline: Boolean, + isNoinline: Boolean, + ): IrValueParameter = + IrValueParameterImpl(startOffset, endOffset, origin, symbol, name, index, type, varargElementType, isCrossinline, isNoinline) +}