diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index a2c6930aae3..b64de99c748 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -421,8 +421,6 @@ public interface Errors { DiagnosticFactory1> AMBIGUOUS_ANONYMOUS_TYPE_INFERRED = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE); - DiagnosticFactory0 - KCLASS_WITH_NULLABLE_ARGUMENT_IN_SIGNATURE = DiagnosticFactory0.create(ERROR, PositioningStrategies.DECLARATION_NAME); DiagnosticFactory1 KCLASS_WITH_NULLABLE_TYPE_PARAMETER_IN_SIGNATURE = DiagnosticFactory1.create(ERROR, PositioningStrategies.DECLARATION_NAME); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index abbcdb9aa1a..0feb8f11de0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -865,9 +865,8 @@ public class DefaultErrorMessages { MAP.put(DATA_CLASS_NOT_PROPERTY_PARAMETER, "Data class primary constructor must have only property (val / var) parameters"); MAP.put(AMBIGUOUS_ANONYMOUS_TYPE_INFERRED, "Right-hand side has anonymous type. Please specify type explicitly", TO_STRING); - MAP.put(KCLASS_WITH_NULLABLE_ARGUMENT_IN_SIGNATURE, "Please specify type explicitly"); MAP.put(KCLASS_WITH_NULLABLE_TYPE_PARAMETER_IN_SIGNATURE, - "Please add upper bound Any for type parameter ''{0}'' or specify return type explicitly", NAME); + "Declaration has an inconsistent return type. Please add upper bound Any for type parameter ''{0}'' or specify return type explicitly", NAME); MAP.put(EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED, "''{0}'' is a member and an extension at the same time. References to such elements are not allowed", NAME); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/KClassWithIncorrectTypeArgumentChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/KClassWithIncorrectTypeArgumentChecker.kt index 02439d8dd62..331cd573503 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/KClassWithIncorrectTypeArgumentChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/KClassWithIncorrectTypeArgumentChecker.kt @@ -24,9 +24,9 @@ import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.UnwrappedType -import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.typeUtil.builtIns import org.jetbrains.kotlin.types.typeUtil.contains +import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf object KClassWithIncorrectTypeArgumentChecker : SimpleDeclarationChecker { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink, bindingContext: BindingContext) { @@ -40,31 +40,27 @@ object KClassWithIncorrectTypeArgumentChecker : SimpleDeclarationChecker { val returnType = descriptor.returnType ?: return var typeParameterWithoutNotNullableUpperBound: TypeParameterDescriptor? = null - val thereIsBadKClassType = returnType.contains { - val kClassWithBadArgument = it.isKClassWithBadArgument() + returnType.contains { type -> + val kClassWithBadArgument = type.isKClassWithBadArgument() if (kClassWithBadArgument) { - it.arguments.singleOrNull()?.type?.constructor?.declarationDescriptor?.let { + type.arguments.singleOrNull()?.type?.constructor?.declarationDescriptor?.let { if (it is TypeParameterDescriptor && it.containingDeclaration == descriptor) { typeParameterWithoutNotNullableUpperBound = it } } } - kClassWithBadArgument } if (typeParameterWithoutNotNullableUpperBound != null) { diagnosticHolder.report(Errors.KCLASS_WITH_NULLABLE_TYPE_PARAMETER_IN_SIGNATURE.on(declaration, typeParameterWithoutNotNullableUpperBound!!)) } - else if (thereIsBadKClassType) { - diagnosticHolder.report(Errors.KCLASS_WITH_NULLABLE_ARGUMENT_IN_SIGNATURE.on(declaration)) - } } private fun UnwrappedType.isKClassWithBadArgument(): Boolean { val argumentType = arguments.singleOrNull()?.let { if (it.isStarProjection) null else it.type.unwrap() } ?: return false - val klass = (constructor.declarationDescriptor as? ClassDescriptor) ?: return false + val klass = constructor.declarationDescriptor as? ClassDescriptor ?: return false - return KotlinBuiltIns.isKClass(klass) && !KotlinTypeChecker.DEFAULT.isSubtypeOf(argumentType, argumentType.builtIns.anyType) + return KotlinBuiltIns.isKClass(klass) && !argumentType.isSubtypeOf(argumentType.builtIns.anyType) } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/callableReference/bound/reservedExpressionSyntax.kt b/compiler/testData/diagnostics/tests/callableReference/bound/reservedExpressionSyntax.kt index 98cc6674839..b16c984c0f8 100644 --- a/compiler/testData/diagnostics/tests/callableReference/bound/reservedExpressionSyntax.kt +++ b/compiler/testData/diagnostics/tests/callableReference/bound/reservedExpressionSyntax.kt @@ -23,8 +23,8 @@ class Test { fun List.testCallable4(): () -> Unit = b?::foo fun List.testClassLiteral1() = a::class - fun List.testClassLiteral2() = b?::class - fun List.testClassLiteral3() = b::class + fun List.testClassLiteral2() = b?::class + fun List.testClassLiteral3() = b::class fun List.testUnresolved1() = unresolved::foo fun List.testUnresolved2() = a<unresolved>::foo diff --git a/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.kt b/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.kt index dcd8c279f63..50ed119efa9 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/nonClassesOnLHS.kt @@ -2,11 +2,11 @@ class A -val a1 = A?::class -val a2 = A??::class +val a1 = A?::class +val a2 = A??::class -val l1 = List?::class -val l2 = List?::class +val l1 = List?::class +val l2 = List?::class fun foo() { val t1 = T::class diff --git a/compiler/testData/diagnostics/tests/classLiteral/typealiases.kt b/compiler/testData/diagnostics/tests/classLiteral/typealiases.kt index 49690ecb927..68548f18d1a 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/typealiases.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/typealiases.kt @@ -2,7 +2,7 @@ typealias TString = String fun f1() = TString::class typealias TNullableString = String? -fun f2() = TNullableString::class +fun f2() = TNullableString::class typealias TNullableTString = TString? typealias TTNullableTString = TNullableTString diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.kt b/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.kt index 0abcf08f62c..d94409063a6 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/kClassInSignature.kt @@ -10,7 +10,7 @@ fun test5() = listOf( fun test6(): kotlin.reflect.KClass<T> = T::class fun test7(): kotlin.reflect.KClass<*> = T::class -fun test8() = String?::class +fun test8() = String?::class fun listOf(e: T): List = null!! diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/noBoundCallableReferences/boundClassLiteral.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/noBoundCallableReferences/boundClassLiteral.kt index 8ceca51749a..2981e23a27f 100644 --- a/compiler/testData/diagnostics/tests/sourceCompatibility/noBoundCallableReferences/boundClassLiteral.kt +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/noBoundCallableReferences/boundClassLiteral.kt @@ -9,6 +9,6 @@ val ok3 = O::class val fail1 = ""::class -val fail2 = String?::class +val fail2 = String?::class val fail3 = (C)::class val fail4 = (C.Companion)::class