Set correct field visibility in psi2ir
This commit is contained in:
committed by
Alexander Udalov
parent
6c7a904663
commit
a90ac2438d
+12
-1
@@ -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
|
||||
}
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
+4
-2
@@ -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
|
||||
}
|
||||
|
||||
+15
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+25
@@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user