Use camel-case in FirFunctionCallOrigin
Also componentCall is operator call
This commit is contained in:
committed by
TeamCityServer
parent
419aa65381
commit
d38effcbbe
+3
-3
@@ -267,7 +267,7 @@ class ExpressionsConverter(
|
|||||||
}
|
}
|
||||||
explicitReceiver = leftArgAsFir
|
explicitReceiver = leftArgAsFir
|
||||||
argumentList = buildUnaryArgumentList(rightArgAsFir)
|
argumentList = buildUnaryArgumentList(rightArgAsFir)
|
||||||
origin = if (conventionCallName != null) FirFunctionCallOrigin.OPERATOR else FirFunctionCallOrigin.INFIX
|
origin = if (conventionCallName != null) FirFunctionCallOrigin.Operator else FirFunctionCallOrigin.Infix
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val firOperation = operationToken.toFirOperation()
|
val firOperation = operationToken.toFirOperation()
|
||||||
@@ -392,7 +392,7 @@ class ExpressionsConverter(
|
|||||||
name = conventionCallName
|
name = conventionCallName
|
||||||
}
|
}
|
||||||
explicitReceiver = receiver
|
explicitReceiver = receiver
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> throw IllegalStateException("Unexpected expression: ${unaryExpression.asText}")
|
else -> throw IllegalStateException("Unexpected expression: ${unaryExpression.asText}")
|
||||||
@@ -844,7 +844,7 @@ class ExpressionsConverter(
|
|||||||
arguments += indices
|
arguments += indices
|
||||||
getArgument?.let { arguments += it }
|
getArgument?.let { arguments += it }
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1889,7 +1889,7 @@ open class RawFirBuilder(
|
|||||||
}
|
}
|
||||||
explicitReceiver = leftArgument
|
explicitReceiver = leftArgument
|
||||||
argumentList = buildUnaryArgumentList(rightArgument)
|
argumentList = buildUnaryArgumentList(rightArgument)
|
||||||
origin = if (conventionCallName != null) FirFunctionCallOrigin.OPERATOR else FirFunctionCallOrigin.INFIX
|
origin = if (conventionCallName != null) FirFunctionCallOrigin.Operator else FirFunctionCallOrigin.Infix
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val firOperation = operationToken.toFirOperation()
|
val firOperation = operationToken.toFirOperation()
|
||||||
@@ -1968,7 +1968,7 @@ open class RawFirBuilder(
|
|||||||
name = conventionCallName
|
name = conventionCallName
|
||||||
}
|
}
|
||||||
explicitReceiver = receiver
|
explicitReceiver = receiver
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> throw IllegalStateException("Unexpected expression: ${expression.text}")
|
else -> throw IllegalStateException("Unexpected expression: ${expression.text}")
|
||||||
@@ -2065,7 +2065,7 @@ open class RawFirBuilder(
|
|||||||
arguments += getArgument
|
arguments += getArgument
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -520,7 +520,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
} else {
|
} else {
|
||||||
generateResolvedAccessExpression(desugaredSource, initialValueVar)
|
generateResolvedAccessExpression(desugaredSource, initialValueVar)
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
|
|
||||||
// resultVar is only used for prefix increment/decrement.
|
// resultVar is only used for prefix increment/decrement.
|
||||||
@@ -644,7 +644,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
} else {
|
} else {
|
||||||
generateResolvedAccessExpression(desugaredSource, initialValueVar)
|
generateResolvedAccessExpression(desugaredSource, initialValueVar)
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
|
|
||||||
// resultVar is only used for prefix increment/decrement.
|
// resultVar is only used for prefix increment/decrement.
|
||||||
@@ -761,7 +761,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
arguments += generateResolvedAccessExpression(indexVar.source, indexVar)
|
arguments += generateResolvedAccessExpression(indexVar.source, indexVar)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialValueVar is only used for postfix increment/decrement (stores the argument value before increment/decrement).
|
// initialValueVar is only used for postfix increment/decrement (stores the argument value before increment/decrement).
|
||||||
@@ -784,7 +784,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
} else {
|
} else {
|
||||||
generateResolvedAccessExpression(desugaredSource, initialValueVar)
|
generateResolvedAccessExpression(desugaredSource, initialValueVar)
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
|
|
||||||
// resultVar is only used for prefix increment/decrement.
|
// resultVar is only used for prefix increment/decrement.
|
||||||
@@ -813,7 +813,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
resultInitializer
|
resultInitializer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -984,7 +984,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
ConeSimpleDiagnostic("No value for array set", DiagnosticKind.Syntax)
|
ConeSimpleDiagnostic("No value for array set", DiagnosticKind.Syntax)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1027,7 +1027,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
calleeReference = buildSimpleNamedReference {
|
calleeReference = buildSimpleNamedReference {
|
||||||
name = OperatorNameConventions.SET
|
name = OperatorNameConventions.SET
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
argumentList = buildArgumentList {
|
argumentList = buildArgumentList {
|
||||||
for (indexVariable in indexVariables) {
|
for (indexVariable in indexVariables) {
|
||||||
arguments += indexVariable.toQualifiedAccess()
|
arguments += indexVariable.toQualifiedAccess()
|
||||||
@@ -1043,7 +1043,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
arguments += indexVariable.toQualifiedAccess()
|
arguments += indexVariable.toQualifiedAccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
|
|
||||||
val operatorCall = buildFunctionCall {
|
val operatorCall = buildFunctionCall {
|
||||||
@@ -1060,7 +1060,7 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
arguments += operatorCall
|
arguments += operatorCall
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -193,7 +193,7 @@ fun FirExpression.generateContainsOperation(
|
|||||||
name = OperatorNameConventions.NOT
|
name = OperatorNameConventions.NOT
|
||||||
}
|
}
|
||||||
explicitReceiver = containsCall
|
explicitReceiver = containsCall
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,7 +243,7 @@ private fun FirExpression.createConventionCall(
|
|||||||
}
|
}
|
||||||
explicitReceiver = this@createConventionCall
|
explicitReceiver = this@createConventionCall
|
||||||
argumentList = buildUnaryArgumentList(argument)
|
argumentList = buildUnaryArgumentList(argument)
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,7 +398,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
|||||||
name = PROVIDE_DELEGATE
|
name = PROVIDE_DELEGATE
|
||||||
}
|
}
|
||||||
argumentList = buildBinaryArgumentList(thisRef(forDispatchReceiver = true), propertyRef())
|
argumentList = buildBinaryArgumentList(thisRef(forDispatchReceiver = true), propertyRef())
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
delegate = delegateBuilder.build()
|
delegate = delegateBuilder.build()
|
||||||
if (stubMode) return
|
if (stubMode) return
|
||||||
@@ -424,7 +424,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
|||||||
name = GET_VALUE
|
name = GET_VALUE
|
||||||
}
|
}
|
||||||
argumentList = buildBinaryArgumentList(thisRef(), propertyRef())
|
argumentList = buildBinaryArgumentList(thisRef(), propertyRef())
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
target = returnTarget
|
target = returnTarget
|
||||||
}
|
}
|
||||||
@@ -477,7 +477,7 @@ fun FirPropertyBuilder.generateAccessorsByDelegate(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if (annotations != null) {
|
if (annotations != null) {
|
||||||
|
|||||||
@@ -162,9 +162,7 @@ class FirCallResolver(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var reducedCandidates = if (!result.currentApplicability.isSuccess) {
|
var reducedCandidates = if (!result.currentApplicability.isSuccess) {
|
||||||
val distinctApplicabilities = bestCandidates.flatMapTo(mutableSetOf()) { candidate ->
|
val distinctApplicabilities = bestCandidates.mapTo(mutableSetOf()) { it.currentApplicability }
|
||||||
candidate.diagnostics.map { it.applicability }
|
|
||||||
}
|
|
||||||
//if all candidates have the same kind on inApplicability - try to choose the most specific one
|
//if all candidates have the same kind on inApplicability - try to choose the most specific one
|
||||||
if (distinctApplicabilities.size == 1 && distinctApplicabilities.single() > CandidateApplicability.INAPPLICABLE) {
|
if (distinctApplicabilities.size == 1 && distinctApplicabilities.single() > CandidateApplicability.INAPPLICABLE) {
|
||||||
chooseMostSpecific()
|
chooseMostSpecific()
|
||||||
|
|||||||
@@ -272,9 +272,9 @@ internal object CheckCallModifiers : CheckerStage() {
|
|||||||
if (callInfo.callSite is FirFunctionCall) {
|
if (callInfo.callSite is FirFunctionCall) {
|
||||||
val functionSymbol = candidate.symbol as? FirNamedFunctionSymbol ?: return
|
val functionSymbol = candidate.symbol as? FirNamedFunctionSymbol ?: return
|
||||||
when {
|
when {
|
||||||
callInfo.callSite.origin == FirFunctionCallOrigin.INFIX && !functionSymbol.fir.isInfix ->
|
callInfo.callSite.origin == FirFunctionCallOrigin.Infix && !functionSymbol.fir.isInfix ->
|
||||||
sink.reportDiagnostic(InfixCallOfNonInfixFunction(functionSymbol))
|
sink.reportDiagnostic(InfixCallOfNonInfixFunction(functionSymbol))
|
||||||
callInfo.callSite.origin == FirFunctionCallOrigin.OPERATOR && !functionSymbol.fir.isOperator ->
|
callInfo.callSite.origin == FirFunctionCallOrigin.Operator && !functionSymbol.fir.isOperator ->
|
||||||
sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol))
|
sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol))
|
||||||
callInfo.isImplicitInvoke && !functionSymbol.fir.isOperator ->
|
callInfo.isImplicitInvoke && !functionSymbol.fir.isOperator ->
|
||||||
sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol))
|
sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol))
|
||||||
|
|||||||
+1
-1
@@ -51,7 +51,7 @@ private class ConeConditionalEffectToFirVisitor(
|
|||||||
return buildFunctionCall {
|
return buildFunctionCall {
|
||||||
calleeReference = buildSimpleNamedReference { name = OperatorNameConventions.NOT }
|
calleeReference = buildSimpleNamedReference { name = OperatorNameConventions.NOT }
|
||||||
this.explicitReceiver = explicitReceiver
|
this.explicitReceiver = explicitReceiver
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -370,7 +370,7 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
|
|||||||
this.name = name
|
this.name = name
|
||||||
candidateSymbol = null
|
candidateSymbol = null
|
||||||
}
|
}
|
||||||
origin = FirFunctionCallOrigin.OPERATOR
|
origin = FirFunctionCallOrigin.Operator
|
||||||
}
|
}
|
||||||
|
|
||||||
// x.plusAssign(y)
|
// x.plusAssign(y)
|
||||||
|
|||||||
+1
-1
@@ -44,7 +44,7 @@ class FirIntegerOperatorCall @FirImplementationDetail constructor(
|
|||||||
extensionReceiver,
|
extensionReceiver,
|
||||||
argumentList,
|
argumentList,
|
||||||
calleeReference,
|
calleeReference,
|
||||||
FirFunctionCallOrigin.OPERATOR
|
FirFunctionCallOrigin.Operator
|
||||||
)
|
)
|
||||||
|
|
||||||
@FirBuilderDsl
|
@FirBuilderDsl
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ open class FirFunctionCallBuilder : FirAbstractFunctionCallBuilder, FirAnnotatio
|
|||||||
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
override var extensionReceiver: FirExpression = FirNoReceiverExpression
|
||||||
override var argumentList: FirArgumentList = FirEmptyArgumentList
|
override var argumentList: FirArgumentList = FirEmptyArgumentList
|
||||||
override lateinit var calleeReference: FirNamedReference
|
override lateinit var calleeReference: FirNamedReference
|
||||||
override var origin: FirFunctionCallOrigin = FirFunctionCallOrigin.REGULAR
|
override var origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Regular
|
||||||
|
|
||||||
@OptIn(FirImplementationDetail::class)
|
@OptIn(FirImplementationDetail::class)
|
||||||
override fun build(): FirFunctionCall {
|
override fun build(): FirFunctionCall {
|
||||||
|
|||||||
+1
-1
@@ -39,7 +39,7 @@ internal class FirComponentCallImpl(
|
|||||||
) : FirComponentCall() {
|
) : FirComponentCall() {
|
||||||
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||||
override var calleeReference: FirNamedReference = FirSimpleNamedReference(source, Name.identifier("component$componentIndex"), null)
|
override var calleeReference: FirNamedReference = FirSimpleNamedReference(source, Name.identifier("component$componentIndex"), null)
|
||||||
override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.REGULAR
|
override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Operator
|
||||||
|
|
||||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||||
typeRef.accept(visitor, data)
|
typeRef.accept(visitor, data)
|
||||||
|
|||||||
+1
-1
@@ -35,7 +35,7 @@ internal class FirImplicitInvokeCallImpl(
|
|||||||
override var calleeReference: FirNamedReference,
|
override var calleeReference: FirNamedReference,
|
||||||
) : FirImplicitInvokeCall() {
|
) : FirImplicitInvokeCall() {
|
||||||
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||||
override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.OPERATOR
|
override val origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Operator
|
||||||
|
|
||||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||||
typeRef.accept(visitor, data)
|
typeRef.accept(visitor, data)
|
||||||
|
|||||||
@@ -6,5 +6,5 @@
|
|||||||
package org.jetbrains.kotlin.fir.expressions
|
package org.jetbrains.kotlin.fir.expressions
|
||||||
|
|
||||||
enum class FirFunctionCallOrigin {
|
enum class FirFunctionCallOrigin {
|
||||||
REGULAR, INFIX, OPERATOR
|
Regular, Infix, Operator
|
||||||
}
|
}
|
||||||
+1
-1
@@ -179,7 +179,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
|||||||
builder(functionCall) {
|
builder(functionCall) {
|
||||||
configurationForFunctionCallBuilder()
|
configurationForFunctionCallBuilder()
|
||||||
default("origin") {
|
default("origin") {
|
||||||
value = "FirFunctionCallOrigin.REGULAR"
|
value = "FirFunctionCallOrigin.Regular"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
builder(implicitInvokeCall, init = configurationForFunctionCallBuilder)
|
builder(implicitInvokeCall, init = configurationForFunctionCallBuilder)
|
||||||
|
|||||||
+2
-2
@@ -154,11 +154,11 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl(implicitInvokeCall) {
|
impl(implicitInvokeCall) {
|
||||||
default("origin", "FirFunctionCallOrigin.OPERATOR")
|
default("origin", "FirFunctionCallOrigin.Operator")
|
||||||
}
|
}
|
||||||
|
|
||||||
impl(componentCall) {
|
impl(componentCall) {
|
||||||
default("origin", "FirFunctionCallOrigin.REGULAR")
|
default("origin", "FirFunctionCallOrigin.Operator")
|
||||||
}
|
}
|
||||||
|
|
||||||
impl(qualifiedAccessExpression)
|
impl(qualifiedAccessExpression)
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
|
||||||
|
|
||||||
open class Example {
|
|
||||||
fun invoke() = 0
|
|
||||||
fun get(i: Int) = 0
|
|
||||||
|
|
||||||
fun component1() = 0
|
|
||||||
fun component2() = 0
|
|
||||||
|
|
||||||
fun inc() = Example()
|
|
||||||
|
|
||||||
fun plus(o: Example) = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
class Example2 : Example()
|
|
||||||
|
|
||||||
operator fun Example.invoke() = ""
|
|
||||||
operator fun Example.get(i: Int) = ""
|
|
||||||
|
|
||||||
operator fun Example.component1() = ""
|
|
||||||
operator fun Example.component2() = ""
|
|
||||||
|
|
||||||
operator fun Example.inc() = Example2()
|
|
||||||
|
|
||||||
infix fun Example.plus(o: Example) = ""
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
var a = Example()
|
|
||||||
val b = Example()
|
|
||||||
|
|
||||||
consumeString(a())
|
|
||||||
consumeString(a[1])
|
|
||||||
|
|
||||||
val (x, y) = Example()
|
|
||||||
consumeString(<!ARGUMENT_TYPE_MISMATCH!>x<!>)
|
|
||||||
consumeString(<!ARGUMENT_TYPE_MISMATCH!>y<!>)
|
|
||||||
|
|
||||||
consumeExample2(++a)
|
|
||||||
|
|
||||||
consumeString(a plus b)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun consumeInt(i: Int) {}
|
|
||||||
fun consumeString(s: String) {}
|
|
||||||
fun consumeExample2(e: Example2) {}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
||||||
|
|
||||||
open class Example {
|
open class Example {
|
||||||
|
|||||||
Reference in New Issue
Block a user