From 015c2d18755278f76b6b250ed777446849945f10 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Tue, 20 Jul 2021 13:21:38 +0300 Subject: [PATCH] [FIR] Add NOTHING_TO_INLINE diagnostic --- .../testData/resolve/cfg/postponedLambdas.kt | 2 +- .../RedundantVisibilityModifierChecker.kt | 2 +- .../diagnostics/FirDiagnosticsList.kt | 2 + .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../FirInlineDeclarationChecker.kt | 18 +++ .../diagnostics/FirDefaultErrorMessages.kt | 5 + .../tests/controlFlowAnalysis/kt10823.fir.kt | 33 ------ .../tests/controlFlowAnalysis/kt10823.kt | 1 + .../exposed/exceptionOnFakeInvisible.fir.kt | 2 +- .../tests/inline/fromInlineToNoInline.fir.kt | 7 -- .../tests/inline/fromInlineToNoInline.kt | 1 + .../messagesForUnsupportedInInline.fir.kt | 2 +- .../nonLocalReturns/lambdaAsGeneric.fir.kt | 2 +- .../lambdaAsNonFunction.fir.kt | 4 +- .../inline/nonPublicMember/kt14887.fir.kt | 2 +- .../tests/inline/nothingToInline.fir.kt | 29 ----- .../tests/inline/nothingToInline.kt | 1 + .../tests/inline/nullableFunction.fir.kt | 4 +- .../tests/inline/parenthesized.fir.kt | 2 +- .../diagnostics/tests/inline/returns.fir.kt | 20 ---- .../diagnostics/tests/inline/returns.kt | 1 + .../diagnostics/tests/inline/sam.fir.kt | 58 ---------- .../testData/diagnostics/tests/inline/sam.kt | 1 + .../tests/modifiers/inlineParameters.fir.kt | 8 +- .../topLevelFun/inlineFun.fir.kt | 4 +- .../suspendFunctionType/inline.fir.kt | 4 +- .../testsWithStdLib/native/inline.fir.kt | 6 +- .../operator-call/p-2/pos/3.5.fir.kt | 103 ------------------ .../operator-call/p-2/pos/3.5.kt | 1 + .../operator-call/p-2/pos/3.6.fir.kt | 34 ------ .../operator-call/p-2/pos/3.6.kt | 1 + .../diagnostics/KtFirDataClassConverters.kt | 6 + .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 + .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 ++ 34 files changed, 72 insertions(+), 306 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/nothingToInline.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/returns.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/sam.fir.kt delete mode 100644 compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.fir.kt delete mode 100644 compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.fir.kt diff --git a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.kt b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.kt index ac29eec136d..a45c1edb770 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.kt +++ b/compiler/fir/analysis-tests/testData/resolve/cfg/postponedLambdas.kt @@ -1,5 +1,5 @@ // !DUMP_CFG -inline fun foo(vararg x: Any) {} +inline fun foo(vararg x: Any) {} fun test(a: Any, b: Any, c: Any) { foo(a, { "" }, b) diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt index f1105e45754..388747a4a71 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.kt @@ -6,7 +6,7 @@ fun f() { LocalClass().foo = 1 } -internal inline fun internal() { +internal inline fun internal() { f() } 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 033c9ed6885..7fb5a34da0c 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 @@ -1134,6 +1134,8 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("message") } + val NOTHING_TO_INLINE by warning(PositioningStrategy.NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT) + val RECURSION_IN_INLINE by error(PositioningStrategy.REFERENCE_BY_QUALIFIED) { parameter("symbol") } 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 f899abb127f..f94101271e0 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 @@ -599,6 +599,7 @@ object FirErrors { 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 NOTHING_TO_INLINE by warning0(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 d8d8247b133..1b2b4e89a84 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 @@ -11,6 +11,7 @@ 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.isInlineOnly 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 @@ -30,6 +31,7 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.isMarkedNullable +import org.jetbrains.kotlin.fir.types.isNullable import org.jetbrains.kotlin.fir.types.toSymbol import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.util.OperatorNameConventions @@ -47,6 +49,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { val effectiveVisibility = declaration.effectiveVisibility checkInlineFunctionBody(declaration, effectiveVisibility, context, reporter) checkParameters(declaration, context, reporter) + checkNothingToInline(declaration, context, reporter) } private fun checkInlineFunctionBody( @@ -374,6 +377,21 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { ) } } + } + private fun checkNothingToInline(function: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) { + if (function !is FirSimpleFunction) return + if (function.isExpect || function.isSuspend) return + if (function.typeParameters.any { it.symbol.isReified }) return + val hasInlinableParameters = + function.valueParameters.any { param -> + val type = param.returnTypeRef.coneType + !param.isNoinline && !type.isNullable + && (type.isFunctionalType(context.session) || type.isSuspendFunctionType(context.session)) + } + if (hasInlinableParameters) return + if (function.isInlineOnly()) return + + reporter.reportOn(function.source, FirErrors.NOTHING_TO_INLINE, 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 81529ea2ac0..89f17c3d5d2 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 @@ -270,6 +270,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_CONST import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_VARARG_SPREAD +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOTHING_TO_INLINE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOTHING_TO_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_AN_ANNOTATION_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_A_LOOP_LABEL @@ -1483,6 +1484,10 @@ class FirDefaultErrorMessages { SYMBOL ) map.put(NOT_YET_SUPPORTED_IN_INLINE, "{0} are not yet supported in inline functions", STRING) + map.put( + NOTHING_TO_INLINE, + "Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types" + ) map.put(SUPER_CALL_FROM_PUBLIC_INLINE, "Accessing super members from public-API inline function is deprecated", SYMBOL) //imports diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt deleted file mode 100644 index 071377cd502..00000000000 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.fir.kt +++ /dev/null @@ -1,33 +0,0 @@ -fun find2(): Any? { - fun visit(element: Any) { - return@find2 element - } - return null -} - -// For find(): AssertionError at ControlFlowInstructionsGeneratorWorker.getExitPoint() - -fun find(): Any? { - object : Any() { - fun visit(element: Any) { - return@find element - } - } - return null -} - -fun find4(): Any? { - inline fun visit(element: Any) { - return@find4 element - } - return null -} - -fun find3(): Any? { - object : Any() { - inline fun visit(element: Any) { - return@find3 element - } - } - return null -} diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.kt index 0c003eb202f..171416f30a4 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.kt +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt10823.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun find2(): Any? { fun visit(element: Any) { return@find2 element diff --git a/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.fir.kt b/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.fir.kt index cb7e8916491..0d09ca2da8c 100644 --- a/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.fir.kt +++ b/compiler/testData/diagnostics/tests/exposed/exceptionOnFakeInvisible.fir.kt @@ -6,7 +6,7 @@ fun bar(arg: String) = arg class Derived : Base("123") { - private inline fun foo() { + private inline fun foo() { bar(v) } } diff --git a/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt b/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt deleted file mode 100644 index 25f8cb087aa..00000000000 --- a/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.fir.kt +++ /dev/null @@ -1,7 +0,0 @@ -inline fun onlyLocal(p: () -> R) { - inlineAll(p) -} - -inline fun inlineAll(noinline p: () -> R) { - p() -} diff --git a/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.kt b/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.kt index a90db24b9d9..8b218957a1a 100644 --- a/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.kt +++ b/compiler/testData/diagnostics/tests/inline/fromInlineToNoInline.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL inline fun onlyLocal(p: () -> R) { inlineAll(p) } diff --git a/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt b/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt index 950e1c52e6f..1e912c2ac51 100644 --- a/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/messagesForUnsupportedInInline.fir.kt @@ -1,4 +1,4 @@ -inline fun inlineFun() { +inline fun inlineFun() { fun localFun() {} class LocalClass {} } diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt index b716fc00100..827eb0eeb58 100644 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsGeneric.fir.kt @@ -7,6 +7,6 @@ fun box() : String { return "OK" } -inline fun test(p: T) { +inline fun test(p: T) { p.toString() } diff --git a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.fir.kt b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.fir.kt index 438220488c2..e0f80a40b85 100644 --- a/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nonLocalReturns/lambdaAsNonFunction.fir.kt @@ -6,6 +6,6 @@ fun box() : String { return "OK" } -inline fun test(p: Any) { +inline fun test(p: Any) { p.toString() -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.fir.kt b/compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.fir.kt index 30b658a5860..9babaef32fd 100644 --- a/compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nonPublicMember/kt14887.fir.kt @@ -1,4 +1,4 @@ -inline fun foo() { +inline fun foo() { unresolved().another unresolved().another() } diff --git a/compiler/testData/diagnostics/tests/inline/nothingToInline.fir.kt b/compiler/testData/diagnostics/tests/inline/nothingToInline.fir.kt deleted file mode 100644 index 69f22f45b25..00000000000 --- a/compiler/testData/diagnostics/tests/inline/nothingToInline.fir.kt +++ /dev/null @@ -1,29 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NULLABLE_INLINE_PARAMETER -CONFLICTING_JVM_DECLARATIONS - -inline fun test() { - -} - -inline fun test2(s : (Int) -> Int) { - -} - -inline fun test3(noinline s : (Int) -> Int) { - -} - -inline fun test4(noinline s : Int.() -> Int) { - -} - -inline fun Function1?.test5() { - -} - -inline fun Function1?.test6() { - -} - -inline fun test2(s : ((Int) -> Int)?) { - -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/nothingToInline.kt b/compiler/testData/diagnostics/tests/inline/nothingToInline.kt index 0a4780dafbb..f369c38c350 100644 --- a/compiler/testData/diagnostics/tests/inline/nothingToInline.kt +++ b/compiler/testData/diagnostics/tests/inline/nothingToInline.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NULLABLE_INLINE_PARAMETER -CONFLICTING_JVM_DECLARATIONS inline fun test() { diff --git a/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt b/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt index fbbdef51cde..030b66b226b 100644 --- a/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/nullableFunction.fir.kt @@ -12,10 +12,10 @@ public inline fun submitNoInline(noinline action: Function1?, s: ( action?.invoke(10) } -public inline fun Function1?.submit() { +public inline fun Function1?.submit() { } -public inline fun submit(action: Function1?) { +public inline fun submit(action: Function1?) { } diff --git a/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt b/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt index b47a36e944e..49451133b4c 100644 --- a/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/parenthesized.fir.kt @@ -7,7 +7,7 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit) { (s) } -inline fun Function1.inlineExt() { +inline fun Function1.inlineExt() { (this).invoke(11) (this) invoke 11 (this)(11) diff --git a/compiler/testData/diagnostics/tests/inline/returns.fir.kt b/compiler/testData/diagnostics/tests/inline/returns.fir.kt deleted file mode 100644 index 8a694cc500e..00000000000 --- a/compiler/testData/diagnostics/tests/inline/returns.fir.kt +++ /dev/null @@ -1,20 +0,0 @@ -inline fun inlineFun(s: (p: Int) -> Unit) : (p: Int) -> Unit { - return s -} - -inline fun inlineFun2(s: (p: Int) -> Unit) : (p: Int) -> Unit = s - - -inline fun inlineFunWithExt(ext: Int.(p: Int) -> Unit) : Int.(p: Int) -> Unit { - return ext -} - -inline fun inlineFunWithExt2(ext: Int.(p: Int) -> Unit) : Int.(p: Int) -> Unit = ext - - - -inline fun Function1.inlineExt(): Function1 { - return this -} - -inline fun Function1.inlineExt2(): Function1 = this diff --git a/compiler/testData/diagnostics/tests/inline/returns.kt b/compiler/testData/diagnostics/tests/inline/returns.kt index 0a71afd26b7..93338c5fe29 100644 --- a/compiler/testData/diagnostics/tests/inline/returns.kt +++ b/compiler/testData/diagnostics/tests/inline/returns.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL inline fun inlineFun(s: (p: Int) -> Unit) : (p: Int) -> Unit { return s } diff --git a/compiler/testData/diagnostics/tests/inline/sam.fir.kt b/compiler/testData/diagnostics/tests/inline/sam.fir.kt deleted file mode 100644 index 1a48eac4885..00000000000 --- a/compiler/testData/diagnostics/tests/inline/sam.fir.kt +++ /dev/null @@ -1,58 +0,0 @@ -// !DIAGNOSTICS: -NON_LOCAL_RETURN_NOT_ALLOWED -// FILE: Run.java -public interface Run { - public int run(); -} - - -// FILE: Test.java -public class Test { - public void test(Run r) { - - } -} - -// FILE: test.kt -inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { - Test().test(){ - s(11) - s.invoke(11) - s invoke 11 - - 11.ext(11) - 11 ext 11 - - s - ext - 11 - } -} - -inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { - Test().test(){ - s(11) - s.invoke(11) - s invoke 11 - - 11.ext(11) - 11 ext 11 - - s - ext - - 11 - } -} - -inline fun Function1.inlineExt() { - Test().test(){ - invoke(11) - this.invoke(11) - this invoke 11 - this(11) - - this - - 11 - } -} diff --git a/compiler/testData/diagnostics/tests/inline/sam.kt b/compiler/testData/diagnostics/tests/inline/sam.kt index c8829745bef..27f819b90f1 100644 --- a/compiler/testData/diagnostics/tests/inline/sam.kt +++ b/compiler/testData/diagnostics/tests/inline/sam.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -NON_LOCAL_RETURN_NOT_ALLOWED // FILE: Run.java public interface Run { diff --git a/compiler/testData/diagnostics/tests/modifiers/inlineParameters.fir.kt b/compiler/testData/diagnostics/tests/modifiers/inlineParameters.fir.kt index b2058c75f90..1548e608688 100644 --- a/compiler/testData/diagnostics/tests/modifiers/inlineParameters.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/inlineParameters.fir.kt @@ -1,20 +1,20 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -inline fun foo(noinline x: Int) {} +inline fun foo(noinline x: Int) {} -inline fun bar(y: Int, crossinline x: String) {} +inline fun bar(y: Int, crossinline x: String) {} fun gav(noinline x: (Int) -> Unit, crossinline y: (String) -> Int) {} inline fun correct(noinline x: (Int) -> Unit, crossinline y: (String) -> Int) {} -inline fun incompatible(noinline crossinline x: () -> String) {} +inline fun incompatible(noinline crossinline x: () -> String) {} class FunctionSubtype : () -> Unit { override fun invoke() {} } -inline fun functionSubtype( +inline fun functionSubtype( noinline f: FunctionSubtype, crossinline g: FunctionSubtype ) { } diff --git a/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/inlineFun.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/inlineFun.fir.kt index b658c02c41a..7e7de1435e0 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/inlineFun.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/topLevelFun/inlineFun.fir.kt @@ -14,5 +14,5 @@ actual fun nonInlineFun() { } // MODULE: m3-js()()(m1-common) // FILE: js.kt -actual inline fun inlineFun() { } -actual inline fun nonInlineFun() { } +actual inline fun inlineFun() { } +actual inline fun nonInlineFun() { } diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt index 5c48382d95d..3fb5d9bd44a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt @@ -2,8 +2,8 @@ // SKIP_TXT inline fun foo1(x: suspend () -> Unit) {} inline fun foo2(crossinline x: suspend () -> Unit) {} -inline fun foo3(noinline x: suspend () -> Unit) {} -inline fun foo4(noinline crossinline x: suspend () -> Unit) {} +inline fun foo3(noinline x: suspend () -> Unit) {} +inline fun foo4(noinline crossinline x: suspend () -> Unit) {} suspend inline fun bar1(x: suspend () -> Unit) {} suspend inline fun bar2(crossinline x: suspend () -> Unit) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt index bc87beed226..fdde1b6acd9 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/native/inline.fir.kt @@ -1,11 +1,11 @@ import kotlin.jvm.* abstract class C { - inline external fun foo() + inline external fun foo() } fun test() { abstract class Local { - inline external fun foo() + inline external fun foo() } -} \ No newline at end of file +} diff --git a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.fir.kt deleted file mode 100644 index a7e01e8619a..00000000000 --- a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.fir.kt +++ /dev/null @@ -1,103 +0,0 @@ -// !LANGUAGE: +NewInference -// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION -EXTENSION_SHADOWED_BY_MEMBER -// SKIP_TXT - -/* - * KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE) - * - * SPEC VERSION: 0.1-268 - * MAIN LINK: overload-resolution, building-the-overload-candidate-set-ocs, operator-call -> paragraph 2 -> sentence 3 - * PRIMARY LINKS: overload-resolution, building-the-overload-candidate-set-ocs, call-with-an-explicit-receiver -> paragraph 6 -> sentence 5 - * overload-resolution, building-the-overload-candidate-set-ocs, operator-call -> paragraph 4 -> sentence 1 - * NUMBER: 5 - * DESCRIPTION: Star-imported extension callables - */ - - -// FILE: LibCase1.kt -// TESTCASE NUMBER: 1 -package libPackage -import testPackCase1.Case -import testPackCase1.Case.Inv -import testPackCase1.Case.E - -operator fun Case.E.plus(value: Int) = Inv() -operator fun Case.Inv.invoke(i: Int) = 1 - - -// FILE: TestCase11.kt -// TESTCASE NUMBER: 1 -package testPackCase1 -import libPackage.* - -class Case() { - class E(val plus: Inv? = null) { - /*operator*/ fun plus(value: Int) = Case() - } - - class Inv() { - /*operator*/ fun invoke(value: Int) = Case() - } - - fun foo(e: E) { - /*operator*/ fun E.plus(value: Int) = Case() - - run { - e + 1 - } - e + 1 - - } -} - -// FILE: Lib1.kt -// TESTCASE NUMBER: 2 -package libPackage1 - -public inline operator fun CharSequence.contains(regex: Regex): Boolean = regex.containsMatchIn(this) - -// FILE: TestCase12.kt -// TESTCASE NUMBER: 2 -package testPackCase2 -import libPackage1.* -class Case() { - - fun foo() { - "".contains(Regex("")) - } -} - -// FILE: LibCase3.kt -// TESTCASE NUMBER: 3 -package libPackage -import testPackCase3.Case -import testPackCase3.Case.Inv -import testPackCase3.Case.E - -operator fun Case.E.plusAssign(value: Int) {} -operator fun Case.Inv.invoke(i: Int) {} - - -// FILE: TestCase3.kt -// TESTCASE NUMBER: 1 -package testPackCase3 -import libPackage.* - -class Case() { - class E(val plusAssign: Inv? = null) { - /*operator*/ fun plusAssign(value: Int) {} - } - - class Inv() { - /*operator*/ fun invoke(value: Int) {} - } - - fun foo(e: E) { - /*operator*/ fun E.plusAssign(value: Int) {} - - run { - e += 1 - } - e += 1 - } -} diff --git a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.kt b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.kt index bdec8c27a03..ae33b110163 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.5.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +NewInference // !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION -EXTENSION_SHADOWED_BY_MEMBER // SKIP_TXT diff --git a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.fir.kt deleted file mode 100644 index f34c9934d08..00000000000 --- a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.fir.kt +++ /dev/null @@ -1,34 +0,0 @@ -// !LANGUAGE: +NewInference -// !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION -// SKIP_TXT - -/* - * KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE) - * - * SPEC VERSION: 0.1-268 - * MAIN LINK: overload-resolution, building-the-overload-candidate-set-ocs, operator-call -> paragraph 2 -> sentence 3 - * PRIMARY LINKS: overload-resolution, building-the-overload-candidate-set-ocs, call-with-an-explicit-receiver -> paragraph 6 -> sentence 5 - * overload-resolution, building-the-overload-candidate-set-ocs, operator-call -> paragraph 4 -> sentence 1 - * NUMBER: 6 - * DESCRIPTION: Star-imported extension callables - */ - - -// FILE: LibCase1.kt -// TESTCASE NUMBER: 1 -package libPackage - -/*public*/ private inline operator fun CharSequence.contains(regex: Regex): Boolean = regex.containsMatchIn(this) - - -// FILE: TestCase1.kt -// TESTCASE NUMBER: 1 -package testPackCase1 -import libPackage.* - -class Case() { - - fun foo() { - "".contains(Regex("")) - } -} diff --git a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.kt b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.kt index 040546eafb2..c4c2fea1baa 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/overload-resolution/building-the-overload-candidate-set-ocs/operator-call/p-2/pos/3.6.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +NewInference // !DIAGNOSTICS: -UNUSED_VARIABLE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -UNUSED_PARAMETER -UNUSED_EXPRESSION // SKIP_TXT 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 71bf7474199..4dcddf709e3 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 @@ -3099,6 +3099,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.NOTHING_TO_INLINE) { firDiagnostic -> + NothingToInlineImpl( + 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 12ee8cb6954..b49cca11abd 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 @@ -2160,6 +2160,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val message: String } + abstract class NothingToInline : KtFirDiagnostic() { + override val diagnosticClass get() = NothingToInline::class + } + 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 3b07f514477..20a0a3a7ed2 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 @@ -3490,6 +3490,13 @@ internal class NotYetSupportedInInlineImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class NothingToInlineImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.NothingToInline(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class RecursionInInlineImpl( override val symbol: KtSymbol, firDiagnostic: FirPsiDiagnostic,