Set correct field visibility in psi2ir

This commit is contained in:
Steven Schäfer
2019-08-07 16:35:34 +02:00
committed by Alexander Udalov
parent 6c7a904663
commit a90ac2438d
186 changed files with 1030 additions and 909 deletions
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
@@ -14,8 +16,11 @@ import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor
import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmFieldAnnotation
import org.jetbrains.kotlin.synthetic.SamAdapterExtensionFunctionDescriptor
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.Variance
object JvmGeneratorExtensions : GeneratorExtensions() {
override val externalDeclarationOrigin: ((DeclarationDescriptor) -> IrDeclarationOrigin)? = { descriptor ->
@@ -54,4 +59,10 @@ object JvmGeneratorExtensions : GeneratorExtensions() {
companion object Instance : JvmSamConversion()
}
override fun computeFieldVisibility(descriptor: PropertyDescriptor): Visibility? =
if (descriptor.hasJvmFieldAnnotation() || descriptor is JavaCallableMemberDescriptor)
descriptor.visibility
else
null
}
@@ -73,9 +73,8 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
if (declaration.isInline) {
val irConstructor = declaration.primaryConstructor!!
declaration.declarations.removeIf {
(it is IrConstructor && it.isPrimary) || (it is IrFunction && it.isInlineClassFieldGetter)
}
// The field getter is used by reflection and cannot be removed here.
declaration.declarations.remove(irConstructor)
buildPrimaryInlineClassConstructor(declaration, irConstructor)
buildBoxFunction(declaration)
buildUnboxFunction(declaration)
@@ -6,11 +6,11 @@
package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.SimpleType
open class GeneratorExtensions {
open val externalDeclarationOrigin: ((DeclarationDescriptor) -> IrDeclarationOrigin)?
@@ -32,4 +32,6 @@ open class GeneratorExtensions {
companion object Instance : SamConversion()
}
open fun computeFieldVisibility(descriptor: PropertyDescriptor): Visibility? = null
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
@@ -86,7 +87,8 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
context.symbolTable.declareField(
ktPropertyElement.startOffsetSkippingComments, ktPropertyElement.endOffset,
IrDeclarationOrigin.PROPERTY_BACKING_FIELD,
propertyDescriptor, propertyDescriptor.type.toIrType()
propertyDescriptor, propertyDescriptor.type.toIrType(),
propertyDescriptor.fieldVisibility
).also {
it.initializer = generateInitializer(it)
}
@@ -137,7 +139,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
val endOffset = ktElement.pureEndOffsetOrUndefined
val backingField =
if (propertyDescriptor.hasBackingField(context.bindingContext))
if (propertyDescriptor.hasBackingField(context.bindingContext) && propertyDescriptor.fieldVisibility.admitsFakeOverride)
context.symbolTable.declareFieldWithOverrides(
startOffset, endOffset, IrDeclarationOrigin.FAKE_OVERRIDE,
propertyDescriptor, propertyDescriptor.type.toIrType()
@@ -171,5 +173,16 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
val variableDescriptor = getOrFail(BindingContext.VARIABLE, ktProperty)
return variableDescriptor as? PropertyDescriptor ?: TODO("not a property: $variableDescriptor")
}
private val Visibility.admitsFakeOverride: Boolean
get() = !Visibilities.isPrivate(this) && this != Visibilities.INVISIBLE_FAKE
private val PropertyDescriptor.fieldVisibility: Visibility
get() = declarationGenerator.context.extensions.computeFieldVisibility(this)
?: when {
isLateInit -> setter?.visibility ?: visibility
isConst -> visibility
else -> Visibilities.PRIVATE
}
}
@@ -52,11 +52,12 @@ class IrFieldImpl(
endOffset: Int,
origin: IrDeclarationOrigin,
symbol: IrFieldSymbol,
type: IrType
type: IrType,
visibility: Visibility = symbol.descriptor.visibility
) :
this(
startOffset, endOffset, origin, symbol,
symbol.descriptor.name, type, symbol.descriptor.visibility,
symbol.descriptor.name, type, visibility,
isFinal = !symbol.descriptor.isVar,
isExternal = symbol.descriptor.isEffectivelyExternal(),
isStatic = symbol.descriptor.dispatchReceiverParameter == null
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
@@ -294,8 +294,9 @@ open class SymbolTable : ReferenceSymbolTable {
origin: IrDeclarationOrigin,
descriptor: PropertyDescriptor,
type: IrType,
visibility: Visibility? = null,
fieldFactory: (IrFieldSymbol) -> IrField = {
IrFieldImpl(startOffset, endOffset, origin, it, type).apply {
IrFieldImpl(startOffset, endOffset, origin, it, type, visibility ?: it.descriptor.visibility).apply {
metadata = MetadataSource.Property(it.descriptor)
}
}
@@ -0,0 +1,25 @@
/*
* Copyright 2010-2019 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.backend.js
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
class JsGeneratorExtensions : GeneratorExtensions() {
override fun computeFieldVisibility(descriptor: PropertyDescriptor): Visibility =
if (descriptor.annotations.hasAnnotation(JS_EXPORT_FQ_NAME))
descriptor.visibility
else
Visibilities.PRIVATE
companion object {
val JS_EXPORT_FQ_NAME = FqName("kotlin.js.JsExport")
}
}
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.ir.backend.js
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.backend.common.LoggingContext
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
import org.jetbrains.kotlin.library.impl.buildKoltinLibrary
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.functions.functionInterfacePackageFragmentProvider
import org.jetbrains.kotlin.config.CommonConfigurationKeys
@@ -32,6 +31,7 @@ import org.jetbrains.kotlin.konan.KonanVersionImpl
import org.jetbrains.kotlin.konan.MetaVersion
import org.jetbrains.kotlin.konan.properties.propertyList
import org.jetbrains.kotlin.library.*
import org.jetbrains.kotlin.library.impl.buildKoltinLibrary
import org.jetbrains.kotlin.library.impl.createKotlinLibrary
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -146,7 +145,7 @@ private fun runAnalysisAndPreparePsi2Ir(depsDescriptors: ModulesStructure): Gene
analysisResult.bindingContext,
depsDescriptors.compilerConfiguration.languageVersionSettings,
SymbolTable(),
GeneratorExtensions()
JsGeneratorExtensions()
)
}