diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt index 90c915098b4..95a81d8cee4 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt @@ -210,6 +210,7 @@ abstract class CommonCompilerArguments : CommonToolArguments() { if (newInference) { put(LanguageFeature.NewInference, LanguageFeature.State.ENABLED) + put(LanguageFeature.SamConversionForKotlinFunctions, LanguageFeature.State.ENABLED) } if (legacySmartCastAfterTry) { @@ -247,13 +248,22 @@ abstract class CommonCompilerArguments : CommonToolArguments() { private fun HashMap.configureLanguageFeaturesFromInternalArgs(collector: MessageCollector) { val featuresThatForcePreReleaseBinaries = mutableListOf() + var samConversionsExplicitlyPassed = false for ((feature, state) in internalArguments.filterIsInstance()) { + if (feature == LanguageFeature.SamConversionForKotlinFunctions) { + samConversionsExplicitlyPassed = true + } + put(feature, state) if (state == LanguageFeature.State.ENABLED && feature.forcesPreReleaseBinariesIfEnabled()) { featuresThatForcePreReleaseBinaries += feature } } + if (!samConversionsExplicitlyPassed && this[LanguageFeature.NewInference] == LanguageFeature.State.ENABLED) { + put(LanguageFeature.SamConversionForKotlinFunctions, LanguageFeature.State.ENABLED) + } + if (featuresThatForcePreReleaseBinaries.isNotEmpty()) { collector.report( CompilerMessageSeverity.STRONG_WARNING, diff --git a/compiler/testData/cli/jvm/explicitlyDisableSamConversionsWithOldFlag.args b/compiler/testData/cli/jvm/explicitlyDisableSamConversionsWithOldFlag.args new file mode 100644 index 00000000000..e6bebb65ac8 --- /dev/null +++ b/compiler/testData/cli/jvm/explicitlyDisableSamConversionsWithOldFlag.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/newInferenceImpliesSamConversions.kt +-d +$TEMP_DIR$ +-Xnew-inference +-XXLanguage\:-SamConversionForKotlinFunctions \ No newline at end of file diff --git a/compiler/testData/cli/jvm/explicitlyDisableSamConversionsWithOldFlag.out b/compiler/testData/cli/jvm/explicitlyDisableSamConversionsWithOldFlag.out new file mode 100644 index 00000000000..49e7526b6f2 --- /dev/null +++ b/compiler/testData/cli/jvm/explicitlyDisableSamConversionsWithOldFlag.out @@ -0,0 +1,13 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage:-SamConversionForKotlinFunctions + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +compiler/testData/cli/jvm/newInferenceImpliesSamConversions.kt:4:9: error: type mismatch: inferred type is () -> TypeVariable(_L) but Runnable was expected + foo { } + ^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/explicitlyDisabledSamConversions.args b/compiler/testData/cli/jvm/explicitlyDisabledSamConversions.args new file mode 100644 index 00000000000..247291cbc00 --- /dev/null +++ b/compiler/testData/cli/jvm/explicitlyDisabledSamConversions.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/newInferenceImpliesSamConversions.kt +-d +$TEMP_DIR$ +-XXLanguage\:+NewInference +-XXLanguage\:-SamConversionForKotlinFunctions \ No newline at end of file diff --git a/compiler/testData/cli/jvm/explicitlyDisabledSamConversions.out b/compiler/testData/cli/jvm/explicitlyDisabledSamConversions.out new file mode 100644 index 00000000000..16570a77068 --- /dev/null +++ b/compiler/testData/cli/jvm/explicitlyDisabledSamConversions.out @@ -0,0 +1,14 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage:+NewInference +-XXLanguage:-SamConversionForKotlinFunctions + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +compiler/testData/cli/jvm/newInferenceImpliesSamConversions.kt:4:9: error: type mismatch: inferred type is () -> TypeVariable(_L) but Runnable was expected + foo { } + ^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.args b/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.args new file mode 100644 index 00000000000..1bfbf9ba61f --- /dev/null +++ b/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/newInferenceImpliesSamConversions.kt +-d +$TEMP_DIR$ +-XXLanguage\:+NewInference \ No newline at end of file diff --git a/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.kt b/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.kt new file mode 100644 index 00000000000..d06a14e83ad --- /dev/null +++ b/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.kt @@ -0,0 +1,5 @@ +fun foo(r: Runnable) {} + +fun test() { + foo { } +} \ No newline at end of file diff --git a/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.out b/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.out new file mode 100644 index 00000000000..ab51f06e1c5 --- /dev/null +++ b/compiler/testData/cli/jvm/newInferenceImpliesSamConversions.out @@ -0,0 +1,13 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage:+NewInference + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +compiler/testData/cli/jvm/newInferenceImpliesSamConversions.kt:1:9: warning: parameter 'r' is never used +fun foo(r: Runnable) {} + ^ +OK diff --git a/compiler/testData/cli/jvm/newInferenceWithOldFlagImpliesSamConversions.args b/compiler/testData/cli/jvm/newInferenceWithOldFlagImpliesSamConversions.args new file mode 100644 index 00000000000..996624d1a53 --- /dev/null +++ b/compiler/testData/cli/jvm/newInferenceWithOldFlagImpliesSamConversions.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/newInferenceImpliesSamConversions.kt +-d +$TEMP_DIR$ +-Xnew-inference \ No newline at end of file diff --git a/compiler/testData/cli/jvm/newInferenceWithOldFlagImpliesSamConversions.out b/compiler/testData/cli/jvm/newInferenceWithOldFlagImpliesSamConversions.out new file mode 100644 index 00000000000..45e1b102f14 --- /dev/null +++ b/compiler/testData/cli/jvm/newInferenceWithOldFlagImpliesSamConversions.out @@ -0,0 +1,4 @@ +compiler/testData/cli/jvm/newInferenceImpliesSamConversions.kt:1:9: warning: parameter 'r' is never used +fun foo(r: Runnable) {} + ^ +OK diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index b042da313df..bc1e2cd9fc5 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -206,6 +206,16 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/experimentalUnresolved.args"); } + @TestMetadata("explicitlyDisableSamConversionsWithOldFlag.args") + public void testExplicitlyDisableSamConversionsWithOldFlag() throws Exception { + runTest("compiler/testData/cli/jvm/explicitlyDisableSamConversionsWithOldFlag.args"); + } + + @TestMetadata("explicitlyDisabledSamConversions.args") + public void testExplicitlyDisabledSamConversions() throws Exception { + runTest("compiler/testData/cli/jvm/explicitlyDisabledSamConversions.args"); + } + @TestMetadata("extraArgumentPassedInObsoleteForm.args") public void testExtraArgumentPassedInObsoleteForm() throws Exception { runTest("compiler/testData/cli/jvm/extraArgumentPassedInObsoleteForm.args"); @@ -416,6 +426,16 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.args"); } + @TestMetadata("newInferenceImpliesSamConversions.args") + public void testNewInferenceImpliesSamConversions() throws Exception { + runTest("compiler/testData/cli/jvm/newInferenceImpliesSamConversions.args"); + } + + @TestMetadata("newInferenceWithOldFlagImpliesSamConversions.args") + public void testNewInferenceWithOldFlagImpliesSamConversions() throws Exception { + runTest("compiler/testData/cli/jvm/newInferenceWithOldFlagImpliesSamConversions.args"); + } + @TestMetadata("noReflect.args") public void testNoReflect() throws Exception { runTest("compiler/testData/cli/jvm/noReflect.args");