[FIR] Implement NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE diagnostic
#KT-59398 Fixed
This commit is contained in:
committed by
Space Team
parent
ed493c99e3
commit
129b930bd7
+7
@@ -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,
|
||||
|
||||
+5
@@ -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
|
||||
}
|
||||
|
||||
+6
@@ -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,
|
||||
|
||||
+4
@@ -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)
|
||||
|
||||
+7
-4
@@ -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)
|
||||
|
||||
+6
@@ -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"
|
||||
|
||||
+4
-4
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user