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