diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java index 13ad53d7747..401b5587d55 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java @@ -17,9 +17,7 @@ package org.jetbrains.jet.lang.resolve.extension; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingTrace; @@ -43,6 +41,7 @@ public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.Analyz "This method should be invoced on inline function: " + descriptor; checkDefaults(descriptor, function, trace); + checkModality(descriptor, function, trace); JetVisitorVoid visitor = new JetVisitorVoid() { @@ -86,4 +85,21 @@ public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.Analyz index++; } } + + private static void checkModality( + @NotNull FunctionDescriptor functionDescriptor, + @NotNull JetFunction function, + @NotNull BindingTrace trace + ) { + if (functionDescriptor.getVisibility() == Visibilities.PRIVATE || functionDescriptor.getModality() == Modality.FINAL) { + return; + } + + DeclarationDescriptor declaration = functionDescriptor.getContainingDeclaration(); + if (declaration instanceof NamespaceDescriptor) { + return; + } + + trace.report(Errors.DECLARATION_CANT_BE_INLINED.on(function)); + } } diff --git a/compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.kt b/compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.kt new file mode 100644 index 00000000000..b18966960f5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.kt @@ -0,0 +1,48 @@ +inline private fun a() {} + +inline fun b() {} + +inline public fun c() {} + +abstract class A { + inline private fun good1() {} + inline public final fun good2() {} + inline protected final fun good3() {} + inline final fun good4() {} + + + inline open protected fun wrong1() {} + + inline open public fun wrong2() {} + + inline open fun wrong3() {} + + inline abstract protected fun wrong4() + + inline abstract public fun wrong5() + + inline abstract fun wrong6() +} + + +trait B { + + inline private fun good1() {} + inline public final fun good2() {} + inline protected final fun good3() {} + inline final fun good4() {} + + inline fun wrong1() {} + + inline open protected fun wrong2() {} + + inline open public fun wrong3() {} + + inline open fun wrong4() {} + + inline protected fun wrong5() + + inline public fun wrong6() + + inline fun wrong7() +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index c13c400eb2c..959fa1dd328 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3782,6 +3782,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/inline/invoke.kt"); } + @TestMetadata("nonVirtualMembersWithInline.kt") + public void testNonVirtualMembersWithInline() throws Exception { + doTest("compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.kt"); + } + @TestMetadata("propagation.kt") public void testPropagation() throws Exception { doTest("compiler/testData/diagnostics/tests/inline/propagation.kt");