Add compiler X-flag to enable self upper bound type inference
^KT-48026 Fixed
This commit is contained in:
committed by
teamcityserver
parent
7567597be6
commit
dc8dbad0bc
+10
@@ -381,6 +381,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
|
|||||||
)
|
)
|
||||||
var unrestrictedBuilderInference: Boolean by FreezableVar(false)
|
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<AnalysisFlag<*>, Any> {
|
open fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap<AnalysisFlag<*>, Any> {
|
||||||
return HashMap<AnalysisFlag<*>, Any>().apply {
|
return HashMap<AnalysisFlag<*>, Any>().apply {
|
||||||
put(AnalysisFlags.skipMetadataVersionCheck, skipMetadataVersionCheck)
|
put(AnalysisFlags.skipMetadataVersionCheck, skipMetadataVersionCheck)
|
||||||
@@ -423,6 +429,10 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
|
|||||||
put(LanguageFeature.UnrestrictedBuilderInference, LanguageFeature.State.ENABLED)
|
put(LanguageFeature.UnrestrictedBuilderInference, LanguageFeature.State.ENABLED)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (selfUpperBoundInference) {
|
||||||
|
put(LanguageFeature.TypeInferenceOnCallsWithSelfTypes, LanguageFeature.State.ENABLED)
|
||||||
|
}
|
||||||
|
|
||||||
if (newInference) {
|
if (newInference) {
|
||||||
put(LanguageFeature.NewInference, LanguageFeature.State.ENABLED)
|
put(LanguageFeature.NewInference, LanguageFeature.State.ENABLED)
|
||||||
put(LanguageFeature.SamConversionPerArgument, LanguageFeature.State.ENABLED)
|
put(LanguageFeature.SamConversionPerArgument, LanguageFeature.State.ENABLED)
|
||||||
|
|||||||
+1
@@ -81,6 +81,7 @@ where advanced options include:
|
|||||||
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
||||||
-Xreport-output-files Report source to output files mapping
|
-Xreport-output-files Report source to output files mapping
|
||||||
-Xreport-perf Report detailed performance statistics
|
-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-metadata-version-check Allow to load classes with bad metadata version and pre-release classes
|
||||||
-Xskip-prerelease-check Allow to load 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
|
-Xsuppress-version-warnings Suppress warnings about outdated, inconsistent or experimental language or API versions
|
||||||
|
|||||||
+1
@@ -195,6 +195,7 @@ where advanced options include:
|
|||||||
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
-Xread-deserialized-contracts Enable reading of contracts from metadata
|
||||||
-Xreport-output-files Report source to output files mapping
|
-Xreport-output-files Report source to output files mapping
|
||||||
-Xreport-perf Report detailed performance statistics
|
-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-metadata-version-check Allow to load classes with bad metadata version and pre-release classes
|
||||||
-Xskip-prerelease-check Allow to load 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
|
-Xsuppress-version-warnings Suppress warnings about outdated, inconsistent or experimental language or API versions
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
$TESTDATA_DIR$/selfUpperBoundInference.kt
|
||||||
|
-d
|
||||||
|
$TEMP_DIR$
|
||||||
|
-Xself-upper-bound-inference
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
class Builder<B : Builder<B>> {
|
||||||
|
fun <T : B> test(): T = TODO()
|
||||||
|
|
||||||
|
fun foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testStar(builder: Builder<*>) {
|
||||||
|
builder.test()
|
||||||
|
|
||||||
|
builder
|
||||||
|
.test()
|
||||||
|
.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <K : Builder<K>> testTypeParam(builder: Builder<K>) {
|
||||||
|
builder.test()
|
||||||
|
|
||||||
|
builder
|
||||||
|
.test()
|
||||||
|
.foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BodySpec<B, S : BodySpec<B, S>> {
|
||||||
|
fun <T : S> isEqualTo(expected: B): T
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test(b: BodySpec<String, *>) {
|
||||||
|
b.isEqualTo("")
|
||||||
|
|
||||||
|
WriterAppender.newBuilder()
|
||||||
|
WriterAppender.Builder1()
|
||||||
|
WriterAppender.intersectTwoSelfTypes()
|
||||||
|
}
|
||||||
|
|
||||||
|
object WriterAppender {
|
||||||
|
interface Builder2<K : Builder2<K>>
|
||||||
|
|
||||||
|
class Builder1<B : Builder1<B>> {
|
||||||
|
fun asBuilder(): B {
|
||||||
|
return this as B
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <B : Builder1<B>> newBuilder(): B {
|
||||||
|
return Builder1<B>().asBuilder()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <B> intersectTwoSelfTypes(): B where B : Builder1<B>, B: Builder2<B> {
|
||||||
|
return Builder1<B>().asBuilder()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
compiler/testData/cli/jvm/selfUpperBoundInference.kt:40:25: warning: unchecked cast: WriterAppender.Builder1<B> to B
|
||||||
|
return this as B
|
||||||
|
^
|
||||||
|
OK
|
||||||
@@ -756,6 +756,11 @@ public class CliTestGenerated extends AbstractCliTest {
|
|||||||
runTest("compiler/testData/cli/jvm/sanitized-name.clash.args");
|
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")
|
@TestMetadata("signatureClash.args")
|
||||||
public void testSignatureClash() throws Exception {
|
public void testSignatureClash() throws Exception {
|
||||||
runTest("compiler/testData/cli/jvm/signatureClash.args");
|
runTest("compiler/testData/cli/jvm/signatureClash.args");
|
||||||
|
|||||||
Reference in New Issue
Block a user