diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 2805aa1e67c..d48511d667e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -927,7 +927,7 @@ public interface Errors { DiagnosticFactory0 NON_INTERNAL_PUBLISHED_API = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 PROTECTED_CALL_FROM_PUBLIC_INLINE = DiagnosticFactory1.create(WARNING); DiagnosticFactory2 INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE = DiagnosticFactory2.create(ERROR); - DiagnosticFactory2 NOT_SUPPORTED_USAGE_OF_INLINE_PARAMETER_IN_DEFAULT_INLINE_ONE = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE = DiagnosticFactory2.create(ERROR); DiagnosticFactory0 NON_LOCAL_SUSPENSION_POINT = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 ILLEGAL_SUSPEND_FUNCTION_CALL = DiagnosticFactory1.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 440fc9d83e0..4e948d6365c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -837,7 +837,7 @@ public class DefaultErrorMessages { MAP.put(NON_INTERNAL_PUBLISHED_API, "@PublishedApi annotation is only applicable for internal declaration"); MAP.put(PROTECTED_CALL_FROM_PUBLIC_INLINE, "Protected function call from public-API inline function is deprecated", NAME); MAP.put(INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE, "Invalid default value for inline parameter: ''{0}''. Only lambdas, anonymous functions, and callable references are supported", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); - MAP.put(NOT_SUPPORTED_USAGE_OF_INLINE_PARAMETER_IN_DEFAULT_INLINE_ONE, "Usage of inline parameter ''{0}'' in default value for another inline parameter is not supported", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); + MAP.put(NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE, "Usage of inline parameter ''{0}'' in default value for another inline parameter is not supported", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); //Inline non locals MAP.put(NON_LOCAL_RETURN_NOT_ALLOWED, "Can''t inline ''{0}'' here: it may contain non-local returns. Add ''crossinline'' modifier to parameter declaration ''{0}''", ELEMENT_TEXT); MAP.put(INLINE_CALL_CYCLE, "The ''{0}'' invocation is a part of inline cycle", NAME); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt index 2031ee923bc..81dc60598f0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt @@ -89,7 +89,7 @@ internal class InlineChecker(private val descriptor: FunctionDescriptor) : CallC !supportDefaultValueInline || expression.getParentOfType(true)?.let { val allow = it !in inlinableKtParameters if (!allow) { - context.trace.report(NOT_SUPPORTED_USAGE_OF_INLINE_PARAMETER_IN_DEFAULT_INLINE_ONE.on(expression, expression, descriptor)) + context.trace.report(NOT_SUPPORTED_INLINE_PARAMETER_IN_INLINE_PARAMETER_DEFAULT_VALUE.on(expression, expression, descriptor)) } allow } ?: true diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/innerClassConstuctorReference.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/innerClassConstuctorReference.kt new file mode 100644 index 00000000000..3c1e468291e --- /dev/null +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/innerClassConstuctorReference.kt @@ -0,0 +1,23 @@ +// FILE: 1.kt +// LANGUAGE_VERSION: 1.2 +// SKIP_INLINE_CHECK_IN: inlineFun$default +package test + +class A(val value: String) { + + inner class Inner { + fun ok() = value + } +} + +inline fun inlineFun(a: A, lambda: () -> A.Inner = a::Inner): A.Inner { + return lambda() +} + +// FILE: 2.kt + +import test.* + +fun box(): String { + return inlineFun(A("OK")).ok() +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privateFunctionReference.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privateFunctionReference.kt new file mode 100644 index 00000000000..9daf1aa9f06 --- /dev/null +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privateFunctionReference.kt @@ -0,0 +1,18 @@ +// FILE: 1.kt +// LANGUAGE_VERSION: 1.2 +// SKIP_INLINE_CHECK_IN: inlineFun$default +package test + +private fun ok() = "OK" + +internal inline fun inlineFun(lambda: () -> String = ::ok): String { + return lambda() +} + +// FILE: 2.kt + +import test.* + +fun box(): String { + return inlineFun() +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privatePropertyReference.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privatePropertyReference.kt new file mode 100644 index 00000000000..4514cfd5a70 --- /dev/null +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privatePropertyReference.kt @@ -0,0 +1,18 @@ +// FILE: 1.kt +// LANGUAGE_VERSION: 1.2 +// SKIP_INLINE_CHECK_IN: inlineFun$default +package test + +private val ok = "OK" + +internal inline fun inlineFun(lambda: () -> String = ::ok): String { + return lambda() +} + +// FILE: 2.kt + +import test.* + +fun box(): String { + return inlineFun() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.kt b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.kt index f8e53c2ea26..840f800a426 100644 --- a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.kt +++ b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.kt @@ -3,24 +3,24 @@ inline fun inlineFun(lambda: () -> String) = lambda() -inline fun noInlineFun(lambda: () -> String) = lambda() +fun noInlineFun(lambda: () -> String) = lambda() -inline fun default0_1(lambda: () -> String, dlambda: () -> String = { lambda; "OK" }) { +inline fun default0_1(lambda: () -> String, dlambda: () -> String = { lambda; "OK" }) { lambda() + dlambda() } -inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { +inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { lambda() + dlambda() } -inline fun default0(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { +inline fun default0(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { lambda() + dlambda() } -inline fun default1_0(lambda: () -> String, dlambda: () -> String = { lambda() }) { +inline fun default1_0(lambda: () -> String, dlambda: () -> String = { lambda() }) { lambda() + dlambda() } diff --git a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.txt b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.txt index 1363590b8ca..258781c12e5 100644 --- a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.txt +++ b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameter.txt @@ -13,4 +13,4 @@ public inline fun default2_1crossinline(/*0*/ crossinline lambda: () -> kotlin.S public inline fun default2_2(/*0*/ noinline lambda: () -> kotlin.String, /*1*/ dlambda: () -> kotlin.String = ...): kotlin.Unit public inline fun default2_3(/*0*/ noinline lambda: () -> kotlin.String, /*1*/ noinline dlambda: () -> kotlin.String = ...): kotlin.Unit public inline fun inlineFun(/*0*/ lambda: () -> kotlin.String): kotlin.String -public inline fun noInlineFun(/*0*/ lambda: () -> kotlin.String): kotlin.String +public fun noInlineFun(/*0*/ lambda: () -> kotlin.String): kotlin.String diff --git a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.kt b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.kt index 32016f9118a..944a8f844c0 100644 --- a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.kt +++ b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.kt @@ -3,14 +3,14 @@ inline fun inlineFun(lambda: () -> String) = lambda() -inline fun noInlineFun(lambda: () -> String) = lambda() +fun noInlineFun(lambda: () -> String) = lambda() inline fun default0_1(lambda: () -> String, dlambda: () -> String = { lambda }) { lambda() + dlambda() } -inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { +inline fun default0_2(lambda: () -> String, dlambda: () -> String = { noInlineFun (lambda) }) { lambda() + dlambda() } diff --git a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.txt b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.txt index c3ac89f084e..1da78d9b9d6 100644 --- a/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.txt +++ b/compiler/testData/diagnostics/tests/inline/inlineLambdaInDefaultInlineParameterDisabled.txt @@ -13,4 +13,4 @@ public inline fun default2_1crossinline(/*0*/ crossinline lambda: () -> kotlin.S public inline fun default2_2(/*0*/ noinline lambda: () -> kotlin.String, /*1*/ dlambda: () -> kotlin.String = ...): kotlin.Unit public inline fun default2_3(/*0*/ noinline lambda: () -> kotlin.String, /*1*/ noinline dlambda: () -> kotlin.String = ...): kotlin.Unit public inline fun inlineFun(/*0*/ lambda: () -> kotlin.String): kotlin.String -public inline fun noInlineFun(/*0*/ lambda: () -> kotlin.String): kotlin.String +public fun noInlineFun(/*0*/ lambda: () -> kotlin.String): kotlin.String diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java index b8b0bf391d6..b347a002b34 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java @@ -1009,6 +1009,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo doTest(fileName); } + @TestMetadata("innerClassConstuctorReference.kt") + public void testInnerClassConstuctorReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/innerClassConstuctorReference.kt"); + doTest(fileName); + } + @TestMetadata("instanceCapuredInClass.kt") public void testInstanceCapuredInClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/instanceCapuredInClass.kt"); @@ -1039,6 +1045,18 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo doTest(fileName); } + @TestMetadata("privateFunctionReference.kt") + public void testPrivateFunctionReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privateFunctionReference.kt"); + doTest(fileName); + } + + @TestMetadata("privatePropertyReference.kt") + public void testPrivatePropertyReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privatePropertyReference.kt"); + doTest(fileName); + } + @TestMetadata("propertyImportedFromObject.kt") public void testPropertyImportedFromObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/propertyImportedFromObject.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java index 9f15be9028f..6fb8e0b239c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -1009,6 +1009,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi doTest(fileName); } + @TestMetadata("innerClassConstuctorReference.kt") + public void testInnerClassConstuctorReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/innerClassConstuctorReference.kt"); + doTest(fileName); + } + @TestMetadata("instanceCapuredInClass.kt") public void testInstanceCapuredInClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/instanceCapuredInClass.kt"); @@ -1039,6 +1045,18 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi doTest(fileName); } + @TestMetadata("privateFunctionReference.kt") + public void testPrivateFunctionReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privateFunctionReference.kt"); + doTest(fileName); + } + + @TestMetadata("privatePropertyReference.kt") + public void testPrivatePropertyReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/privatePropertyReference.kt"); + doTest(fileName); + } + @TestMetadata("propertyImportedFromObject.kt") public void testPropertyImportedFromObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/propertyImportedFromObject.kt");