From 35e732a97f62f2b80ebd251d06d47c7b626d2146 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 19 Dec 2016 20:16:56 +0300 Subject: [PATCH] Place inference from getters under the language feature --- .../kotlin/resolve/DeclarationsChecker.kt | 6 +- .../unsupportedInferenceFromGetters.kt | 69 +++++++++++++++++++ .../unsupportedInferenceFromGetters.txt | 38 ++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++ .../kotlin/config/LanguageVersionSettings.kt | 1 + 5 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.kt create mode 100644 compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index e1e135b0d45..bd08905fc5b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve import com.google.common.collect.ImmutableSet import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor @@ -737,6 +738,9 @@ class DeclarationsChecker( trace.report(MUST_BE_INITIALIZED_OR_BE_ABSTRACT.on(property)) } } + else if (property.typeReference == null && !languageVersionSettings.supportsFeature(LanguageFeature.ShortSyntaxForPropertyGetters)) { + trace.report(Errors.UNSUPPORTED_FEATURE.on(property, LanguageFeature.ShortSyntaxForPropertyGetters)) + } else if (noExplicitTypeOrGetterType(property)) { trace.report(PROPERTY_WITH_NO_TYPE_NO_INITIALIZER.on(property)) } diff --git a/compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.kt b/compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.kt new file mode 100644 index 00000000000..9fb6776fbeb --- /dev/null +++ b/compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.kt @@ -0,0 +1,69 @@ +// !LANGUAGE: -ShortSyntaxForPropertyGetters + +// blockBodyGetter.kt +val x get() { + return 1 +} + +// cantBeInferred.kt +val x1 get() = foo() +val y1 get() = bar() + +fun foo(): E = null!! +fun bar(): List = null!! + +// explicitGetterType.kt +val x2 get(): String = foo() +val y2 get(): List = bar() +val z2 get(): List { + return bar() +} + +val u get(): String = field + +// members.kt +class A { + val x get() = 1 + val y get() = id(1) + val y2 get() = id(id(2)) + val z get() = l("") + val z2 get() = l(id(l(""))) + + val T.u get() = id(this) +} +fun id(x: E) = x +fun l(x: E): List = null!! + +// vars +var x3 + get() = 1 + set(q) { + } + +// recursive +val x4 get() = x4 + +// null as nothing +val x5 get() = null +val y5 get() = null!! + +// objectExpression.kt +object Outer { + private var x + get() = object : CharSequence { + override val length: Int + get() = 0 + + override fun get(index: Int): Char { + return ' ' + } + + override fun subSequence(startIndex: Int, endIndex: Int) = "" + + fun bar() { + } + } + set(q) { + x = q + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.txt b/compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.txt new file mode 100644 index 00000000000..0be08fa00ce --- /dev/null +++ b/compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.txt @@ -0,0 +1,38 @@ +package + +public val u: kotlin.String +public val x: [ERROR : No type, no body] +public val x1: [ERROR : Error function type] +public val x2: kotlin.String +public var x3: kotlin.Int +public val x4: [ERROR : Error function type] +public val x5: kotlin.Nothing? +public val y1: [ERROR : Error function type] +public val y2: kotlin.collections.List +public val y5: kotlin.Nothing +public val z2: kotlin.collections.List +public fun bar(): kotlin.collections.List +public fun foo(): E +public fun id(/*0*/ x: E): E +public fun l(/*0*/ x: E): kotlin.collections.List + +public final class A { + public constructor A() + public final val x: kotlin.Int + public final val y: kotlin.Int + public final val y2: kotlin.Int + public final val z: kotlin.collections.List + public final val z2: kotlin.collections.List> + public final val T.u: T + 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public object Outer { + private constructor Outer() + private final var x: Outer.. + 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 39bb6106f83..d7ee44497c6 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -15453,6 +15453,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("unsupportedInferenceFromGetters.kt") + public void testUnsupportedInferenceFromGetters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/properties/inferenceFromGetters/unsupportedInferenceFromGetters.kt"); + doTest(fileName); + } + @TestMetadata("vars.kt") public void testVars() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/properties/inferenceFromGetters/vars.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 397141ec9c4..d5d4b21e3f0 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -37,6 +37,7 @@ enum class LanguageFeature(val sinceVersion: LanguageVersion?) { InlineConstVals(KOTLIN_1_1), OperatorRem(KOTLIN_1_1), OperatorProvideDelegate(KOTLIN_1_1), + ShortSyntaxForPropertyGetters(KOTLIN_1_1), // Experimental features MultiPlatformProjects(null),