From dc8dbad0bcda44bec5f0bb7b094a2241ae029573 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Mon, 2 Aug 2021 13:57:50 +0300 Subject: [PATCH] Add compiler X-flag to enable self upper bound type inference ^KT-48026 Fixed --- .../arguments/CommonCompilerArguments.kt | 10 ++++ compiler/testData/cli/js/jsExtraHelp.out | 1 + compiler/testData/cli/jvm/extraHelp.out | 1 + .../cli/jvm/selfUpperBoundInference.args | 4 ++ .../cli/jvm/selfUpperBoundInference.kt | 51 +++++++++++++++++++ .../cli/jvm/selfUpperBoundInference.out | 4 ++ .../kotlin/cli/CliTestGenerated.java | 5 ++ 7 files changed, 76 insertions(+) create mode 100644 compiler/testData/cli/jvm/selfUpperBoundInference.args create mode 100644 compiler/testData/cli/jvm/selfUpperBoundInference.kt create mode 100644 compiler/testData/cli/jvm/selfUpperBoundInference.out 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 7a58df77bcc..e5a95b1408a 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 @@ -381,6 +381,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() { ) var unrestrictedBuilderInference: Boolean by FreezableVar(false) + @Argument( + value = "-Xself-upper-bound-inference", + description = "Support inferring type arguments based on only self upper bounds of the corresponding type parameters" + ) + var selfUpperBoundInference: Boolean by FreezableVar(false) + open fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap, Any> { return HashMap, Any>().apply { put(AnalysisFlags.skipMetadataVersionCheck, skipMetadataVersionCheck) @@ -423,6 +429,10 @@ abstract class CommonCompilerArguments : CommonToolArguments() { put(LanguageFeature.UnrestrictedBuilderInference, LanguageFeature.State.ENABLED) } + if (selfUpperBoundInference) { + put(LanguageFeature.TypeInferenceOnCallsWithSelfTypes, LanguageFeature.State.ENABLED) + } + if (newInference) { put(LanguageFeature.NewInference, LanguageFeature.State.ENABLED) put(LanguageFeature.SamConversionPerArgument, LanguageFeature.State.ENABLED) diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index 1735f976a99..eb9e0bf1804 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -81,6 +81,7 @@ where advanced options include: -Xread-deserialized-contracts Enable reading of contracts from metadata -Xreport-output-files Report source to output files mapping -Xreport-perf Report detailed performance statistics + -Xself-upper-bound-inference Support inferring type arguments based on only self upper bounds of the corresponding type parameters -Xskip-metadata-version-check Allow to load classes with bad metadata version and pre-release classes -Xskip-prerelease-check Allow to load pre-release classes -Xsuppress-version-warnings Suppress warnings about outdated, inconsistent or experimental language or API versions diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 6a2d85845be..be7c4d82522 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -195,6 +195,7 @@ where advanced options include: -Xread-deserialized-contracts Enable reading of contracts from metadata -Xreport-output-files Report source to output files mapping -Xreport-perf Report detailed performance statistics + -Xself-upper-bound-inference Support inferring type arguments based on only self upper bounds of the corresponding type parameters -Xskip-metadata-version-check Allow to load classes with bad metadata version and pre-release classes -Xskip-prerelease-check Allow to load pre-release classes -Xsuppress-version-warnings Suppress warnings about outdated, inconsistent or experimental language or API versions diff --git a/compiler/testData/cli/jvm/selfUpperBoundInference.args b/compiler/testData/cli/jvm/selfUpperBoundInference.args new file mode 100644 index 00000000000..98b8d8af4e1 --- /dev/null +++ b/compiler/testData/cli/jvm/selfUpperBoundInference.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/selfUpperBoundInference.kt +-d +$TEMP_DIR$ +-Xself-upper-bound-inference diff --git a/compiler/testData/cli/jvm/selfUpperBoundInference.kt b/compiler/testData/cli/jvm/selfUpperBoundInference.kt new file mode 100644 index 00000000000..88d55d4e14f --- /dev/null +++ b/compiler/testData/cli/jvm/selfUpperBoundInference.kt @@ -0,0 +1,51 @@ +class Builder> { + fun test(): T = TODO() + + fun foo() {} +} + +fun testStar(builder: Builder<*>) { + builder.test() + + builder + .test() + .foo() +} + +fun > testTypeParam(builder: Builder) { + builder.test() + + builder + .test() + .foo() +} + +interface BodySpec> { + fun isEqualTo(expected: B): T +} + +fun test(b: BodySpec) { + b.isEqualTo("") + + WriterAppender.newBuilder() + WriterAppender.Builder1() + WriterAppender.intersectTwoSelfTypes() +} + +object WriterAppender { + interface Builder2> + + class Builder1> { + fun asBuilder(): B { + return this as B + } + } + + fun > newBuilder(): B { + return Builder1().asBuilder() + } + + fun intersectTwoSelfTypes(): B where B : Builder1, B: Builder2 { + return Builder1().asBuilder() + } +} diff --git a/compiler/testData/cli/jvm/selfUpperBoundInference.out b/compiler/testData/cli/jvm/selfUpperBoundInference.out new file mode 100644 index 00000000000..307db53fa5a --- /dev/null +++ b/compiler/testData/cli/jvm/selfUpperBoundInference.out @@ -0,0 +1,4 @@ +compiler/testData/cli/jvm/selfUpperBoundInference.kt:40:25: warning: unchecked cast: WriterAppender.Builder1 to B + return this as B + ^ +OK diff --git a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java index a8a73446b35..b7a5e1cdcd8 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -756,6 +756,11 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/sanitized-name.clash.args"); } + @TestMetadata("selfUpperBoundInference.args") + public void testSelfUpperBoundInference() throws Exception { + runTest("compiler/testData/cli/jvm/selfUpperBoundInference.args"); + } + @TestMetadata("signatureClash.args") public void testSignatureClash() throws Exception { runTest("compiler/testData/cli/jvm/signatureClash.args");