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 b5ed78db47b..13ad53d7747 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 @@ -18,11 +18,15 @@ 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.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.FunctionAnalyzerExtension; +import java.util.List; + public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.AnalyzerExtension { public static final InlineAnalyzerExtension INSTANCE = new InlineAnalyzerExtension(); @@ -35,6 +39,10 @@ public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.Analyz public void process( @NotNull final FunctionDescriptor descriptor, @NotNull JetNamedFunction function, @NotNull final BindingTrace trace ) { + assert descriptor instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) descriptor).isInline() : + "This method should be invoced on inline function: " + descriptor; + + checkDefaults(descriptor, function, trace); JetVisitorVoid visitor = new JetVisitorVoid() { @@ -62,4 +70,20 @@ public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.Analyz function.acceptChildren(visitor); } + + private static void checkDefaults( + @NotNull FunctionDescriptor functionDescriptor, + @NotNull JetFunction function, + @NotNull BindingTrace trace + ) { + int index = 0; + List jetParameters = function.getValueParameters(); + for (ValueParameterDescriptor parameter : functionDescriptor.getValueParameters()) { + if (parameter.hasDefaultValue()) { + JetParameter jetParameter = jetParameters.get(index); + trace.report(Errors.NOT_YET_SUPPORTED_IN_INLINE.on(jetParameter, jetParameter, functionDescriptor)); + } + index++; + } + } } diff --git a/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.kt b/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.kt index 37ba68a8a38..a886b09c8f3 100644 --- a/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.kt +++ b/compiler/testData/diagnostics/tests/inline/unsupportedConstruction.kt @@ -23,4 +23,18 @@ inline fun unsupported() { fun local() { fun localInner() {} } +} + +inline fun unsupportedDefault(s : Int = 10) { + +} + +open class Base { + open fun foo(a: Int = 1) {} +} + +class Derived: Base() { + inline final override fun foo(a: Int) { + + } } \ No newline at end of file