From 8d2ffb2dab7710422cd92bbdec1e715cd03cbb7e Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 7 Sep 2016 15:47:21 +0300 Subject: [PATCH] Fix wrong "InlineProperties are unsupported at this language level" error on inline functions when inline properties are disabled --- .../jetbrains/kotlin/resolve/ModifiersChecker.kt | 7 ++++++- .../sourceCompatibility/inlineFunctionAlways.kt | 16 ++++++++++++++++ .../sourceCompatibility/inlineFunctionAlways.txt | 13 +++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.kt create mode 100644 compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt index a586cdaa2ae..a7ab3be4c16 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.kt @@ -98,6 +98,10 @@ object ModifierCheckerCore { INLINE_KEYWORD to LanguageFeature.InlineProperties ) + val featureDependenciesTargets = mapOf( + LanguageFeature.InlineProperties to setOf(PROPERTY, PROPERTY_GETTER, PROPERTY_SETTER) + ) + // NOTE: deprecated targets must be possible! private val deprecatedTargetMap = mapOf>() @@ -261,7 +265,8 @@ object ModifierCheckerCore { val dependency = featureDependencies[modifier] ?: return true if (!languageFeatureSettings.supportsFeature(dependency)) { - if (dependency == LanguageFeature.InlineProperties && actualTargets.size == 1 && actualTargets.contains(FUNCTION)) { + val restrictedTargets = featureDependenciesTargets[dependency] + if (restrictedTargets != null && actualTargets.intersect(restrictedTargets).isEmpty()) { return true } trace.report(Errors.UNSUPPORTED_FEATURE.on(node.psi, dependency)) diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.kt new file mode 100644 index 00000000000..c6d1216532e --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.kt @@ -0,0 +1,16 @@ +// !DIAGNOSTICS: -NOTHING_TO_INLINE +// !LANGUAGE: -InlineProperties + +inline fun String.test() { +} + +inline fun test() { +} + +class A { + inline fun String.test() { + } + + inline fun test() { + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.txt b/compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.txt new file mode 100644 index 00000000000..ad6ac66084f --- /dev/null +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.txt @@ -0,0 +1,13 @@ +package + +public inline fun test(): kotlin.Unit +public inline fun kotlin.String.test(): kotlin.Unit + +public final class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final inline fun test(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public final inline fun kotlin.String.test(): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index d1a1e79a121..5375a7b1072 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -19077,6 +19077,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/sourceCompatibility"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("inlineFunctionAlways.kt") + public void testInlineFunctionAlways() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/inlineFunctionAlways.kt"); + doTest(fileName); + } + @TestMetadata("noDataClassInheritance.kt") public void testNoDataClassInheritance() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/noDataClassInheritance.kt");