Classes & type aliases, initial import.

This commit is contained in:
Dmitry Petrov
2016-08-25 16:38:41 +03:00
committed by Dmitry Petrov
parent b17e3b0299
commit 19e95d232a
29 changed files with 168 additions and 81 deletions
@@ -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
}
}
@@ -42,17 +42,12 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
) )
} }
fun generateClassOrObjectDeclaration(ktDeclaration: KtClassOrObject): IrDeclaration = fun generateClassOrObjectDeclaration(ktClassOrObject: KtClassOrObject): IrClass =
IrDummyDeclaration( ClassGenerator(this).generateClass(ktClassOrObject)
ktDeclaration.startOffset, ktDeclaration.endOffset,
getOrFail(BindingContext.CLASS, ktDeclaration)
)
fun generateTypeAliasDeclaration(ktDeclaration: KtTypeAlias): IrDeclaration = fun generateTypeAliasDeclaration(ktDeclaration: KtTypeAlias): IrDeclaration =
IrDummyDeclaration( IrTypeAliasImpl(ktDeclaration.startOffset, ktDeclaration.endOffset, IrDeclarationOrigin.DEFINED,
ktDeclaration.startOffset, ktDeclaration.endOffset, getOrFail(BindingContext.TYPE_ALIAS, ktDeclaration))
getOrFail(BindingContext.TYPE_ALIAS, ktDeclaration)
)
fun generateFunctionDeclaration(ktNamedFunction: KtNamedFunction): IrFunction { fun generateFunctionDeclaration(ktNamedFunction: KtNamedFunction): IrFunction {
val functionDescriptor = getOrFail(BindingContext.FUNCTION, ktNamedFunction) 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 = fun createFunction(ktFunction: KtFunction, functionDescriptor: FunctionDescriptor, body: IrBody): IrFunction =
IrFunctionImpl(ktFunction.startOffset, ktFunction.endOffset, IrFunctionImpl(ktFunction.startOffset, ktFunction.endOffset,
IrDeclarationOriginKind.DEFINED, functionDescriptor, body) IrDeclarationOrigin.DEFINED, functionDescriptor, body)
fun createSimpleProperty(ktProperty: KtProperty, propertyDescriptor: PropertyDescriptor, valueInitializer: IrBody?): IrSimpleProperty = fun createSimpleProperty(ktProperty: KtProperty, propertyDescriptor: PropertyDescriptor, valueInitializer: IrBody?): IrSimpleProperty =
IrSimplePropertyImpl(ktProperty.startOffset, ktProperty.endOffset, IrSimplePropertyImpl(ktProperty.startOffset, ktProperty.endOffset,
IrDeclarationOriginKind.DEFINED, propertyDescriptor, valueInitializer) IrDeclarationOrigin.DEFINED, propertyDescriptor, valueInitializer)
fun createPropertyGetter( fun createPropertyGetter(
ktPropertyAccessor: KtPropertyAccessor, ktPropertyAccessor: KtPropertyAccessor,
@@ -98,7 +93,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
getterBody: IrBody getterBody: IrBody
): IrPropertyGetter = ): IrPropertyGetter =
IrPropertyGetterImpl(ktPropertyAccessor.startOffset, ktPropertyAccessor.endOffset, IrPropertyGetterImpl(ktPropertyAccessor.startOffset, ktPropertyAccessor.endOffset,
IrDeclarationOriginKind.DEFINED, getterDescriptor, getterBody) IrDeclarationOrigin.DEFINED, getterDescriptor, getterBody)
.apply { irProperty.getter = this } .apply { irProperty.getter = this }
fun createPropertySetter( fun createPropertySetter(
@@ -108,7 +103,7 @@ class DeclarationGenerator(override val context: GeneratorContext) : Generator {
setterBody: IrBody setterBody: IrBody
) : IrPropertySetter = ) : IrPropertySetter =
IrPropertySetterImpl(ktPropertyAccessor.startOffset, ktPropertyAccessor.endOffset, IrPropertySetterImpl(ktPropertyAccessor.startOffset, ktPropertyAccessor.endOffset,
IrDeclarationOriginKind.DEFINED, setterDescriptor, setterBody) IrDeclarationOrigin.DEFINED, setterDescriptor, setterBody)
.apply { irProperty.setter = this } .apply { irProperty.setter = this }
private fun getPropertyDescriptor(ktProperty: KtProperty): PropertyDescriptor { private fun getPropertyDescriptor(ktProperty: KtProperty): PropertyDescriptor {
@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.psi2ir.generators 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.declarations.IrVariableImpl
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.psi.* 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 irNextCall = callGenerator.generateCall(ktLoopRange, nextCall, IrOperator.FOR_LOOP_NEXT)
val irLoopParameter = if (ktLoopParameter != null) { val irLoopParameter = if (ktLoopParameter != null) {
val loopParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktLoopParameter) val loopParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktLoopParameter)
IrVariableImpl(ktLoopParameter.startOffset, ktLoopParameter.endOffset, IrDeclarationOriginKind.DEFINED, IrVariableImpl(ktLoopParameter.startOffset, ktLoopParameter.endOffset, IrDeclarationOrigin.DEFINED,
loopParameterDescriptor, irNextCall) loopParameterDescriptor, irNextCall)
} }
else { else {
@@ -17,7 +17,7 @@
package org.jetbrains.kotlin.psi2ir.generators package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor 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.IrVariable
import org.jetbrains.kotlin.ir.declarations.IrVariableImpl import org.jetbrains.kotlin.ir.declarations.IrVariableImpl
import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor
@@ -40,7 +40,7 @@ class Scope(val scopeOwner: DeclarationDescriptor) {
fun createTemporaryVariable(irExpression: IrExpression, nameHint: String? = null): IrVariable = fun createTemporaryVariable(irExpression: IrExpression, nameHint: String? = null): IrVariable =
IrVariableImpl( IrVariableImpl(
irExpression.startOffset, irExpression.endOffset, IrDeclarationOriginKind.IR_TEMPORARY_VARIABLE, irExpression.startOffset, irExpression.endOffset, IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
createDescriptorForTemporaryVariable(irExpression.type, nameHint), createDescriptorForTemporaryVariable(irExpression.type, nameHint),
irExpression irExpression
) )
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.assertCast 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.declarations.IrVariableImpl
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -67,7 +67,7 @@ class StatementGenerator(
val variableDescriptor = getOrFail(BindingContext.VARIABLE, property) 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() irLocalVariable.initializer = property.initializer?.genExpr()
return irLocalVariable return irLocalVariable
} }
@@ -96,7 +96,7 @@ class StatementGenerator(
val componentVariable = getOrFail(BindingContext.VARIABLE, ktEntry) val componentVariable = getOrFail(BindingContext.VARIABLE, ktEntry)
val irComponentCall = callGenerator.generateCall(ktEntry.startOffset, ktEntry.endOffset, componentSubstitutedCall, val irComponentCall = callGenerator.generateCall(ktEntry.startOffset, ktEntry.endOffset, componentSubstitutedCall,
IrOperator.COMPONENT_N.withIndex(index + 1)) 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) componentVariable, irComponentCall)
irBlock.addStatement(irComponentVar) irBlock.addStatement(irComponentVar)
} }
@@ -17,7 +17,7 @@
package org.jetbrains.kotlin.psi2ir.generators package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor 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.IrVariable
import org.jetbrains.kotlin.ir.declarations.IrVariableImpl import org.jetbrains.kotlin.ir.declarations.IrVariableImpl
import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptor
@@ -21,38 +21,36 @@ import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import java.util.* import java.util.*
interface IrClassElement : IrElement
interface IrClass : IrDeclaration { interface IrClass : IrDeclaration {
override val declarationKind: IrDeclarationKind override val declarationKind: IrDeclarationKind
get() = IrDeclarationKind.CLASS get() = IrDeclarationKind.CLASS
override val descriptor: ClassDescriptor override val descriptor: ClassDescriptor
val children: List<IrClassElement> val members: List<IrDeclaration>
} }
class IrClassImpl( class IrClassImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
override val descriptor: ClassDescriptor override val descriptor: ClassDescriptor
) : IrDeclarationBase(startOffset, endOffset, originKind), IrClass { ) : IrDeclarationBase(startOffset, endOffset, origin), IrClass {
override val children: MutableList<IrClassElement> = ArrayList() override val members: MutableList<IrDeclaration> = ArrayList()
fun addElement(child: IrClassElement) { fun addMember(member: IrDeclaration) {
child.assertDetached() member.assertDetached()
child.setTreeLocation(this, children.size) member.setTreeLocation(this, members.size)
children.add(child) members.add(member)
} }
override fun getChild(slot: Int): IrElement? = override fun getChild(slot: Int): IrElement? =
children.getOrNull(slot) members.getOrNull(slot)
override fun replaceChild(slot: Int, newChild: IrElement) { override fun replaceChild(slot: Int, newChild: IrElement) {
newChild.assertDetached() newChild.assertDetached()
children.getOrNull(slot)?.detach() ?: throwNoSuchSlot(slot) members.getOrNull(slot)?.detach() ?: throwNoSuchSlot(slot)
children[slot] = newChild.assertCast() members[slot] = newChild.assertCast()
newChild.setTreeLocation(this, slot) newChild.setTreeLocation(this, slot)
} }
@@ -60,7 +58,7 @@ class IrClassImpl(
visitor.visitClass(this, data) visitor.visitClass(this, data)
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) { override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
children.forEach { it.accept(visitor, data) } members.forEach { it.accept(visitor, data) }
} }
} }
@@ -20,10 +20,10 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.IrElementBase import org.jetbrains.kotlin.ir.IrElementBase
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
interface IrDeclaration : IrStatement, IrClassElement { interface IrDeclaration : IrStatement {
val descriptor: DeclarationDescriptor? val descriptor: DeclarationDescriptor?
val declarationKind: IrDeclarationKind val declarationKind: IrDeclarationKind
val originKind: IrDeclarationOriginKind val origin: IrDeclarationOrigin
} }
enum class IrDeclarationKind { enum class IrDeclarationKind {
@@ -32,13 +32,15 @@ enum class IrDeclarationKind {
FUNCTION, FUNCTION,
PROPERTY_GETTER, PROPERTY_GETTER,
PROPERTY_SETTER, PROPERTY_SETTER,
CONSTRUCTOR,
PROPERTY, PROPERTY,
VARIABLE, VARIABLE,
CLASS, CLASS,
TYPEALIAS,
DUMMY; DUMMY;
} }
enum class IrDeclarationOriginKind { enum class IrDeclarationOrigin {
DEFINED, DEFINED,
IR_TEMPORARY_VARIABLE, IR_TEMPORARY_VARIABLE,
} }
@@ -46,5 +48,5 @@ enum class IrDeclarationOriginKind {
abstract class IrDeclarationBase( abstract class IrDeclarationBase(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
override val originKind: IrDeclarationOriginKind override val origin: IrDeclarationOrigin
) : IrElementBase(startOffset, endOffset), IrDeclaration ) : IrElementBase(startOffset, endOffset), IrDeclaration
@@ -25,7 +25,7 @@ class IrDummyDeclaration(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
override val descriptor: DeclarationDescriptor override val descriptor: DeclarationDescriptor
) : IrDeclarationBase(startOffset, endOffset, IrDeclarationOriginKind.DEFINED) { ) : IrDeclarationBase(startOffset, endOffset, IrDeclarationOrigin.DEFINED) {
override val declarationKind: IrDeclarationKind get() = IrDeclarationKind.DUMMY override val declarationKind: IrDeclarationKind get() = IrDeclarationKind.DUMMY
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R { override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
@@ -32,9 +32,9 @@ interface IrFunction : IrDeclaration {
abstract class IrFunctionBase( abstract class IrFunctionBase(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
body: IrBody? = null body: IrBody? = null
) : IrDeclarationBase(startOffset, endOffset, originKind), IrFunction { ) : IrDeclarationBase(startOffset, endOffset, origin), IrFunction {
init { init {
body?.setTreeLocation(this, FUNCTION_BODY_SLOT) body?.setTreeLocation(this, FUNCTION_BODY_SLOT)
} }
@@ -70,10 +70,10 @@ abstract class IrFunctionBase(
class IrFunctionImpl( class IrFunctionImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
override val descriptor: FunctionDescriptor, override val descriptor: FunctionDescriptor,
body: IrBody body: IrBody
) : IrFunctionBase(startOffset, endOffset, originKind, body) { ) : IrFunctionBase(startOffset, endOffset, origin, body) {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitFunction(this, data) visitor.visitFunction(this, data)
} }
@@ -44,9 +44,9 @@ interface IrDelegatedProperty : IrProperty {
abstract class IrPropertyBase( abstract class IrPropertyBase(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
override val descriptor: PropertyDescriptor override val descriptor: PropertyDescriptor
) : IrDeclarationBase(startOffset, endOffset, originKind), IrProperty { ) : IrDeclarationBase(startOffset, endOffset, origin), IrProperty {
override var getter: IrPropertyGetter? = null override var getter: IrPropertyGetter? = null
set(newGetter) { set(newGetter) {
newGetter?.run { assert(property == null) { "$newGetter: should not have a property" } } newGetter?.run { assert(property == null) { "$newGetter: should not have a property" } }
@@ -70,10 +70,10 @@ abstract class IrPropertyBase(
class IrSimplePropertyImpl( class IrSimplePropertyImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
valueInitializer: IrBody? = null valueInitializer: IrBody? = null
) : IrPropertyBase(startOffset, endOffset, originKind, descriptor), IrSimpleProperty { ) : IrPropertyBase(startOffset, endOffset, origin, descriptor), IrSimpleProperty {
override var valueInitializer: IrBody? = valueInitializer override var valueInitializer: IrBody? = valueInitializer
set(value) { set(value) {
value?.assertDetached() value?.assertDetached()
@@ -106,10 +106,10 @@ class IrSimplePropertyImpl(
class IrDelegatedPropertyImpl( class IrDelegatedPropertyImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
delegateInitializer: IrBody delegateInitializer: IrBody
) : IrPropertyBase(startOffset, endOffset, originKind, descriptor), IrDelegatedProperty { ) : IrPropertyBase(startOffset, endOffset, origin, descriptor), IrDelegatedProperty {
override var delegateInitializer: IrBody = delegateInitializer override var delegateInitializer: IrBody = delegateInitializer
set(value) { set(value) {
value.assertDetached() value.assertDetached()
@@ -44,19 +44,19 @@ interface IrPropertySetter : IrPropertyAccessor {
abstract class IrPropertyAccessorBase( abstract class IrPropertyAccessorBase(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
body: IrBody body: IrBody
) : IrFunctionBase(startOffset, endOffset, originKind, body), IrPropertyAccessor { ) : IrFunctionBase(startOffset, endOffset, origin, body), IrPropertyAccessor {
override var property: IrProperty? = null override var property: IrProperty? = null
} }
class IrPropertyGetterImpl( class IrPropertyGetterImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
override val descriptor: PropertyGetterDescriptor, override val descriptor: PropertyGetterDescriptor,
body: IrBody body: IrBody
) : IrPropertyAccessorBase(startOffset, endOffset, originKind, body), IrPropertyGetter { ) : IrPropertyAccessorBase(startOffset, endOffset, origin, body), IrPropertyGetter {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitPropertyGetter(this, data) visitor.visitPropertyGetter(this, data)
} }
@@ -64,10 +64,10 @@ class IrPropertyGetterImpl(
class IrPropertySetterImpl( class IrPropertySetterImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
override val descriptor: PropertySetterDescriptor, override val descriptor: PropertySetterDescriptor,
body: IrBody body: IrBody
) : IrPropertyAccessorBase(startOffset, endOffset, originKind, body), IrPropertySetter { ) : IrPropertyAccessorBase(startOffset, endOffset, origin, body), IrPropertySetter {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitPropertySetter(this, data) visitor.visitPropertySetter(this, data)
} }
@@ -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 <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitTypeAlias(this, data)
}
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
// no children
}
override fun getChild(slot: Int): IrElement? = null
override fun replaceChild(slot: Int, newChild: IrElement) {
// no children
}
}
@@ -33,16 +33,16 @@ interface IrVariable : IrDeclaration {
class IrVariableImpl( class IrVariableImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
override val descriptor: VariableDescriptor override val descriptor: VariableDescriptor
) : IrDeclarationBase(startOffset, endOffset, originKind), IrVariable { ) : IrDeclarationBase(startOffset, endOffset, origin), IrVariable {
constructor( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
originKind: IrDeclarationOriginKind, origin: IrDeclarationOrigin,
descriptor: VariableDescriptor, descriptor: VariableDescriptor,
initializer: IrExpression initializer: IrExpression
) : this(startOffset, endOffset, originKind, descriptor) { ) : this(startOffset, endOffset, origin, descriptor) {
this.initializer = initializer this.initializer = initializer
} }
@@ -51,6 +51,12 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitPropertySetter(declaration: IrPropertySetter, data: Nothing?): String = override fun visitPropertySetter(declaration: IrPropertySetter, data: Nothing?): String =
"PROPERTY_SETTER ${declaration.descriptor.render()} property=${declaration.property?.name()}" "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 = override fun visitVariable(declaration: IrVariable, data: Nothing?): String =
"VAR ${declaration.descriptor.render()}" "VAR ${declaration.descriptor.render()}"
@@ -27,6 +27,7 @@ interface IrElementVisitor<out R, in D> {
fun visitDeclaration(declaration: IrDeclaration, data: D): R = visitElement(declaration, data) fun visitDeclaration(declaration: IrDeclaration, data: D): R = visitElement(declaration, data)
fun visitClass(declaration: IrClass, data: D): R = visitDeclaration(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 visitFunction(declaration: IrFunction, data: D): R = visitDeclaration(declaration, data)
fun visitPropertyGetter(declaration: IrPropertyGetter, data: D): R = visitFunction(declaration, data) fun visitPropertyGetter(declaration: IrPropertyGetter, data: D): R = visitFunction(declaration, data)
fun visitPropertySetter(declaration: IrPropertySetter, data: D): R = visitFunction(declaration, data) fun visitPropertySetter(declaration: IrPropertySetter, data: D): R = visitFunction(declaration, data)
+1 -1
View File
@@ -11,7 +11,7 @@ FILE /arrayAugmentedAssignment1.kt
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing
CONST Int type=kotlin.Int value='42' CONST Int type=kotlin.Int value='42'
DUMMY C CLASS CLASS C
FUN public fun testVariable(): kotlin.Unit FUN public fun testVariable(): kotlin.Unit
BLOCK_BODY BLOCK_BODY
VAR var x: kotlin.IntArray VAR var x: kotlin.IntArray
+2 -2
View File
@@ -1,6 +1,6 @@
FILE /arrayAugmentedAssignment2.kt FILE /arrayAugmentedAssignment2.kt
DUMMY IA CLASS INTERFACE IA
DUMMY IB CLASS INTERFACE IB
FUN public fun IB.test(/*0*/ a: IA): kotlin.Unit FUN public fun IB.test(/*0*/ a: IA): kotlin.Unit
BLOCK_BODY BLOCK_BODY
BLOCK type=kotlin.Unit operator=PLUSEQ BLOCK type=kotlin.Unit operator=PLUSEQ
+1 -1
View File
@@ -1,5 +1,5 @@
FILE /assignments.kt FILE /assignments.kt
DUMMY Ref CLASS CLASS Ref
FUN public fun test1(): kotlin.Unit FUN public fun test1(): kotlin.Unit
BLOCK_BODY BLOCK_BODY
VAR var x: kotlin.Int VAR var x: kotlin.Int
+1 -1
View File
@@ -1,5 +1,5 @@
FILE /augmentedAssignment2.kt FILE /augmentedAssignment2.kt
DUMMY A CLASS CLASS A
FUN public operator fun A.plusAssign(/*0*/ s: kotlin.String): kotlin.Unit FUN public operator fun A.plusAssign(/*0*/ s: kotlin.String): kotlin.Unit
BLOCK_BODY BLOCK_BODY
FUN public operator fun A.minusAssign(/*0*/ s: kotlin.String): kotlin.Unit FUN public operator fun A.minusAssign(/*0*/ s: kotlin.String): kotlin.Unit
+1 -1
View File
@@ -1,5 +1,5 @@
FILE /chainOfSafeCalls.kt FILE /chainOfSafeCalls.kt
DUMMY C CLASS CLASS C
FUN public fun test(/*0*/ nc: C?): C? FUN public fun test(/*0*/ nc: C?): C?
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing
+2 -2
View File
@@ -1,6 +1,6 @@
FILE /conventionComparisons.kt FILE /conventionComparisons.kt
DUMMY IA CLASS INTERFACE IA
DUMMY IB CLASS INTERFACE IB
FUN public fun IB.test1(/*0*/ a1: IA, /*1*/ a2: IA): kotlin.Boolean FUN public fun IB.test1(/*0*/ a1: IA, /*1*/ a2: IA): kotlin.Boolean
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing
+3 -3
View File
@@ -1,7 +1,7 @@
FILE /forWithImplicitReceivers.kt FILE /forWithImplicitReceivers.kt
DUMMY FiveTimes CLASS OBJECT FiveTimes
DUMMY IntCell CLASS CLASS IntCell
DUMMY IReceiver CLASS INTERFACE IReceiver
FUN public fun IReceiver.test(): kotlin.Unit FUN public fun IReceiver.test(): kotlin.Unit
BLOCK_BODY BLOCK_BODY
BLOCK type=kotlin.Unit operator=FOR_LOOP BLOCK type=kotlin.Unit operator=FOR_LOOP
@@ -1,5 +1,5 @@
FILE /safeCallWithIncrementDecrement.kt FILE /safeCallWithIncrementDecrement.kt
DUMMY C CLASS CLASS C
PROPERTY public var test.C?.p: kotlin.Int getter=<get-p> setter=<set-p> PROPERTY public var test.C?.p: kotlin.Int getter=<get-p> setter=<set-p>
PROPERTY_GETTER public fun test.C?.<get-p>(): kotlin.Int property=p PROPERTY_GETTER public fun test.C?.<get-p>(): kotlin.Int property=p
BLOCK_BODY BLOCK_BODY
+2 -2
View File
@@ -1,6 +1,6 @@
FILE /safeCalls.kt FILE /safeCalls.kt
DUMMY Ref CLASS CLASS Ref
DUMMY IHost CLASS INTERFACE IHost
FUN public fun test1(/*0*/ x: kotlin.String?): kotlin.Int? FUN public fun test1(/*0*/ x: kotlin.String?): kotlin.Int?
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing
@@ -1,6 +1,6 @@
FILE /smartCastsWithDestructuring.kt FILE /smartCastsWithDestructuring.kt
DUMMY I1 CLASS INTERFACE I1
DUMMY I2 CLASS INTERFACE I2
FUN public operator fun I1.component1(): kotlin.Int FUN public operator fun I1.component1(): kotlin.Int
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing
+1 -1
View File
@@ -1,5 +1,5 @@
FILE /typeOperators.kt FILE /typeOperators.kt
DUMMY IThing CLASS INTERFACE IThing
FUN public fun test1(/*0*/ x: kotlin.Any): kotlin.Boolean FUN public fun test1(/*0*/ x: kotlin.Any): kotlin.Boolean
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing
+3 -3
View File
@@ -1,10 +1,10 @@
FILE /values.kt FILE /values.kt
DUMMY Enum CLASS ENUM_CLASS Enum
DUMMY A CLASS OBJECT A
PROPERTY public val a: kotlin.Int = 0 getter=null setter=null PROPERTY public val a: kotlin.Int = 0 getter=null setter=null
EXPRESSION_BODY EXPRESSION_BODY
CONST Int type=kotlin.Int value='0' CONST Int type=kotlin.Int value='0'
DUMMY Z CLASS CLASS Z
FUN public fun test1(): Enum FUN public fun test1(): Enum
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing
+1 -1
View File
@@ -1,5 +1,5 @@
FILE /when.kt FILE /when.kt
DUMMY A CLASS OBJECT A
FUN public fun testWithSubject(/*0*/ x: kotlin.Any?): kotlin.String FUN public fun testWithSubject(/*0*/ x: kotlin.Any?): kotlin.String
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing RETURN type=kotlin.Nothing