[FIR] Implement NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE diagnostic

#KT-59398 Fixed
This commit is contained in:
Kirill Rakhman
2023-07-21 15:57:50 +02:00
committed by Space Team
parent ed493c99e3
commit 129b930bd7
8 changed files with 40 additions and 8 deletions
@@ -4413,6 +4413,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE) { firDiagnostic ->
NotSupportedInlineParameterInInlineParameterDefaultValueImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.REIFIED_TYPE_PARAMETER_IN_OVERRIDE) { firDiagnostic ->
ReifiedTypeParameterInOverrideImpl(
firDiagnostic as KtPsiDiagnostic,
@@ -3079,6 +3079,11 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
val parameter: KtSymbol
}
interface NotSupportedInlineParameterInInlineParameterDefaultValue : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = NotSupportedInlineParameterInInlineParameterDefaultValue::class
val parameter: KtSymbol
}
interface ReifiedTypeParameterInOverride : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = ReifiedTypeParameterInOverride::class
}
@@ -3713,6 +3713,12 @@ internal class InvalidDefaultFunctionalParameterForInlineImpl(
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.InvalidDefaultFunctionalParameterForInline
internal class NotSupportedInlineParameterInInlineParameterDefaultValueImpl(
override val parameter: KtSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.NotSupportedInlineParameterInInlineParameterDefaultValue
internal class ReifiedTypeParameterInOverrideImpl(
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
@@ -1544,6 +1544,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
parameter<FirValueParameterSymbol>("parameter")
}
val NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE by error<KtElement> {
parameter<FirValueParameterSymbol>("parameter")
}
val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error<KtElement>(PositioningStrategy.REIFIED_MODIFIER)
val INLINE_PROPERTY_WITH_BACKING_FIELD by error<KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
@@ -780,6 +780,7 @@ object FirErrors {
val OVERRIDE_BY_INLINE by warning0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
val NON_INTERNAL_PUBLISHED_API by error0<KtElement>()
val INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE by error1<KtElement, FirValueParameterSymbol>()
val NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE by error1<KtElement, FirValueParameterSymbol>()
val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error0<KtElement>(SourceElementPositioningStrategies.REIFIED_MODIFIER)
val INLINE_PROPERTY_WITH_BACKING_FIELD by error0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
val ILLEGAL_INLINE_PARAMETER_MODIFIER by error0<KtElement>(SourceElementPositioningStrategies.INLINE_PARAMETER_MODIFIER)
@@ -52,7 +52,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
class InlineFunctionBodyContext(
val inlineFunction: FirFunction,
private val inlineFunEffectiveVisibility: EffectiveVisibility,
private val inalienableParameters: List<FirValueParameterSymbol>,
private val inlinableParameters: List<FirValueParameterSymbol>,
val session: FirSession,
) : FirDefaultVisitor<Unit, CheckerContext>() {
private val isEffectivelyPrivateApiFunction: Boolean = inlineFunEffectiveVisibility.privateApi
@@ -137,7 +137,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
val argument = wrappedArgument.unwrapArgument()
val resolvedArgumentSymbol = argument.toResolvedCallableSymbol() as? FirVariableSymbol<*> ?: continue
val valueParameterOfOriginalInlineFunction = inalienableParameters.firstOrNull { it == resolvedArgumentSymbol }
val valueParameterOfOriginalInlineFunction = inlinableParameters.firstOrNull { it == resolvedArgumentSymbol }
if (valueParameterOfOriginalInlineFunction != null) {
val factory = when {
calledFunctionSymbol.isInline -> when {
@@ -163,7 +163,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
reporter: DiagnosticReporter,
) {
val receiverSymbol = receiverExpression.toResolvedCallableSymbol() ?: return
if (receiverSymbol in inalienableParameters) {
if (receiverSymbol in inlinableParameters) {
if (!isInvokeOrInlineExtension(targetSymbol)) {
reporter.reportOn(
receiverExpression.source ?: qualifiedAccessExpression.source,
@@ -192,10 +192,13 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
val source = qualifiedAccess.source ?: return
if (targetSymbol !is FirCallableSymbol<*>) return
if (targetSymbol in inalienableParameters) {
if (targetSymbol in inlinableParameters) {
if (!qualifiedAccess.partOfCall(context)) {
reporter.reportOn(source, FirErrors.USAGE_IS_NOT_INLINABLE, targetSymbol, context)
}
if (context.containingDeclarations.any { it.symbol in inlinableParameters }) {
reporter.reportOn(source, FirErrors.NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE, targetSymbol as FirValueParameterSymbol, context)
}
}
checkVisibilityAndAccess(qualifiedAccess, targetSymbol, source, context, reporter)
checkRecursion(targetSymbol, source, context, reporter)
@@ -394,6 +394,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_A_MULTIPLATFO
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_A_SUPERTYPE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_NULL_ASSERTION_ON_CALLABLE_REFERENCE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_NULL_ASSERTION_ON_LAMBDA_EXPRESSION
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_YET_SUPPORTED_IN_INLINE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NO_ACTUAL_FOR_EXPECT
@@ -1380,6 +1381,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
"Invalid default value for inline function parameter. Only lambdas, anonymous functions, and callable references are supported",
DECLARATION_NAME
)
map.put(
NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE,
"Usage of inline parameter ''{0}'' in default value of inline parameter is not supported.",
DECLARATION_NAME
)
map.put(
SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_VALUE_CLASS,
"Secondary constructors with bodies are reserved for future releases"
@@ -6,21 +6,21 @@ inline fun inlineFun(lambda: () -> String) = lambda()
fun noInlineFun(lambda: () -> String) = lambda()
inline fun default0_1(lambda: () -> String, dlambda: () -> String = { <!USAGE_IS_NOT_INLINABLE!>lambda<!>; "OK" }) {
inline fun default0_1(lambda: () -> String, dlambda: () -> String = { <!NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE, USAGE_IS_NOT_INLINABLE!>lambda<!>; "OK" }) {
lambda() + dlambda()
}
inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (<!USAGE_IS_NOT_INLINABLE!>lambda<!>) }) {
inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (<!NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE, USAGE_IS_NOT_INLINABLE!>lambda<!>) }) {
lambda() + dlambda()
}
inline fun default0(lambda: () -> String, dlambda: () -> String = { noInlineFun (<!USAGE_IS_NOT_INLINABLE!>lambda<!>) }) {
inline fun default0(lambda: () -> String, dlambda: () -> String = { noInlineFun (<!NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE, USAGE_IS_NOT_INLINABLE!>lambda<!>) }) {
lambda() + dlambda()
}
inline fun default1_0(lambda: () -> String, dlambda: () -> String = { lambda() }) {
inline fun default1_0(lambda: () -> String, dlambda: () -> String = { <!NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE!>lambda<!>() }) {
lambda() + dlambda()
}