[FIR2IR] Handle local visibility around signature composer properly

This commit is contained in:
Mikhail Glukhikh
2020-07-22 11:52:35 +03:00
parent 828524bde4
commit 8bae0f2d0c
7 changed files with 49 additions and 32 deletions
@@ -232,7 +232,7 @@ class Fir2IrClassifierStorage(
} else {
regularClass.modality ?: Modality.FINAL
}
val signature = signatureComposer.composeSignature(regularClass)
val signature = if (regularClass.isLocal) null else signatureComposer.composeSignature(regularClass)
val irClass = regularClass.convertWithOffsets { startOffset, endOffset ->
declareIrClass(signature) { symbol ->
IrClassImpl(
@@ -275,7 +275,7 @@ class Fir2IrClassifierStorage(
): IrClass {
val origin = IrDeclarationOrigin.DEFINED
val modality = Modality.FINAL
val signature = signatureComposer.composeSignature(anonymousObject)
val signature = null
val result = anonymousObject.convertWithOffsets { startOffset, endOffset ->
declareIrClass(signature) { symbol ->
IrClassImpl(
@@ -85,7 +85,9 @@ class Fir2IrConverter(
irClass: IrClass = classifierStorage.getCachedIrClass(anonymousObject)!!
): IrClass {
anonymousObject.getPrimaryConstructorIfAny()?.let {
irClass.declarations += declarationStorage.createIrConstructor(it, irClass)
irClass.declarations += declarationStorage.createIrConstructor(
it, irClass, isLocal = true
)
}
for (declaration in sortBySynthetic(anonymousObject.declarations)) {
if (declaration is FirRegularClass) {
@@ -110,7 +112,9 @@ class Fir2IrConverter(
irClass: IrClass = classifierStorage.getCachedIrClass(regularClass)!!
): IrClass {
regularClass.getPrimaryConstructorIfAny()?.let {
irClass.declarations += declarationStorage.createIrConstructor(it, irClass)
irClass.declarations += declarationStorage.createIrConstructor(
it, irClass, isLocal = regularClass.isLocal
)
}
for (declaration in sortBySynthetic(regularClass.declarations)) {
val irDeclaration = processMemberDeclaration(declaration, regularClass, irClass) ?: continue
@@ -143,15 +147,21 @@ class Fir2IrConverter(
containingClass: FirClass<*>?,
parent: IrDeclarationParent
): IrDeclaration? {
val isLocal = containingClass != null &&
(containingClass !is FirRegularClass || containingClass.isLocal)
return when (declaration) {
is FirRegularClass -> {
processClassMembers(declaration)
}
is FirSimpleFunction -> {
declarationStorage.createIrFunction(declaration, parent)
declarationStorage.createIrFunction(
declaration, parent, isLocal = isLocal
)
}
is FirProperty -> {
declarationStorage.createIrProperty(declaration, parent)
declarationStorage.createIrProperty(
declaration, parent, isLocal = isLocal
)
}
is FirField -> {
if (declaration.isSynthetic) {
@@ -161,7 +171,9 @@ class Fir2IrConverter(
}
}
is FirConstructor -> if (!declaration.isPrimary) {
declarationStorage.createIrConstructor(declaration, parent as IrClass)
declarationStorage.createIrConstructor(
declaration, parent as IrClass, isLocal = isLocal
)
} else {
null
}
@@ -367,7 +367,8 @@ class Fir2IrDeclarationStorage(
function: FirFunction<*>,
irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
isLocal: Boolean = false
): IrSimpleFunction {
val simpleFunction = function as? FirSimpleFunction
val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL
@@ -384,7 +385,7 @@ class Fir2IrDeclarationStorage(
val isSuspend =
if (isLambda) ((function as FirAnonymousFunction).typeRef as? FirResolvedTypeRef)?.isSuspend == true
else simpleFunction?.isSuspend == true
val signature = signatureComposer.composeSignature(function)
val signature = if (isLocal) null else signatureComposer.composeSignature(function)
val created = function.convertWithOffsets { startOffset, endOffset ->
val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol ->
IrFunctionImpl(
@@ -455,11 +456,12 @@ class Fir2IrDeclarationStorage(
fun createIrConstructor(
constructor: FirConstructor,
irParent: IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
isLocal: Boolean = false
): IrConstructor {
val isPrimary = constructor.isPrimary
classifierStorage.preCacheTypeParameters(constructor)
val signature = signatureComposer.composeSignature(constructor)
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor)
val created = constructor.convertWithOffsets { startOffset, endOffset ->
declareIrConstructor(signature) { symbol ->
IrConstructorImpl(
@@ -504,10 +506,11 @@ class Fir2IrDeclarationStorage(
isSetter: Boolean,
origin: IrDeclarationOrigin,
startOffset: Int,
endOffset: Int
endOffset: Int,
isLocal: Boolean = false
): IrSimpleFunction {
val prefix = if (isSetter) "set" else "get"
val signature = signatureComposer.composeAccessorSignature(property, isSetter)
val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter)
return declareIrAccessor(
signature,
(correspondingProperty.descriptor as? WrappedPropertyDescriptorWithContainerSource)?.containerSource,
@@ -617,10 +620,11 @@ class Fir2IrDeclarationStorage(
property: FirProperty,
irParent: IrDeclarationParent?,
thisReceiverOwner: IrClass? = irParent as? IrClass,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
isLocal: Boolean = false
): IrProperty {
classifierStorage.preCacheTypeParameters(property)
val signature = signatureComposer.composeSignature(property)
val signature = if (isLocal) null else signatureComposer.composeSignature(property)
return property.convertWithOffsets { startOffset, endOffset ->
val result = declareIrProperty(signature, property.containerSource) { symbol ->
IrPropertyImpl(
@@ -680,7 +684,7 @@ class Fir2IrDeclarationStorage(
getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
else -> origin
},
startOffset, endOffset
startOffset, endOffset, isLocal
)
if (property.isVar) {
this.setter = createIrPropertyAccessor(
@@ -690,7 +694,7 @@ class Fir2IrDeclarationStorage(
setter is FirDefaultPropertySetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR
else -> origin
},
startOffset, endOffset
startOffset, endOffset, isLocal
)
}
leaveScope(this)
@@ -222,7 +222,7 @@ class Fir2IrVisitor(
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement {
val irFunction = if (simpleFunction.visibility == Visibilities.LOCAL) {
declarationStorage.createIrFunction(
simpleFunction, irParent = conversionScope.parent()
simpleFunction, irParent = conversionScope.parent(), isLocal = true
)
} else {
declarationStorage.getCachedIrFunction(simpleFunction)!!
@@ -237,7 +237,7 @@ class Fir2IrVisitor(
override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Any?): IrElement {
return anonymousFunction.convertWithOffsets { startOffset, endOffset ->
val irFunction = declarationStorage.createIrFunction(
anonymousFunction, irParent = conversionScope.parent()
anonymousFunction, irParent = conversionScope.parent(), isLocal = true
)
conversionScope.withFunction(irFunction) {
memberGenerator.convertFunctionContent(irFunction, anonymousFunction, containingClass = null)
@@ -243,7 +243,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
)
}
}
val signature = components.signatureComposer.composeSignature(firFunction)
val signature = if (classId.isLocal) null else components.signatureComposer.composeSignature(firFunction)
return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol ->
IrFunctionImpl(
UNDEFINED_OFFSET,
@@ -67,6 +67,7 @@ class FakeOverrideGenerator(
for (name in superTypesCallableNames) {
if (name in processedCallableNames) continue
processedCallableNames += name
val isLocal = klass !is FirRegularClass || klass.isLocal
useSiteMemberScope.processFunctionsByName(name) { functionSymbol ->
if (functionSymbol is FirNamedFunctionSymbol) {
val originalFunction = functionSymbol.fir
@@ -91,7 +92,8 @@ class FakeOverrideGenerator(
originalFunction,
irParent = this,
thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass,
origin = origin
origin = origin,
isLocal = isLocal
)
// In fake overrides, parent logic is a bit specific, because
// parent of *original* function (base class) is used for dispatch receiver,
@@ -115,7 +117,8 @@ class FakeOverrideGenerator(
fakeOverrideFunction,
irParent = this,
thisReceiverOwner = declarationStorage.findIrParent(originalFunction) as? IrClass,
origin = origin
origin = origin,
isLocal = isLocal
)
if (irFunction.returnType.containsErrorType() || irFunction.valueParameters.any { it.type.containsErrorType() }) {
return@processFunctionsByName
@@ -142,7 +145,8 @@ class FakeOverrideGenerator(
?: declarationStorage.createIrProperty(
originalProperty, irParent = this,
thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass,
origin = origin
origin = origin,
isLocal = isLocal
)
irProperty.parent = this
result += irProperty.withProperty {
@@ -162,7 +166,8 @@ class FakeOverrideGenerator(
val irProperty = declarationStorage.createIrProperty(
fakeOverrideProperty, irParent = this,
thisReceiverOwner = declarationStorage.findIrParent(originalProperty) as? IrClass,
origin = origin
origin = origin,
isLocal = isLocal
)
if (irProperty.backingField?.type?.containsErrorType() == true ||
irProperty.getter?.returnType?.containsErrorType() == true
@@ -63,30 +63,26 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
override fun composeSignature(declaration: FirDeclaration): IdSignature? {
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
if (declaration is FirMemberDeclaration && declaration.effectiveVisibility == FirEffectiveVisibilityImpl.Local) {
return null
}
val builder = SignatureBuilder()
declaration.accept(builder)
return when {
declaration is FirRegularClass && declaration.visibility != Visibilities.LOCAL -> {
return when (declaration) {
is FirRegularClass -> {
// TODO: private classes are probably not acceptable here too
val classId = declaration.classId
IdSignature.PublicSignature(
classId.packageFqName.asString(), classId.relativeClassName.asString(), builder.hashId, builder.mask
)
}
declaration is FirTypeAlias -> {
is FirTypeAlias -> {
if (declaration.visibility == Visibilities.PRIVATE) return null
val classId = declaration.symbol.classId
IdSignature.PublicSignature(
classId.packageFqName.asString(), classId.relativeClassName.asString(), builder.hashId, builder.mask
)
}
declaration is FirCallableMemberDeclaration<*> -> {
is FirCallableMemberDeclaration<*> -> {
if (declaration.visibility == Visibilities.PRIVATE) return null
val callableId = declaration.symbol.callableId
if (callableId.classId?.isLocal == true) return null
IdSignature.PublicSignature(
callableId.packageName.asString(), callableId.relativeCallableName.asString(), builder.hashId, builder.mask
)