IR: make IrMetadataSourceOwner.metadata mutable
To avoid casting to specific Ir*Impl elements at call sites. Also inherit from IrMetadataSourceOwner only where it's needed: class, file, function, property. Previously this field was always null and took some space for things like value parameters, type parameters, etc.
This commit is contained in:
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.ir.IrStatement
|
|||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
@@ -94,7 +93,7 @@ class Fir2IrVisitor(
|
|||||||
it.accept(this@Fir2IrVisitor, data) as? IrConstructorCall
|
it.accept(this@Fir2IrVisitor, data) as? IrConstructorCall
|
||||||
}
|
}
|
||||||
|
|
||||||
(this as IrFileImpl).metadata = FirMetadataSource.File(file, components.session)
|
metadata = FirMetadataSource.File(file, components.session)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,10 +39,6 @@ abstract class AbstractFir2IrLazyDeclaration<F : FirMemberDeclaration, D : IrSym
|
|||||||
|
|
||||||
lateinit var typeParameters: List<IrTypeParameter>
|
lateinit var typeParameters: List<IrTypeParameter>
|
||||||
|
|
||||||
override var metadata: MetadataSource?
|
|
||||||
get() = null
|
|
||||||
set(_) = error("We should never need to store metadata of external declarations.")
|
|
||||||
|
|
||||||
override lateinit var parent: IrDeclarationParent
|
override lateinit var parent: IrDeclarationParent
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
|
|||||||
@@ -170,6 +170,10 @@ class Fir2IrLazyClass(
|
|||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = null
|
||||||
|
set(_) = error("We should never need to store metadata of external declarations.")
|
||||||
|
|
||||||
private fun FirNamedFunctionSymbol.isAbstractMethodOfAny(): Boolean {
|
private fun FirNamedFunctionSymbol.isAbstractMethodOfAny(): Boolean {
|
||||||
val fir = fir
|
val fir = fir
|
||||||
if (fir.modality != Modality.ABSTRACT) return false
|
if (fir.modality != Modality.ABSTRACT) return false
|
||||||
|
|||||||
@@ -13,10 +13,7 @@ import org.jetbrains.kotlin.fir.backend.toIrType
|
|||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.Fir2IrConstructorSymbol
|
import org.jetbrains.kotlin.fir.symbols.Fir2IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrConstructor
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
|
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
@@ -110,6 +107,10 @@ class Fir2IrLazyConstructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = null
|
||||||
|
set(_) = error("We should never need to store metadata of external declarations.")
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||||
return visitor.visitConstructor(this, data)
|
return visitor.visitConstructor(this, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,6 +150,10 @@ class Fir2IrLazyProperty(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = null
|
||||||
|
set(_) = error("We should never need to store metadata of external declarations.")
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||||
return visitor.visitProperty(this, data)
|
return visitor.visitProperty(this, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,6 +132,10 @@ class Fir2IrLazySimpleFunction(
|
|||||||
?.filterIsInstance<IrSimpleFunctionSymbol>().orEmpty()
|
?.filterIsInstance<IrSimpleFunctionSymbol>().orEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = null
|
||||||
|
set(_) = error("We should never need to store metadata of external declarations.")
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||||
return visitor.visitSimpleFunction(this, data)
|
return visitor.visitSimpleFunction(this, data)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -47,7 +47,7 @@ class DescriptorBasedClassCodegen internal constructor(
|
|||||||
state.bindingTrace.record(
|
state.bindingTrace.record(
|
||||||
CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA,
|
CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA,
|
||||||
type,
|
type,
|
||||||
localDelegatedProperties.mapNotNull { it.owner.metadata?.descriptor }
|
localDelegatedProperties.mapNotNull { (it.owner.metadata as? MetadataSource.LocalDelegatedProperty)?.descriptor }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -67,7 +67,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
|||||||
fileClassMembers.add(it)
|
fileClassMembers.add(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileClassMembers.isEmpty() && irFile.metadata?.descriptors.isNullOrEmpty()) return
|
if (fileClassMembers.isEmpty() && (irFile.metadata as? MetadataSource.File)?.descriptors.isNullOrEmpty()) return
|
||||||
|
|
||||||
val irFileClass = createFileClass(irFile, fileClassMembers)
|
val irFileClass = createFileClass(irFile, fileClassMembers)
|
||||||
classes.add(irFileClass)
|
classes.add(irFileClass)
|
||||||
@@ -82,7 +82,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
|
|||||||
val descriptor: ClassDescriptor
|
val descriptor: ClassDescriptor
|
||||||
when (fileEntry) {
|
when (fileEntry) {
|
||||||
is PsiSourceManager.PsiFileEntry -> {
|
is PsiSourceManager.PsiFileEntry -> {
|
||||||
val ktFile = context.psiSourceManager.getKtFile(fileEntry as PsiSourceManager.PsiFileEntry)
|
val ktFile = context.psiSourceManager.getKtFile(fileEntry)
|
||||||
?: throw AssertionError("Unexpected file entry: $fileEntry")
|
?: throw AssertionError("Unexpected file entry: $fileEntry")
|
||||||
fileClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(ktFile)
|
fileClassInfo = JvmFileClassUtil.getFileClassInfoNoResolve(ktFile)
|
||||||
descriptor = WrappedClassDescriptor(sourceElement = KotlinSourceElement(ktFile))
|
descriptor = WrappedClassDescriptor(sourceElement = KotlinSourceElement(ktFile))
|
||||||
|
|||||||
+5
-3
@@ -17,9 +17,11 @@ import org.jetbrains.kotlin.descriptors.Modality
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.*
|
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
||||||
@@ -187,7 +189,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
|
|||||||
createImplicitParameterDeclarationWithWrappedDescriptor()
|
createImplicitParameterDeclarationWithWrappedDescriptor()
|
||||||
copyAttributes(irFunctionReference)
|
copyAttributes(irFunctionReference)
|
||||||
if (isLambda) {
|
if (isLambda) {
|
||||||
(this as IrClassImpl).metadata = irFunctionReference.symbol.owner.metadata
|
metadata = irFunctionReference.symbol.owner.metadata
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.load.java.JavaVisibilities
|
|||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
|
||||||
|
|
||||||
internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrElementTransformerVoidWithContext(), FileLoweringPass {
|
internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrElementTransformerVoidWithContext(), FileLoweringPass {
|
||||||
data class LambdaCallSite(val scope: IrDeclaration, val crossinline: Boolean)
|
data class LambdaCallSite(val scope: IrDeclaration, val crossinline: Boolean)
|
||||||
@@ -229,8 +228,10 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle
|
|||||||
// signature of the accessor. We implement this special case in the JVM IR backend by
|
// signature of the accessor. We implement this special case in the JVM IR backend by
|
||||||
// attaching the metadata directly to the accessor. We also have to move all annotations
|
// attaching the metadata directly to the accessor. We also have to move all annotations
|
||||||
// to the accessor. Parameter annotations are already moved by the copyTo method.
|
// to the accessor. Parameter annotations are already moved by the copyTo method.
|
||||||
accessor.metadata = declaration.metadata
|
if (declaration.metadata != null) {
|
||||||
declaration.safeAs<IrConstructorImpl>()?.metadata = null
|
accessor.metadata = declaration.metadata
|
||||||
|
declaration.metadata = null
|
||||||
|
}
|
||||||
accessor.annotations += declaration.annotations
|
accessor.annotations += declaration.annotations
|
||||||
declaration.annotations = emptyList()
|
declaration.annotations = emptyList()
|
||||||
declaration.valueParameters.forEach { it.annotations = emptyList() }
|
declaration.valueParameters.forEach { it.annotations = emptyList() }
|
||||||
|
|||||||
+3
-5
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2020 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.
|
* 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.backend.jvm.lower
|
package org.jetbrains.kotlin.backend.jvm.lower
|
||||||
|
|
||||||
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
|
|||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
|
||||||
internal val typeAliasAnnotationMethodsPhase = makeIrFilePhase(
|
internal val typeAliasAnnotationMethodsPhase = makeIrFilePhase(
|
||||||
::TypeAliasAnnotationMethodsLowering,
|
::TypeAliasAnnotationMethodsLowering,
|
||||||
name = "TypeAliasAnnotationMethodsLowering",
|
name = "TypeAliasAnnotationMethodsLowering",
|
||||||
@@ -51,7 +50,6 @@ class TypeAliasAnnotationMethodsLowering(val context: CommonBackendContext) :
|
|||||||
}.apply {
|
}.apply {
|
||||||
body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET)
|
body = IrBlockBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET)
|
||||||
annotations += alias.annotations
|
annotations += alias.annotations
|
||||||
metadata = alias.metadata
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.backend.common.CodegenUtil
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptorImpl
|
import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptorImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.mapValueParameters
|
import org.jetbrains.kotlin.ir.expressions.mapValueParameters
|
||||||
@@ -89,7 +88,7 @@ class ClassGenerator(
|
|||||||
startOffset, endOffset, IrDeclarationOrigin.DEFINED, it, classDescriptor,
|
startOffset, endOffset, IrDeclarationOrigin.DEFINED, it, classDescriptor,
|
||||||
context.symbolTable.nameProvider.nameForDeclaration(classDescriptor), visibility, modality
|
context.symbolTable.nameProvider.nameForDeclaration(classDescriptor), visibility, modality
|
||||||
).apply {
|
).apply {
|
||||||
(this as IrClassImpl).metadata = MetadataSource.Class(it.descriptor)
|
metadata = MetadataSource.Class(it.descriptor)
|
||||||
}
|
}
|
||||||
}.buildWithScope { irClass ->
|
}.buildWithScope { irClass ->
|
||||||
declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters)
|
declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters)
|
||||||
|
|||||||
+1
-1
@@ -79,7 +79,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
|
|||||||
val irClass = createIrClassFromDescriptor(startOffset, endOffset, origin, symbol, descriptor)
|
val irClass = createIrClassFromDescriptor(startOffset, endOffset, origin, symbol, descriptor)
|
||||||
|
|
||||||
symbolTable.withScope(irClass) {
|
symbolTable.withScope(irClass) {
|
||||||
(irClass as IrClassImpl).metadata = MetadataSource.Class(descriptor)
|
irClass.metadata = MetadataSource.Class(descriptor)
|
||||||
|
|
||||||
generateGlobalTypeParametersDeclarations(irClass, descriptor.declaredTypeParameters)
|
generateGlobalTypeParametersDeclarations(irClass, descriptor.declaredTypeParameters)
|
||||||
irClass.superTypes = descriptor.typeConstructor.supertypes.map {
|
irClass.superTypes = descriptor.typeConstructor.supertypes.map {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.types.IrType
|
|||||||
|
|
||||||
interface IrClass :
|
interface IrClass :
|
||||||
IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithName, IrDeclarationWithVisibility,
|
IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithName, IrDeclarationWithVisibility,
|
||||||
IrDeclarationContainer, IrTypeParametersContainer, IrAttributeContainer {
|
IrDeclarationContainer, IrTypeParametersContainer, IrAttributeContainer, IrMetadataSourceOwner {
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
override val descriptor: ClassDescriptor
|
override val descriptor: ClassDescriptor
|
||||||
|
|||||||
@@ -31,10 +31,10 @@ interface IrSymbolOwner : IrElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface IrMetadataSourceOwner : IrElement {
|
interface IrMetadataSourceOwner : IrElement {
|
||||||
val metadata: MetadataSource?
|
var metadata: MetadataSource?
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IrDeclaration : IrStatement, IrMutableAnnotationContainer, IrMetadataSourceOwner {
|
interface IrDeclaration : IrStatement, IrMutableAnnotationContainer {
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
val descriptor: DeclarationDescriptor
|
val descriptor: DeclarationDescriptor
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.ir.types.IrType
|
|||||||
|
|
||||||
interface IrField :
|
interface IrField :
|
||||||
IrSymbolDeclaration<IrFieldSymbol>,
|
IrSymbolDeclaration<IrFieldSymbol>,
|
||||||
IrDeclarationWithName, IrDeclarationWithVisibility, IrDeclarationParent {
|
IrDeclarationWithName, IrDeclarationWithVisibility, IrDeclarationParent, IrMetadataSourceOwner {
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
override val descriptor: PropertyDescriptor
|
override val descriptor: PropertyDescriptor
|
||||||
@@ -27,6 +27,4 @@ interface IrField :
|
|||||||
var initializer: IrExpressionBody?
|
var initializer: IrExpressionBody?
|
||||||
|
|
||||||
var correspondingPropertySymbol: IrPropertySymbol?
|
var correspondingPropertySymbol: IrPropertySymbol?
|
||||||
|
|
||||||
override val metadata: MetadataSource?
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.ir.declarations
|
|||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrExternalPackageFragmentSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrExternalPackageFragmentSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrPackageFragmentSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrPackageFragmentSymbol
|
||||||
@@ -45,8 +44,6 @@ interface IrFile : IrPackageFragment, IrMutableAnnotationContainer, IrMetadataSo
|
|||||||
|
|
||||||
val fileEntry: SourceManager.FileEntry
|
val fileEntry: SourceManager.FileEntry
|
||||||
|
|
||||||
override val metadata: MetadataSource.File?
|
|
||||||
|
|
||||||
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrFile =
|
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrFile =
|
||||||
accept(transformer, data) as IrFile
|
accept(transformer, data) as IrFile
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
|||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
|
||||||
interface IrFunction :
|
interface IrFunction :
|
||||||
IrDeclarationWithName, IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget {
|
IrDeclarationWithName, IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget,
|
||||||
|
IrMetadataSourceOwner {
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
override val descriptor: FunctionDescriptor
|
override val descriptor: FunctionDescriptor
|
||||||
@@ -42,8 +43,6 @@ interface IrFunction :
|
|||||||
var valueParameters: List<IrValueParameter>
|
var valueParameters: List<IrValueParameter>
|
||||||
|
|
||||||
var body: IrBody?
|
var body: IrBody?
|
||||||
|
|
||||||
override var metadata: MetadataSource?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
|
|||||||
+2
-3
@@ -23,7 +23,8 @@ import org.jetbrains.kotlin.ir.types.IrType
|
|||||||
|
|
||||||
interface IrLocalDelegatedProperty :
|
interface IrLocalDelegatedProperty :
|
||||||
IrDeclarationWithName,
|
IrDeclarationWithName,
|
||||||
IrSymbolOwner {
|
IrSymbolOwner,
|
||||||
|
IrMetadataSourceOwner {
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
override val descriptor: VariableDescriptorWithAccessors
|
override val descriptor: VariableDescriptorWithAccessors
|
||||||
@@ -35,6 +36,4 @@ interface IrLocalDelegatedProperty :
|
|||||||
var delegate: IrVariable
|
var delegate: IrVariable
|
||||||
var getter: IrFunction
|
var getter: IrFunction
|
||||||
var setter: IrFunction?
|
var setter: IrFunction?
|
||||||
|
|
||||||
override val metadata: MetadataSource.LocalDelegatedProperty?
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,11 +20,7 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
|||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||||
|
|
||||||
interface IrProperty :
|
interface IrProperty : IrDeclarationWithName, IrDeclarationWithVisibility, IrOverridableMember, IrSymbolOwner, IrMetadataSourceOwner {
|
||||||
IrDeclarationWithName,
|
|
||||||
IrDeclarationWithVisibility,
|
|
||||||
IrOverridableMember,
|
|
||||||
IrSymbolOwner {
|
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
override val descriptor: PropertyDescriptor
|
override val descriptor: PropertyDescriptor
|
||||||
|
|||||||
@@ -16,17 +16,16 @@ interface MetadataSource {
|
|||||||
get() = descriptor.name
|
get() = descriptor.name
|
||||||
}
|
}
|
||||||
|
|
||||||
open class Class(descriptor: ClassDescriptor) : DescriptorBased<ClassDescriptor>(descriptor)
|
class Class(descriptor: ClassDescriptor) : DescriptorBased<ClassDescriptor>(descriptor)
|
||||||
|
|
||||||
open class File(val descriptors: List<DeclarationDescriptor>) : MetadataSource {
|
open class File(val descriptors: List<DeclarationDescriptor>) : MetadataSource {
|
||||||
override val name: Name?
|
override val name: Name?
|
||||||
get() = null
|
get() = null
|
||||||
}
|
}
|
||||||
|
|
||||||
open class Function(descriptor: FunctionDescriptor) : DescriptorBased<FunctionDescriptor>(descriptor)
|
class Function(descriptor: FunctionDescriptor) : DescriptorBased<FunctionDescriptor>(descriptor)
|
||||||
|
|
||||||
open class Property(descriptor: PropertyDescriptor) : DescriptorBased<PropertyDescriptor>(descriptor)
|
class Property(descriptor: PropertyDescriptor) : DescriptorBased<PropertyDescriptor>(descriptor)
|
||||||
|
|
||||||
open class LocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) :
|
class LocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) : DescriptorBased<VariableDescriptorWithAccessors>(descriptor)
|
||||||
DescriptorBased<VariableDescriptorWithAccessors>(descriptor)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,9 +65,6 @@ abstract class IrDeclarationBase<T : DeclarationCarrier>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override val metadata: MetadataSource?
|
|
||||||
get() = null
|
|
||||||
|
|
||||||
override fun ensureLowered() {
|
override fun ensureLowered() {
|
||||||
if (stageController.currentStage > loweredUpTo) {
|
if (stageController.currentStage > loweredUpTo) {
|
||||||
stageController.lazyLower(this)
|
stageController.lazyLower(this)
|
||||||
|
|||||||
@@ -17,10 +17,12 @@
|
|||||||
package org.jetbrains.kotlin.ir.declarations.impl
|
package org.jetbrains.kotlin.ir.declarations.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
|
||||||
import org.jetbrains.kotlin.ir.IrElementBase
|
import org.jetbrains.kotlin.ir.IrElementBase
|
||||||
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.MetadataSource
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrFileSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFileSymbolImpl
|
||||||
@@ -52,7 +54,7 @@ class IrFileImpl(
|
|||||||
|
|
||||||
override var annotations: List<IrConstructorCall> = ArrayList()
|
override var annotations: List<IrConstructorCall> = ArrayList()
|
||||||
|
|
||||||
override var metadata: MetadataSource.File? = null
|
override var metadata: MetadataSource? = null
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||||
visitor.visitFile(this, data)
|
visitor.visitFile(this, data)
|
||||||
|
|||||||
+2
-2
@@ -78,9 +78,9 @@ class IrLocalDelegatedPropertyImpl(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override var metadataField: MetadataSource.LocalDelegatedProperty? = null
|
override var metadataField: MetadataSource? = null
|
||||||
|
|
||||||
override var metadata: MetadataSource.LocalDelegatedProperty?
|
override var metadata: MetadataSource?
|
||||||
get() = getCarrier().metadataField
|
get() = getCarrier().metadataField
|
||||||
set(v) {
|
set(v) {
|
||||||
if (metadata !== v) {
|
if (metadata !== v) {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.ir.declarations.impl
|
package org.jetbrains.kotlin.ir.declarations.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
@@ -37,7 +37,6 @@ class IrScriptImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override var annotations: List<IrConstructorCall> = SmartList()
|
override var annotations: List<IrConstructorCall> = SmartList()
|
||||||
override val metadata: MetadataSource? get() = null
|
|
||||||
|
|
||||||
override val declarations: MutableList<IrDeclaration> = mutableListOf()
|
override val declarations: MutableList<IrDeclaration> = mutableListOf()
|
||||||
override val statements: MutableList<IrStatement> = mutableListOf()
|
override val statements: MutableList<IrStatement> = mutableListOf()
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
import org.jetbrains.kotlin.ir.declarations.MetadataSource
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
|
||||||
@@ -51,7 +50,6 @@ class IrVariableImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override var annotations: List<IrConstructorCall> = emptyList()
|
override var annotations: List<IrConstructorCall> = emptyList()
|
||||||
override val metadata: MetadataSource? get() = null
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
symbol.bind(this)
|
symbol.bind(this)
|
||||||
|
|||||||
+2
-2
@@ -12,7 +12,7 @@ interface LocalDelegatedPropertyCarrier : DeclarationCarrier {
|
|||||||
var delegateField: IrVariable?
|
var delegateField: IrVariable?
|
||||||
var getterField: IrFunction?
|
var getterField: IrFunction?
|
||||||
var setterField: IrFunction?
|
var setterField: IrFunction?
|
||||||
var metadataField: MetadataSource.LocalDelegatedProperty?
|
var metadataField: MetadataSource?
|
||||||
|
|
||||||
override fun clone(): LocalDelegatedPropertyCarrier {
|
override fun clone(): LocalDelegatedPropertyCarrier {
|
||||||
return LocalDelegatedPropertyCarrierImpl(
|
return LocalDelegatedPropertyCarrierImpl(
|
||||||
@@ -36,5 +36,5 @@ class LocalDelegatedPropertyCarrierImpl(
|
|||||||
override var delegateField: IrVariable?,
|
override var delegateField: IrVariable?,
|
||||||
override var getterField: IrFunction?,
|
override var getterField: IrFunction?,
|
||||||
override var setterField: IrFunction?,
|
override var setterField: IrFunction?,
|
||||||
override var metadataField: MetadataSource.LocalDelegatedProperty?
|
override var metadataField: MetadataSource?
|
||||||
) : LocalDelegatedPropertyCarrier
|
) : LocalDelegatedPropertyCarrier
|
||||||
@@ -91,6 +91,10 @@ class IrLazyClass(
|
|||||||
val nameResolver: NameResolver? get() = (descriptor as? DeserializedClassDescriptor)?.c?.nameResolver
|
val nameResolver: NameResolver? get() = (descriptor as? DeserializedClassDescriptor)?.c?.nameResolver
|
||||||
override val source: SourceElement get() = descriptor.source
|
override val source: SourceElement get() = descriptor.source
|
||||||
|
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = null
|
||||||
|
set(_) = error("We should never need to store metadata of external declarations.")
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||||
visitor.visitClass(this, data)
|
visitor.visitClass(this, data)
|
||||||
|
|
||||||
|
|||||||
-3
@@ -56,9 +56,6 @@ abstract class IrLazyDeclarationBase(
|
|||||||
descriptor.annotations.mapNotNull(typeTranslator.constantValueGenerator::generateAnnotationConstructorCall).toMutableList()
|
descriptor.annotations.mapNotNull(typeTranslator.constantValueGenerator::generateAnnotationConstructorCall).toMutableList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override val metadata: MetadataSource?
|
|
||||||
get() = null
|
|
||||||
|
|
||||||
private fun createLazyParent(): IrDeclarationParent? {
|
private fun createLazyParent(): IrDeclarationParent? {
|
||||||
val currentDescriptor = descriptor
|
val currentDescriptor = descriptor
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
|||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.MetadataSource
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
||||||
@@ -66,6 +67,10 @@ class IrLazyField(
|
|||||||
stubGenerator.generatePropertyStub(descriptor).symbol
|
stubGenerator.generatePropertyStub(descriptor).symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = null
|
||||||
|
set(_) = error("We should never need to store metadata of external declarations.")
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||||
return visitor.visitField(this, data)
|
return visitor.visitField(this, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ import org.jetbrains.kotlin.descriptors.Modality
|
|||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||||
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
|
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
|
||||||
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
||||||
@@ -60,17 +57,23 @@ class IrLazyProperty(
|
|||||||
}
|
}
|
||||||
} else null
|
} else null
|
||||||
}
|
}
|
||||||
|
|
||||||
override var getter: IrSimpleFunction? by lazyVar {
|
override var getter: IrSimpleFunction? by lazyVar {
|
||||||
descriptor.getter?.let { stubGenerator.generateFunctionStub(it, createPropertyIfNeeded = false) }?.apply {
|
descriptor.getter?.let { stubGenerator.generateFunctionStub(it, createPropertyIfNeeded = false) }?.apply {
|
||||||
correspondingPropertySymbol = this@IrLazyProperty.symbol
|
correspondingPropertySymbol = this@IrLazyProperty.symbol
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override var setter: IrSimpleFunction? by lazyVar {
|
override var setter: IrSimpleFunction? by lazyVar {
|
||||||
descriptor.setter?.let { stubGenerator.generateFunctionStub(it, createPropertyIfNeeded = false) }?.apply {
|
descriptor.setter?.let { stubGenerator.generateFunctionStub(it, createPropertyIfNeeded = false) }?.apply {
|
||||||
correspondingPropertySymbol = this@IrLazyProperty.symbol
|
correspondingPropertySymbol = this@IrLazyProperty.symbol
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override var metadata: MetadataSource?
|
||||||
|
get() = null
|
||||||
|
set(_) = error("We should never need to store metadata of external declarations.")
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||||
visitor.visitProperty(this, data)
|
visitor.visitProperty(this, data)
|
||||||
|
|
||||||
|
|||||||
+3
-4
@@ -16,13 +16,12 @@ import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
|
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.*
|
import org.jetbrains.kotlin.ir.builders.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
|
import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
|
||||||
@@ -122,7 +121,7 @@ class ParcelableIrTransformer(private val context: IrPluginContext, private val
|
|||||||
irExprBody(irInt(flags))
|
irExprBody(irInt(flags))
|
||||||
}
|
}
|
||||||
|
|
||||||
(this as IrFunctionImpl).metadata = MetadataSource.Function(
|
metadata = MetadataSource.Function(
|
||||||
declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.DESCRIBE_CONTENTS)!!
|
declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.DESCRIBE_CONTENTS)!!
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -177,7 +176,7 @@ class ParcelableIrTransformer(private val context: IrPluginContext, private val
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(this as IrFunctionImpl).metadata = MetadataSource.Function(
|
metadata = MetadataSource.Function(
|
||||||
declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.WRITE_TO_PARCEL)!!
|
declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.WRITE_TO_PARCEL)!!
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user