From 45ebe354ee331bbc057136f0683bfd8602111e92 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Sat, 1 Oct 2016 16:33:28 +0300 Subject: [PATCH] Initial support of const and @JvmField properties --- .../jetbrains/kotlin/backend/jvm/JvmLower.kt | 1 + .../ConstAndJvmFieldPropertiesLowering.kt | 86 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 9e2c0c99871..e00245e5649 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -29,6 +29,7 @@ class JvmLower(val context: JvmBackendContext) { fun lower(irFile: IrFile) { // TODO run lowering passes as callbacks in bottom-up visitor FileClassLowering(context).lower(irFile) + ConstAndJvmFieldPropertiesLowering().lower(irFile) PropertiesLowering().lower(irFile) InterfaceLowering(context.state).runOnFile(irFile) InterfaceDelegationLowering(context.state).runOnFile(irFile) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt new file mode 100644 index 00000000000..fa82e237371 --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt @@ -0,0 +1,86 @@ +/* + * 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.backend.jvm.lower + +import org.jetbrains.kotlin.backend.jvm.ClassLoweringPass +import org.jetbrains.kotlin.backend.jvm.FileLoweringPass +import org.jetbrains.kotlin.codegen.JvmCodegenUtil +import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor +import org.jetbrains.kotlin.descriptors.PropertyGetterDescriptor +import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrProperty +import org.jetbrains.kotlin.ir.expressions.IrCall +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression +import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid +import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid + +class ConstAndJvmFieldPropertiesLowering : IrElementTransformerVoid(), FileLoweringPass { + override fun lower(irFile: IrFile) { + irFile.transformChildrenVoid(this) + } + + override fun visitDeclaration(declaration: IrDeclaration): IrStatement { + return super.visitDeclaration(declaration) + } + + override fun visitProperty(declaration: IrProperty): IrStatement { + if (JvmCodegenUtil.isConstOrHasJvmFieldAnnotation(declaration.descriptor)) { + /*Safe or need copy?*/ + declaration.getter = null + declaration.setter = null + } + return super.visitProperty(declaration) + } + + override fun visitMemberAccess(expression: IrMemberAccessExpression): IrExpression { + return super.visitMemberAccess(expression) + } + + override fun visitCall(expression: IrCall): IrExpression { + val descriptor = expression.descriptor + if (descriptor is PropertyAccessorDescriptor && JvmCodegenUtil.isConstOrHasJvmFieldAnnotation(descriptor.correspondingProperty)) { + if (descriptor is PropertyGetterDescriptor) { + return IrGetFieldImpl( + expression.startOffset, + expression.endOffset, + descriptor.correspondingProperty, + expression.dispatchReceiver, + expression.origin, + expression.superQualifier + ) + } + else { + return IrSetFieldImpl( + expression.startOffset, + expression.endOffset, + descriptor.correspondingProperty, + expression.dispatchReceiver, + expression.getValueArgument(descriptor.valueParameters.lastIndex)!!, + expression.origin, + expression.superQualifier + ) + } + } + return super.visitCall(expression) + } +}