From 19e95d232ad1b18bc7872f8122dc7f98f176ad18 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 25 Aug 2016 16:38:41 +0300 Subject: [PATCH] Classes & type aliases, initial import. --- .../psi2ir/generators/ClassGenerator.kt | 36 ++++++++++++++ .../psi2ir/generators/DeclarationGenerator.kt | 21 +++----- .../generators/LoopExpressionGenerator.kt | 4 +- .../kotlin/psi2ir/generators/Scope.kt | 4 +- .../psi2ir/generators/StatementGenerator.kt | 6 +-- .../generators/TemporaryVariableFactory.kt | 2 +- .../kotlin/ir/declarations/IrClass.kt | 26 +++++----- .../kotlin/ir/declarations/IrDeclaration.kt | 10 ++-- .../ir/declarations/IrDummyDeclaration.kt | 2 +- .../kotlin/ir/declarations/IrFunction.kt | 8 +-- .../kotlin/ir/declarations/IrProperty.kt | 12 ++--- .../ir/declarations/IrPropertyAccessor.kt | 12 ++--- .../kotlin/ir/declarations/IrTypeAlias.kt | 49 +++++++++++++++++++ .../kotlin/ir/declarations/IrVariable.kt | 8 +-- .../kotlin/ir/util/RenderIrElement.kt | 6 +++ .../kotlin/ir/visitors/IrElementVisitor.kt | 1 + .../ir/irText/arrayAugmentedAssignment1.txt | 2 +- .../ir/irText/arrayAugmentedAssignment2.txt | 4 +- compiler/testData/ir/irText/assignments.txt | 2 +- .../ir/irText/augmentedAssignment2.txt | 2 +- .../testData/ir/irText/chainOfSafeCalls.txt | 2 +- .../ir/irText/conventionComparisons.txt | 4 +- .../ir/irText/forWithImplicitReceivers.txt | 6 +-- .../irText/safeCallWithIncrementDecrement.txt | 2 +- compiler/testData/ir/irText/safeCalls.txt | 4 +- .../ir/irText/smartCastsWithDestructuring.txt | 4 +- compiler/testData/ir/irText/typeOperators.txt | 2 +- compiler/testData/ir/irText/values.txt | 6 +-- compiler/testData/ir/irText/when.txt | 2 +- 29 files changed, 168 insertions(+), 81 deletions(-) create mode 100644 compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt create mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeAlias.kt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt new file mode 100644 index 00000000000..99b7233c8e6 --- /dev/null +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -0,0 +1,36 @@ +/* + * 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.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrClassImpl +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.resolve.BindingContext + +class ClassGenerator(val declarationGenerator: DeclarationGenerator) : Generator { + override val context: GeneratorContext get() = declarationGenerator.context + + fun generateClass(ktClassOrObject: KtClassOrObject): IrClass { + val descriptor = getOrFail(BindingContext.CLASS, ktClassOrObject) + val irClass = IrClassImpl(ktClassOrObject.startOffset, ktClassOrObject.endOffset, IrDeclarationOrigin.DEFINED, descriptor) + // TODO generate members + return irClass + } +} diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt index 33ee5e39b32..b3c2ccd70b7 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DeclarationGenerator.kt @@ -42,17 +42,12 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { ) } - fun generateClassOrObjectDeclaration(ktDeclaration: KtClassOrObject): IrDeclaration = - IrDummyDeclaration( - ktDeclaration.startOffset, ktDeclaration.endOffset, - getOrFail(BindingContext.CLASS, ktDeclaration) - ) + fun generateClassOrObjectDeclaration(ktClassOrObject: KtClassOrObject): IrClass = + ClassGenerator(this).generateClass(ktClassOrObject) fun generateTypeAliasDeclaration(ktDeclaration: KtTypeAlias): IrDeclaration = - IrDummyDeclaration( - ktDeclaration.startOffset, ktDeclaration.endOffset, - getOrFail(BindingContext.TYPE_ALIAS, ktDeclaration) - ) + IrTypeAliasImpl(ktDeclaration.startOffset, ktDeclaration.endOffset, IrDeclarationOrigin.DEFINED, + getOrFail(BindingContext.TYPE_ALIAS, ktDeclaration)) fun generateFunctionDeclaration(ktNamedFunction: KtNamedFunction): IrFunction { val functionDescriptor = getOrFail(BindingContext.FUNCTION, ktNamedFunction) @@ -85,11 +80,11 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { fun createFunction(ktFunction: KtFunction, functionDescriptor: FunctionDescriptor, body: IrBody): IrFunction = IrFunctionImpl(ktFunction.startOffset, ktFunction.endOffset, - IrDeclarationOriginKind.DEFINED, functionDescriptor, body) + IrDeclarationOrigin.DEFINED, functionDescriptor, body) fun createSimpleProperty(ktProperty: KtProperty, propertyDescriptor: PropertyDescriptor, valueInitializer: IrBody?): IrSimpleProperty = IrSimplePropertyImpl(ktProperty.startOffset, ktProperty.endOffset, - IrDeclarationOriginKind.DEFINED, propertyDescriptor, valueInitializer) + IrDeclarationOrigin.DEFINED, propertyDescriptor, valueInitializer) fun createPropertyGetter( ktPropertyAccessor: KtPropertyAccessor, @@ -98,7 +93,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { getterBody: IrBody ): IrPropertyGetter = IrPropertyGetterImpl(ktPropertyAccessor.startOffset, ktPropertyAccessor.endOffset, - IrDeclarationOriginKind.DEFINED, getterDescriptor, getterBody) + IrDeclarationOrigin.DEFINED, getterDescriptor, getterBody) .apply { irProperty.getter = this } fun createPropertySetter( @@ -108,7 +103,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator { setterBody: IrBody ) : IrPropertySetter = IrPropertySetterImpl(ktPropertyAccessor.startOffset, ktPropertyAccessor.endOffset, - IrDeclarationOriginKind.DEFINED, setterDescriptor, setterBody) + IrDeclarationOrigin.DEFINED, setterDescriptor, setterBody) .apply { irProperty.setter = this } private fun getPropertyDescriptor(ktProperty: KtProperty): PropertyDescriptor { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt index 98c62d73bdd..20ccabd530e 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/LoopExpressionGenerator.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.psi2ir.generators -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginKind +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrVariableImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.psi.* @@ -138,7 +138,7 @@ class LoopExpressionGenerator(val statementGenerator: StatementGenerator) : Gene val irNextCall = callGenerator.generateCall(ktLoopRange, nextCall, IrOperator.FOR_LOOP_NEXT) val irLoopParameter = if (ktLoopParameter != null) { val loopParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktLoopParameter) - IrVariableImpl(ktLoopParameter.startOffset, ktLoopParameter.endOffset, IrDeclarationOriginKind.DEFINED, + IrVariableImpl(ktLoopParameter.startOffset, ktLoopParameter.endOffset, IrDeclarationOrigin.DEFINED, loopParameterDescriptor, irNextCall) } else { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Scope.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Scope.kt index b96b1ecff81..0c52cf160bb 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Scope.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/Scope.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginKind +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.IrVariableImpl import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor @@ -40,7 +40,7 @@ class Scope(val scopeOwner: DeclarationDescriptor) { fun createTemporaryVariable(irExpression: IrExpression, nameHint: String? = null): IrVariable = IrVariableImpl( - irExpression.startOffset, irExpression.endOffset, IrDeclarationOriginKind.IR_TEMPORARY_VARIABLE, + irExpression.startOffset, irExpression.endOffset, IrDeclarationOrigin.IR_TEMPORARY_VARIABLE, createDescriptorForTemporaryVariable(irExpression.type, nameHint), irExpression ) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt index 8ae79954de1..51c6b2dad5f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.assertCast -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginKind +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrVariableImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.psi.* @@ -67,7 +67,7 @@ class StatementGenerator( val variableDescriptor = getOrFail(BindingContext.VARIABLE, property) - val irLocalVariable = IrVariableImpl(property.startOffset, property.endOffset, IrDeclarationOriginKind.DEFINED, variableDescriptor) + val irLocalVariable = IrVariableImpl(property.startOffset, property.endOffset, IrDeclarationOrigin.DEFINED, variableDescriptor) irLocalVariable.initializer = property.initializer?.genExpr() return irLocalVariable } @@ -96,7 +96,7 @@ class StatementGenerator( val componentVariable = getOrFail(BindingContext.VARIABLE, ktEntry) val irComponentCall = callGenerator.generateCall(ktEntry.startOffset, ktEntry.endOffset, componentSubstitutedCall, IrOperator.COMPONENT_N.withIndex(index + 1)) - val irComponentVar = IrVariableImpl(ktEntry.startOffset, ktEntry.endOffset, IrDeclarationOriginKind.DEFINED, + val irComponentVar = IrVariableImpl(ktEntry.startOffset, ktEntry.endOffset, IrDeclarationOrigin.DEFINED, componentVariable, irComponentCall) irBlock.addStatement(irComponentVar) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TemporaryVariableFactory.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TemporaryVariableFactory.kt index 8a24d7662d2..af851e68684 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TemporaryVariableFactory.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TemporaryVariableFactory.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginKind +import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.IrVariableImpl import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt index 4bb4b8864eb..a7e84c3ca3c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt @@ -21,38 +21,36 @@ import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import java.util.* -interface IrClassElement : IrElement - interface IrClass : IrDeclaration { override val declarationKind: IrDeclarationKind get() = IrDeclarationKind.CLASS override val descriptor: ClassDescriptor - val children: List + val members: List } class IrClassImpl( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, override val descriptor: ClassDescriptor -) : IrDeclarationBase(startOffset, endOffset, originKind), IrClass { - override val children: MutableList = ArrayList() +) : IrDeclarationBase(startOffset, endOffset, origin), IrClass { + override val members: MutableList = ArrayList() - fun addElement(child: IrClassElement) { - child.assertDetached() - child.setTreeLocation(this, children.size) - children.add(child) + fun addMember(member: IrDeclaration) { + member.assertDetached() + member.setTreeLocation(this, members.size) + members.add(member) } override fun getChild(slot: Int): IrElement? = - children.getOrNull(slot) + members.getOrNull(slot) override fun replaceChild(slot: Int, newChild: IrElement) { newChild.assertDetached() - children.getOrNull(slot)?.detach() ?: throwNoSuchSlot(slot) - children[slot] = newChild.assertCast() + members.getOrNull(slot)?.detach() ?: throwNoSuchSlot(slot) + members[slot] = newChild.assertCast() newChild.setTreeLocation(this, slot) } @@ -60,7 +58,7 @@ class IrClassImpl( visitor.visitClass(this, data) override fun acceptChildren(visitor: IrElementVisitor, data: D) { - children.forEach { it.accept(visitor, data) } + members.forEach { it.accept(visitor, data) } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt index e70a32cdf00..0bdf6565813 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt @@ -20,10 +20,10 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.IrStatement -interface IrDeclaration : IrStatement, IrClassElement { +interface IrDeclaration : IrStatement { val descriptor: DeclarationDescriptor? val declarationKind: IrDeclarationKind - val originKind: IrDeclarationOriginKind + val origin: IrDeclarationOrigin } enum class IrDeclarationKind { @@ -32,13 +32,15 @@ enum class IrDeclarationKind { FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, + CONSTRUCTOR, PROPERTY, VARIABLE, CLASS, + TYPEALIAS, DUMMY; } -enum class IrDeclarationOriginKind { +enum class IrDeclarationOrigin { DEFINED, IR_TEMPORARY_VARIABLE, } @@ -46,5 +48,5 @@ enum class IrDeclarationOriginKind { abstract class IrDeclarationBase( startOffset: Int, endOffset: Int, - override val originKind: IrDeclarationOriginKind + override val origin: IrDeclarationOrigin ) : IrElementBase(startOffset, endOffset), IrDeclaration diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDummyDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDummyDeclaration.kt index 2105abefa98..f98468d6936 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDummyDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDummyDeclaration.kt @@ -25,7 +25,7 @@ class IrDummyDeclaration( startOffset: Int, endOffset: Int, override val descriptor: DeclarationDescriptor -) : IrDeclarationBase(startOffset, endOffset, IrDeclarationOriginKind.DEFINED) { +) : IrDeclarationBase(startOffset, endOffset, IrDeclarationOrigin.DEFINED) { override val declarationKind: IrDeclarationKind get() = IrDeclarationKind.DUMMY override fun accept(visitor: IrElementVisitor, data: D): R { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt index b688d0e2954..3a27c00b7ce 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt @@ -32,9 +32,9 @@ interface IrFunction : IrDeclaration { abstract class IrFunctionBase( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, body: IrBody? = null -) : IrDeclarationBase(startOffset, endOffset, originKind), IrFunction { +) : IrDeclarationBase(startOffset, endOffset, origin), IrFunction { init { body?.setTreeLocation(this, FUNCTION_BODY_SLOT) } @@ -70,10 +70,10 @@ abstract class IrFunctionBase( class IrFunctionImpl( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, override val descriptor: FunctionDescriptor, body: IrBody -) : IrFunctionBase(startOffset, endOffset, originKind, body) { +) : IrFunctionBase(startOffset, endOffset, origin, body) { override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitFunction(this, data) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt index a9ba7c09679..58c0743028b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt @@ -44,9 +44,9 @@ interface IrDelegatedProperty : IrProperty { abstract class IrPropertyBase( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, override val descriptor: PropertyDescriptor -) : IrDeclarationBase(startOffset, endOffset, originKind), IrProperty { +) : IrDeclarationBase(startOffset, endOffset, origin), IrProperty { override var getter: IrPropertyGetter? = null set(newGetter) { newGetter?.run { assert(property == null) { "$newGetter: should not have a property" } } @@ -70,10 +70,10 @@ abstract class IrPropertyBase( class IrSimplePropertyImpl( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, descriptor: PropertyDescriptor, valueInitializer: IrBody? = null -) : IrPropertyBase(startOffset, endOffset, originKind, descriptor), IrSimpleProperty { +) : IrPropertyBase(startOffset, endOffset, origin, descriptor), IrSimpleProperty { override var valueInitializer: IrBody? = valueInitializer set(value) { value?.assertDetached() @@ -106,10 +106,10 @@ class IrSimplePropertyImpl( class IrDelegatedPropertyImpl( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, descriptor: PropertyDescriptor, delegateInitializer: IrBody -) : IrPropertyBase(startOffset, endOffset, originKind, descriptor), IrDelegatedProperty { +) : IrPropertyBase(startOffset, endOffset, origin, descriptor), IrDelegatedProperty { override var delegateInitializer: IrBody = delegateInitializer set(value) { value.assertDetached() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrPropertyAccessor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrPropertyAccessor.kt index 9bff67ac239..2d623354110 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrPropertyAccessor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrPropertyAccessor.kt @@ -44,19 +44,19 @@ interface IrPropertySetter : IrPropertyAccessor { abstract class IrPropertyAccessorBase( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, body: IrBody -) : IrFunctionBase(startOffset, endOffset, originKind, body), IrPropertyAccessor { +) : IrFunctionBase(startOffset, endOffset, origin, body), IrPropertyAccessor { override var property: IrProperty? = null } class IrPropertyGetterImpl( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, override val descriptor: PropertyGetterDescriptor, body: IrBody -) : IrPropertyAccessorBase(startOffset, endOffset, originKind, body), IrPropertyGetter { +) : IrPropertyAccessorBase(startOffset, endOffset, origin, body), IrPropertyGetter { override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitPropertyGetter(this, data) } @@ -64,10 +64,10 @@ class IrPropertyGetterImpl( class IrPropertySetterImpl( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, override val descriptor: PropertySetterDescriptor, body: IrBody -) : IrPropertyAccessorBase(startOffset, endOffset, originKind, body), IrPropertySetter { +) : IrPropertyAccessorBase(startOffset, endOffset, origin, body), IrPropertySetter { override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitPropertySetter(this, data) } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeAlias.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeAlias.kt new file mode 100644 index 00000000000..4f87a6fa452 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrTypeAlias.kt @@ -0,0 +1,49 @@ +/* + * 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 + +import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.visitors.IrElementVisitor + +interface IrTypeAlias : IrDeclaration { + override val descriptor: TypeAliasDescriptor + + override val declarationKind: IrDeclarationKind + get() = IrDeclarationKind.TYPEALIAS +} + +class IrTypeAliasImpl( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + override val descriptor: TypeAliasDescriptor +) : IrDeclarationBase(startOffset, endOffset, origin), IrTypeAlias { + override fun accept(visitor: IrElementVisitor, data: D): R { + return visitor.visitTypeAlias(this, data) + } + + override fun acceptChildren(visitor: IrElementVisitor, data: D) { + // no children + } + + override fun getChild(slot: Int): IrElement? = null + + override fun replaceChild(slot: Int, newChild: IrElement) { + // no children + } +} \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrVariable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrVariable.kt index 4553754f24a..60a487ce551 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrVariable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrVariable.kt @@ -33,16 +33,16 @@ interface IrVariable : IrDeclaration { class IrVariableImpl( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, override val descriptor: VariableDescriptor -) : IrDeclarationBase(startOffset, endOffset, originKind), IrVariable { +) : IrDeclarationBase(startOffset, endOffset, origin), IrVariable { constructor( startOffset: Int, endOffset: Int, - originKind: IrDeclarationOriginKind, + origin: IrDeclarationOrigin, descriptor: VariableDescriptor, initializer: IrExpression - ) : this(startOffset, endOffset, originKind, descriptor) { + ) : this(startOffset, endOffset, origin, descriptor) { this.initializer = initializer } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt index 31f48439a12..d77c2ff1cec 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt @@ -51,6 +51,12 @@ class RenderIrElementVisitor : IrElementVisitor { override fun visitPropertySetter(declaration: IrPropertySetter, data: Nothing?): String = "PROPERTY_SETTER ${declaration.descriptor.render()} property=${declaration.property?.name()}" + override fun visitClass(declaration: IrClass, data: Nothing?): String = + "CLASS ${declaration.descriptor.kind} ${declaration.descriptor.name}" + + override fun visitTypeAlias(declaration: IrTypeAlias, data: Nothing?): String = + "TYPEALIAS ${declaration.descriptor.name} type=${declaration.descriptor.underlyingType.render()}" + override fun visitVariable(declaration: IrVariable, data: Nothing?): String = "VAR ${declaration.descriptor.render()}" diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt index 2ed2a2ef210..ca1296049ef 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt @@ -27,6 +27,7 @@ interface IrElementVisitor { fun visitDeclaration(declaration: IrDeclaration, data: D): R = visitElement(declaration, data) fun visitClass(declaration: IrClass, data: D): R = visitDeclaration(declaration, data) + fun visitTypeAlias(declaration: IrTypeAlias, data: D): R = visitDeclaration(declaration, data) fun visitFunction(declaration: IrFunction, data: D): R = visitDeclaration(declaration, data) fun visitPropertyGetter(declaration: IrPropertyGetter, data: D): R = visitFunction(declaration, data) fun visitPropertySetter(declaration: IrPropertySetter, data: D): R = visitFunction(declaration, data) diff --git a/compiler/testData/ir/irText/arrayAugmentedAssignment1.txt b/compiler/testData/ir/irText/arrayAugmentedAssignment1.txt index 1b8e2407016..dc7bccbc8ec 100644 --- a/compiler/testData/ir/irText/arrayAugmentedAssignment1.txt +++ b/compiler/testData/ir/irText/arrayAugmentedAssignment1.txt @@ -11,7 +11,7 @@ FILE /arrayAugmentedAssignment1.kt BLOCK_BODY RETURN type=kotlin.Nothing CONST Int type=kotlin.Int value='42' - DUMMY C + CLASS CLASS C FUN public fun testVariable(): kotlin.Unit BLOCK_BODY VAR var x: kotlin.IntArray diff --git a/compiler/testData/ir/irText/arrayAugmentedAssignment2.txt b/compiler/testData/ir/irText/arrayAugmentedAssignment2.txt index d7dbe5fe099..aad780f0538 100644 --- a/compiler/testData/ir/irText/arrayAugmentedAssignment2.txt +++ b/compiler/testData/ir/irText/arrayAugmentedAssignment2.txt @@ -1,6 +1,6 @@ FILE /arrayAugmentedAssignment2.kt - DUMMY IA - DUMMY IB + CLASS INTERFACE IA + CLASS INTERFACE IB FUN public fun IB.test(/*0*/ a: IA): kotlin.Unit BLOCK_BODY BLOCK type=kotlin.Unit operator=PLUSEQ diff --git a/compiler/testData/ir/irText/assignments.txt b/compiler/testData/ir/irText/assignments.txt index b304cbce81c..f4dda6a3c8b 100644 --- a/compiler/testData/ir/irText/assignments.txt +++ b/compiler/testData/ir/irText/assignments.txt @@ -1,5 +1,5 @@ FILE /assignments.kt - DUMMY Ref + CLASS CLASS Ref FUN public fun test1(): kotlin.Unit BLOCK_BODY VAR var x: kotlin.Int diff --git a/compiler/testData/ir/irText/augmentedAssignment2.txt b/compiler/testData/ir/irText/augmentedAssignment2.txt index bdf0bc5865c..c65902d86be 100644 --- a/compiler/testData/ir/irText/augmentedAssignment2.txt +++ b/compiler/testData/ir/irText/augmentedAssignment2.txt @@ -1,5 +1,5 @@ FILE /augmentedAssignment2.kt - DUMMY A + CLASS CLASS A FUN public operator fun A.plusAssign(/*0*/ s: kotlin.String): kotlin.Unit BLOCK_BODY FUN public operator fun A.minusAssign(/*0*/ s: kotlin.String): kotlin.Unit diff --git a/compiler/testData/ir/irText/chainOfSafeCalls.txt b/compiler/testData/ir/irText/chainOfSafeCalls.txt index 44ef35e5260..599eeeb4e17 100644 --- a/compiler/testData/ir/irText/chainOfSafeCalls.txt +++ b/compiler/testData/ir/irText/chainOfSafeCalls.txt @@ -1,5 +1,5 @@ FILE /chainOfSafeCalls.kt - DUMMY C + CLASS CLASS C FUN public fun test(/*0*/ nc: C?): C? BLOCK_BODY RETURN type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/conventionComparisons.txt b/compiler/testData/ir/irText/conventionComparisons.txt index 914072a66bf..6b06bbef88d 100644 --- a/compiler/testData/ir/irText/conventionComparisons.txt +++ b/compiler/testData/ir/irText/conventionComparisons.txt @@ -1,6 +1,6 @@ FILE /conventionComparisons.kt - DUMMY IA - DUMMY IB + CLASS INTERFACE IA + CLASS INTERFACE IB FUN public fun IB.test1(/*0*/ a1: IA, /*1*/ a2: IA): kotlin.Boolean BLOCK_BODY RETURN type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/forWithImplicitReceivers.txt b/compiler/testData/ir/irText/forWithImplicitReceivers.txt index a067cfc35aa..2bfb0e5e13b 100644 --- a/compiler/testData/ir/irText/forWithImplicitReceivers.txt +++ b/compiler/testData/ir/irText/forWithImplicitReceivers.txt @@ -1,7 +1,7 @@ FILE /forWithImplicitReceivers.kt - DUMMY FiveTimes - DUMMY IntCell - DUMMY IReceiver + CLASS OBJECT FiveTimes + CLASS CLASS IntCell + CLASS INTERFACE IReceiver FUN public fun IReceiver.test(): kotlin.Unit BLOCK_BODY BLOCK type=kotlin.Unit operator=FOR_LOOP diff --git a/compiler/testData/ir/irText/safeCallWithIncrementDecrement.txt b/compiler/testData/ir/irText/safeCallWithIncrementDecrement.txt index 529f591cc7d..95a276f4831 100644 --- a/compiler/testData/ir/irText/safeCallWithIncrementDecrement.txt +++ b/compiler/testData/ir/irText/safeCallWithIncrementDecrement.txt @@ -1,5 +1,5 @@ FILE /safeCallWithIncrementDecrement.kt - DUMMY C + CLASS CLASS C PROPERTY public var test.C?.p: kotlin.Int getter= setter= PROPERTY_GETTER public fun test.C?.(): kotlin.Int property=p BLOCK_BODY diff --git a/compiler/testData/ir/irText/safeCalls.txt b/compiler/testData/ir/irText/safeCalls.txt index 0ffe37c5229..86e4115f0c4 100644 --- a/compiler/testData/ir/irText/safeCalls.txt +++ b/compiler/testData/ir/irText/safeCalls.txt @@ -1,6 +1,6 @@ FILE /safeCalls.kt - DUMMY Ref - DUMMY IHost + CLASS CLASS Ref + CLASS INTERFACE IHost FUN public fun test1(/*0*/ x: kotlin.String?): kotlin.Int? BLOCK_BODY RETURN type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/smartCastsWithDestructuring.txt b/compiler/testData/ir/irText/smartCastsWithDestructuring.txt index 8be070005d0..810fa7f8ef0 100644 --- a/compiler/testData/ir/irText/smartCastsWithDestructuring.txt +++ b/compiler/testData/ir/irText/smartCastsWithDestructuring.txt @@ -1,6 +1,6 @@ FILE /smartCastsWithDestructuring.kt - DUMMY I1 - DUMMY I2 + CLASS INTERFACE I1 + CLASS INTERFACE I2 FUN public operator fun I1.component1(): kotlin.Int BLOCK_BODY RETURN type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/typeOperators.txt b/compiler/testData/ir/irText/typeOperators.txt index eaf22a3738b..f828a1b84fa 100644 --- a/compiler/testData/ir/irText/typeOperators.txt +++ b/compiler/testData/ir/irText/typeOperators.txt @@ -1,5 +1,5 @@ FILE /typeOperators.kt - DUMMY IThing + CLASS INTERFACE IThing FUN public fun test1(/*0*/ x: kotlin.Any): kotlin.Boolean BLOCK_BODY RETURN type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/values.txt b/compiler/testData/ir/irText/values.txt index 4bd3b8ba7b6..edbe0e8d05a 100644 --- a/compiler/testData/ir/irText/values.txt +++ b/compiler/testData/ir/irText/values.txt @@ -1,10 +1,10 @@ FILE /values.kt - DUMMY Enum - DUMMY A + CLASS ENUM_CLASS Enum + CLASS OBJECT A PROPERTY public val a: kotlin.Int = 0 getter=null setter=null EXPRESSION_BODY CONST Int type=kotlin.Int value='0' - DUMMY Z + CLASS CLASS Z FUN public fun test1(): Enum BLOCK_BODY RETURN type=kotlin.Nothing diff --git a/compiler/testData/ir/irText/when.txt b/compiler/testData/ir/irText/when.txt index 9a1a101f900..9ed9a6183d2 100644 --- a/compiler/testData/ir/irText/when.txt +++ b/compiler/testData/ir/irText/when.txt @@ -1,5 +1,5 @@ FILE /when.kt - DUMMY A + CLASS OBJECT A FUN public fun testWithSubject(/*0*/ x: kotlin.Any?): kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing