diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index d816f26ba57..033c9ed6885 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1130,6 +1130,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("parameter") } + val NOT_YET_SUPPORTED_IN_INLINE by error(PositioningStrategy.NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT) { + parameter("message") + } + val RECURSION_IN_INLINE by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { parameter("symbol") } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt index df4323d56b9..8d5228bbd63 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/model/RegularDiagnosticData.kt @@ -95,6 +95,7 @@ enum class PositioningStrategy(private val strategy: String? = null) { DATA_MODIFIER, SPREAD_OPERATOR, DECLARATION_WITH_BODY, + NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT, INCOMPATIBLE_DECLARATION, ACTUAL_DECLARATION_NAME, UNREACHABLE_CODE, diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 10e01c3a76e..f899abb127f 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -598,6 +598,7 @@ object FirErrors { // Inline val USAGE_IS_NOT_INLINABLE by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val NON_LOCAL_RETURN_NOT_ALLOWED by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) + val NOT_YET_SUPPORTED_IN_INLINE by error1(SourceElementPositioningStrategies.NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT) val RECURSION_IN_INLINE by error1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val NON_PUBLIC_CALL_FROM_PUBLIC_INLINE by error2, FirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE by error2, FirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt index 5e650b99d3e..d8d8247b133 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt @@ -10,21 +10,22 @@ import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.context.PersistentCheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope import org.jetbrains.kotlin.fir.analysis.checkers.util.checkChildrenWithCustomVisitor import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.utils.classId -import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility -import org.jetbrains.kotlin.fir.declarations.utils.isInline -import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.resolve.inference.isBuiltinFunctionalType import org.jetbrains.kotlin.fir.resolve.inference.isFunctionalType +import org.jetbrains.kotlin.fir.resolve.inference.isSuspendFunctionType import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.publishedApiEffectiveVisibility +import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenMembers import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.coneType @@ -37,11 +38,15 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) { if (!declaration.isInline) return // local inline functions are prohibited - if (declaration.isLocalMember) return + if (declaration.isLocalMember) { + reporter.reportOn(declaration.source, FirErrors.NOT_YET_SUPPORTED_IN_INLINE, "Local inline functions", context) + return + } if (declaration !is FirPropertyAccessor && declaration !is FirSimpleFunction) return val effectiveVisibility = declaration.effectiveVisibility checkInlineFunctionBody(declaration, effectiveVisibility, context, reporter) + checkParameters(declaration, context, reporter) } private fun checkInlineFunctionBody( @@ -64,7 +69,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { context.session, reporter ) - body.checkChildrenWithCustomVisitor(context, visitor) + body.checkChildrenWithCustomVisitor((context as PersistentCheckerContext).addDeclaration(function), visitor) } private class Visitor( @@ -102,6 +107,22 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { checkQualifiedAccess(variableAssignment, setterSymbol, data) } + override fun visitRegularClass(regularClass: FirRegularClass, data: CheckerContext) { + if (!regularClass.classKind.isSingleton && data.containingDeclarations.lastOrNull() === inlineFunction) { + reporter.reportOn(regularClass.source, FirErrors.NOT_YET_SUPPORTED_IN_INLINE, "Local classes", data) + } else { + super.visitRegularClass(regularClass, data) + } + } + + override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: CheckerContext) { + if (data.containingDeclarations.lastOrNull() === inlineFunction) { + reporter.reportOn(simpleFunction.source, FirErrors.NOT_YET_SUPPORTED_IN_INLINE, "Local functions", data) + } else { + super.visitSimpleFunction(simpleFunction, data) + } + } + private fun checkReceiversOfQualifiedAccessExpression( qualifiedAccessExpression: FirQualifiedAccessExpression, targetSymbol: FirBasedSymbol<*>?, @@ -310,4 +331,49 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { return containingClassVisibility == Visibilities.Private || containingClassVisibility == Visibilities.PrivateToThis } } + + private fun checkParameters(function: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) { + if (function !is FirSimpleFunction) return + + if (function.isSuspend) { + function.valueParameters + .filter { !it.isNoinline && it.defaultValue != null && it.returnTypeRef.coneType.isSuspendFunctionType(context.session) } + .forEach { param -> + reporter.reportOn( + param.source, + FirErrors.NOT_YET_SUPPORTED_IN_INLINE, + "Suspend functional parameters with default values", + context + ) + } + } + + //check for inherited default values + val classSymbol = function.containingClass()?.toSymbol(context.session) as? FirClassSymbol<*> ?: return + if (!function.isOverride) return + if (!function.valueParameters.any { it.defaultValue == null }) return + val scope = classSymbol.unsubstitutedScope(context) + + //this call is needed because AbstractFirUseSiteMemberScope collect overrides in it only, + //and not in processDirectOverriddenFunctionsWithBaseScope + scope.processFunctionsByName(function.name) { } + val overriddenMembers = scope.getDirectOverriddenMembers(function.symbol, true) + val paramsWithDefaults = overriddenMembers.flatMap { it -> + if (it !is FirFunctionSymbol<*>) return@flatMap emptyList() + it.valueParameterSymbols.mapIndexedNotNull { idx, param -> + idx.takeIf { param.hasDefaultValue } + } + }.toSet() + function.valueParameters.forEachIndexed { idx, param -> + if (param.defaultValue == null && paramsWithDefaults.contains(idx)) { + reporter.reportOn( + param.source, + FirErrors.NOT_YET_SUPPORTED_IN_INLINE, + "Functional parameters with inherited default values", + context + ) + } + } + + } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index b80515f9112..81529ea2ac0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -278,6 +278,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_NULL_ASSERTIO import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_NULL_ASSERTION_ON_LAMBDA_EXPRESSION 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 +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_YET_SUPPORTED_IN_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NO_COMPANION_OBJECT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NO_ELSE_IN_WHEN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NO_GET_METHOD @@ -1481,6 +1482,7 @@ class FirDefaultErrorMessages { SYMBOL, SYMBOL ) + map.put(NOT_YET_SUPPORTED_IN_INLINE, "{0} are not yet supported in inline functions", STRING) map.put(SUPER_CALL_FROM_PUBLIC_INLINE, "Accessing super members from public-API inline function is deprecated", SYMBOL) //imports diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index b15d769d630..fa146b0a646 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -860,6 +860,26 @@ object LightTreePositioningStrategies { } } } + + val NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + val nodeToMark = when (node.tokenType) { + KtNodeTypes.CLASS -> + tree.findChildByType(node, KtTokens.CLASS_KEYWORD) + KtNodeTypes.OBJECT_DECLARATION -> + tree.findChildByType(node, KtTokens.OBJECT_KEYWORD) + KtNodeTypes.FUN -> + tree.inlineModifier(node) ?: tree.findChildByType(node, KtTokens.FUN_KEYWORD) + else -> node + } + return markElement(nodeToMark ?: node, startOffset, endOffset, tree, node) + } + } } fun FirSourceElement.hasValOrVar(): Boolean = @@ -982,6 +1002,9 @@ internal fun FlyweightCapableTreeStructure.modalityModifier(decl internal fun FlyweightCapableTreeStructure.overrideModifier(declaration: LighterASTNode): LighterASTNode? = modifierList(declaration)?.let { findChildByType(it, KtTokens.OVERRIDE_KEYWORD) } +internal fun FlyweightCapableTreeStructure.inlineModifier(declaration: LighterASTNode): LighterASTNode? = + modifierList(declaration)?.let { findChildByType(it, KtTokens.INLINE_KEYWORD) } + internal fun FlyweightCapableTreeStructure.typeParametersList(declaration: LighterASTNode): LighterASTNode? = findChildByType(declaration, KtNodeTypes.TYPE_PARAMETER_LIST) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index 77688447397..c273de44a81 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -281,4 +281,9 @@ object SourceElementPositioningStrategies { // TODO val ACTUAL_DECLARATION_NAME = DEFAULT val INCOMPATIBLE_DECLARATION = DEFAULT + + val NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT = SourceElementPositioningStrategy( + LightTreePositioningStrategies.NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT, + PositioningStrategies.NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT + ) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt index dd4aa577fb5..ab8af3c86df 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt @@ -70,6 +70,7 @@ abstract class AbstractFirUseSiteMemberScope( functionSymbol: FirNamedFunctionSymbol, processor: (FirNamedFunctionSymbol, FirTypeScope) -> ProcessorAction ): ProcessorAction = + //directOverriddenFunctions might be not filled for functionSymbol if it is not from processFunctionsByName call doProcessDirectOverriddenCallables( functionSymbol, processor, directOverriddenFunctions, superTypesScope, FirTypeScope::processDirectOverriddenFunctionsWithBaseScope diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt index 62ad22dcff4..071377cd502 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt @@ -17,7 +17,7 @@ fun find(): Any? { } fun find4(): Any? { - inline fun visit(element: Any) { + inline fun visit(element: Any) { return@find4 element } return null diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.fir.kt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.fir.kt index 303a77830d0..142e68f093b 100644 --- a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.fir.kt @@ -40,9 +40,9 @@ abstract class Base { } class Derived : Base() { - override final inline fun foo(f: () -> Unit) { + override final inline fun foo(f: () -> Unit) { f() } } -inline fun default11(s : () -> Derived = ::Derived) {} \ No newline at end of file +inline fun default11(s : () -> Derived = ::Derived) {} diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.fir.kt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.fir.kt deleted file mode 100644 index 03209ab4197..00000000000 --- a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE -NOTHING_TO_INLINE -// SKIP_TXT - -suspend inline fun test1(s : suspend () -> String = { "OK" }) {} -suspend inline fun test2(s : () -> String = { "OK" }) {} -suspend inline fun test3(crossinline s : suspend () -> String = { "OK" }) {} -suspend inline fun test4(crossinline s : () -> String = { "OK" }) {} -suspend inline fun test5(noinline s : suspend () -> String = { "OK" }) {} -suspend inline fun test6(noinline s : () -> String = { "OK" }) {} - diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt index 85372fb5dee..2a0830a5baf 100644 --- a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineSuspend.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE -NOTHING_TO_INLINE // SKIP_TXT diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.fir.kt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.fir.kt index 0836ab9ef8e..18ad100e6a7 100644 --- a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.fir.kt @@ -39,9 +39,9 @@ abstract class Base { } class Derived : Base() { - override final inline fun foo(f: () -> Unit) { + override final inline fun foo(f: () -> Unit) { f() } } -inline fun default11(s : () -> Derived = ::Derived) {} \ No newline at end of file +inline fun default11(s : () -> Derived = ::Derived) {} diff --git a/compiler/testData/diagnostics/tests/inline/localFun.fir.kt b/compiler/testData/diagnostics/tests/inline/localFun.fir.kt deleted file mode 100644 index 7b15da005a7..00000000000 --- a/compiler/testData/diagnostics/tests/inline/localFun.fir.kt +++ /dev/null @@ -1,4 +0,0 @@ -fun main() { - inline fun a(){ - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/localFun.kt b/compiler/testData/diagnostics/tests/inline/localFun.kt index 0e373675cbc..4442d4dd333 100644 --- a/compiler/testData/diagnostics/tests/inline/localFun.kt +++ b/compiler/testData/diagnostics/tests/inline/localFun.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun main() { inline fun a(){ } diff --git a/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt b/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt index 0c368ac56ba..950e1c52e6f 100644 --- a/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt @@ -1,10 +1,10 @@ inline fun inlineFun() { - fun localFun() {} - class LocalClass {} + fun localFun() {} + class LocalClass {} } fun outerFun() { - inline fun localInlineFun() {} + inline fun localInlineFun() {} } abstract class Base { @@ -13,6 +13,6 @@ abstract class Base { class Derived : Base() { override final inline fun withDefault( - f: () -> Unit + f: () -> Unit ) {} -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/localFun.fir.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/localFun.fir.kt index 63f60ab4e35..b97e005c8ae 100644 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/localFun.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/localFun.fir.kt @@ -1,14 +1,14 @@ // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE inline fun inlineFunOnlyLocal(crossinline p: () -> R) { - fun a() { + fun a() { val z = p() } a() } inline fun inlineFun(p: () -> R) { - fun a() { + fun a() { p() } a() diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/nonInlinedClass.fir.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/nonInlinedClass.fir.kt index df9dbafb8d5..2eb76075e4d 100644 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/nonInlinedClass.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/nonInlinedClass.fir.kt @@ -1,7 +1,7 @@ // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE inline fun inlineFunOnlyLocal(crossinline p: () -> R) { - class A { + class A { val z = p() @@ -12,7 +12,7 @@ inline fun inlineFunOnlyLocal(crossinline p: () -> R) { } inline fun inlineFun(p: () -> R) { - class A { + class A { val z = p() diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localClass2.fir.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/localClass2.fir.kt deleted file mode 100644 index 9c8142c5777..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localClass2.fir.kt +++ /dev/null @@ -1,13 +0,0 @@ -public fun test() { - - class Z { - public fun localFun() { - - } - } - - inline fun localFun2() { - Z().localFun() - } - -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localClass2.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/localClass2.kt index 182426e82ac..e8eebe96485 100644 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localClass2.kt +++ b/compiler/testData/diagnostics/tests/inline/nonPublicMember/localClass2.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL public fun test() { class Z { diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localFun.fir.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/localFun.fir.kt deleted file mode 100644 index 513803471a2..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localFun.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -public fun test() { - - fun localFun() { - - } - - inline fun localFun2() { - localFun() - } - -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localFun.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/localFun.kt index 25e80fb1e92..7537bfafa6c 100644 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/localFun.kt +++ b/compiler/testData/diagnostics/tests/inline/nonPublicMember/localFun.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL public fun test() { fun localFun() { diff --git a/compiler/testData/diagnostics/tests/inline/property/unsupportedConstruction.fir.kt b/compiler/testData/diagnostics/tests/inline/property/unsupportedConstruction.fir.kt deleted file mode 100644 index 1c3cc5dd2e9..00000000000 --- a/compiler/testData/diagnostics/tests/inline/property/unsupportedConstruction.fir.kt +++ /dev/null @@ -1,20 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE - -inline val z: Int - get() { - - class A { - fun a() { - class AInner {} - } - } - - object B{ - object BInner {} - } - - fun local() { - fun localInner() {} - } - return 1 -} diff --git a/compiler/testData/diagnostics/tests/inline/property/unsupportedConstruction.kt b/compiler/testData/diagnostics/tests/inline/property/unsupportedConstruction.kt index 31e0d73998b..d6ef76d9d6e 100644 --- a/compiler/testData/diagnostics/tests/inline/property/unsupportedConstruction.kt +++ b/compiler/testData/diagnostics/tests/inline/property/unsupportedConstruction.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE inline val z: Int diff --git a/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.fir.kt b/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.fir.kt index c67341d8b48..ca197313e3b 100644 --- a/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.fir.kt @@ -3,7 +3,7 @@ inline fun unsupported() { - class A { + class A { fun a() { class AInner {} } @@ -13,7 +13,7 @@ inline fun unsupported() { object BInner {} } - fun local() { + fun local() { fun localInner() {} } } @@ -27,7 +27,7 @@ open class Base { } class Derived: Base() { - inline final override fun foo(a: Int) { + inline final override fun foo(a: Int) { } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index d61da560836..71bf7474199 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3092,6 +3092,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.NOT_YET_SUPPORTED_IN_INLINE) { firDiagnostic -> + NotYetSupportedInInlineImpl( + firDiagnostic.a, + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.RECURSION_IN_INLINE) { firDiagnostic -> RecursionInInlineImpl( firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 5f98f716a52..12ee8cb6954 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2155,6 +2155,11 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val parameter: KtSymbol } + abstract class NotYetSupportedInInline : KtFirDiagnostic() { + override val diagnosticClass get() = NotYetSupportedInInline::class + abstract val message: String + } + abstract class RecursionInInline : KtFirDiagnostic() { override val diagnosticClass get() = RecursionInInline::class abstract val symbol: KtSymbol diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index eacdba98564..3b07f514477 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3482,6 +3482,14 @@ internal class NonLocalReturnNotAllowedImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class NotYetSupportedInInlineImpl( + override val message: String, + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.NotYetSupportedInInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class RecursionInInlineImpl( override val symbol: KtSymbol, firDiagnostic: FirPsiDiagnostic,