diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java index 52c37b82200..55e64dfb689 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java @@ -50,12 +50,12 @@ import static org.jetbrains.kotlin.resolve.inline.InlineUtil.allowsNonLocalRetur import static org.jetbrains.kotlin.resolve.inline.InlineUtil.checkNonLocalReturnUsage; class InlineChecker implements SimpleCallChecker { - private final SimpleFunctionDescriptor descriptor; + private final FunctionDescriptor descriptor; private final Set inlinableParameters = new LinkedHashSet(); private final boolean isEffectivelyPublicApiFunction; private final boolean isEffectivelyPrivateApiFunction; - public InlineChecker(@NotNull SimpleFunctionDescriptor descriptor) { + public InlineChecker(@NotNull FunctionDescriptor descriptor) { assert InlineUtil.isInline(descriptor) : "This extension should be created only for inline functions: " + descriptor; this.descriptor = descriptor; this.isEffectivelyPublicApiFunction = DescriptorUtilsKt.isEffectivelyPublicApi(descriptor); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineCheckerWrapper.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineCheckerWrapper.kt index 957ac5c0f41..b6459fab3a6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineCheckerWrapper.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineCheckerWrapper.kt @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.checkers import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.inline.InlineUtil @@ -33,7 +33,7 @@ class InlineCheckerWrapper : SimpleCallChecker { while (parentDescriptor != null) { if (InlineUtil.isInline(parentDescriptor)) { - val checker = getChecker(parentDescriptor as SimpleFunctionDescriptor) + val checker = getChecker(parentDescriptor as FunctionDescriptor) checker.check(resolvedCall, context) } @@ -41,7 +41,7 @@ class InlineCheckerWrapper : SimpleCallChecker { } } - private fun getChecker(descriptor: SimpleFunctionDescriptor): SimpleCallChecker { + private fun getChecker(descriptor: FunctionDescriptor): SimpleCallChecker { val map = checkersCache?.get() ?: hashMapOf() checkersCache = checkersCache ?: WeakReference(map) return map.getOrPut(descriptor) { InlineChecker(descriptor) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java index 3b062077ec0..cf5dcd4f9bf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java @@ -40,7 +40,7 @@ public class InlineUtil { } public static boolean isInline(@Nullable DeclarationDescriptor descriptor) { - return descriptor instanceof SimpleFunctionDescriptor && getInlineStrategy(descriptor).isInline(); + return descriptor instanceof FunctionDescriptor && getInlineStrategy((FunctionDescriptor) descriptor).isInline(); } public static boolean isInlineOrContainingInline(@Nullable DeclarationDescriptor descriptor) { @@ -50,9 +50,8 @@ public class InlineUtil { } @NotNull - public static InlineStrategy getInlineStrategy(@NotNull DeclarationDescriptor descriptor) { - if (descriptor instanceof FunctionDescriptor && - ((FunctionDescriptor) descriptor).isInline()) { + private static InlineStrategy getInlineStrategy(@NotNull FunctionDescriptor descriptor) { + if (descriptor.isInline()) { return InlineStrategy.AS_FUNCTION; } diff --git a/compiler/testData/diagnostics/tests/inline/property/invoke.kt b/compiler/testData/diagnostics/tests/inline/property/invoke.kt new file mode 100644 index 00000000000..04f0d39730f --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/property/invoke.kt @@ -0,0 +1,20 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -INFIX_MODIFIER_REQUIRED + +inline var value: (p: Int) -> String + get() = {"123" } + set(s: (p: Int) -> String) { + s(11) + s.invoke(11) + s invoke 11 + + val z = s + } + +inline var value2: Int.(p: Int) -> String + get() = {"123" } + set(ext: Int.(p: Int) -> String) { + 11.ext(11) + 11.ext(11) + + val p = ext + } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/property/invoke.txt b/compiler/testData/diagnostics/tests/inline/property/invoke.txt new file mode 100644 index 00000000000..95b62a3bf0e --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/property/invoke.txt @@ -0,0 +1,4 @@ +package + +public var value: (kotlin.Int) -> kotlin.String +public var value2: kotlin.Int.(kotlin.Int) -> kotlin.String diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 831ad7be3bf..844a0b513bd 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -10146,6 +10146,21 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { } } + @TestMetadata("compiler/testData/diagnostics/tests/inline/property") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Property extends AbstractDiagnosticsTest { + public void testAllFilesPresentInProperty() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inline/property"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("invoke.kt") + public void testInvoke() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/property/invoke.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/diagnostics/tests/inline/regressions") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)