From 7a8ec86cb986df9e088075796dd775e07b161165 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 9 Jan 2017 17:17:44 +0300 Subject: [PATCH] KT-11398 - turn INACCESSIBLE_TYPE into a warning; - improve diagnostic message for INACCESSIBLE_TYPE. --- .../checkers/JavaTypeAccessibilityChecker.kt | 44 +++++++++---------- .../jetbrains/kotlin/diagnostics/Errors.java | 2 +- .../rendering/DefaultErrorMessages.java | 2 +- .../kotlin/diagnostics/rendering/Renderers.kt | 2 - 4 files changed, 23 insertions(+), 27 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaTypeAccessibilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaTypeAccessibilityChecker.kt index 215bf5292a9..396c1092ac3 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaTypeAccessibilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaTypeAccessibilityChecker.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.resolve.jvm.checkers -import com.intellij.util.SmartList import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.Visibilities @@ -42,45 +41,44 @@ class JavaTypeAccessibilityChecker : AdditionalTypeChecker { if (c.isDebuggerContext) return - val inaccessibleTypes = findInaccessibleJavaTypes(expressionType, c) - if (inaccessibleTypes.isNotEmpty()) { - c.trace.report(Errors.INACCESSIBLE_TYPE.on(expression, expressionType, inaccessibleTypes)) + val inaccessibleClasses = findInaccessibleJavaClasses(expressionType, c) + if (inaccessibleClasses.isNotEmpty()) { + c.trace.report(Errors.INACCESSIBLE_TYPE.on(expression, expressionType, inaccessibleClasses)) return } if (expressionTypeWithSmartCast != expressionType) { - val inaccessibleTypesWithSmartCast = findInaccessibleJavaTypes(expressionTypeWithSmartCast, c) - if (inaccessibleTypesWithSmartCast.isNotEmpty()) { - c.trace.report(Errors.INACCESSIBLE_TYPE.on(expression, expressionType, inaccessibleTypes)) + val inaccessibleClassesWithSmartCast = findInaccessibleJavaClasses(expressionTypeWithSmartCast, c) + if (inaccessibleClassesWithSmartCast.isNotEmpty()) { + c.trace.report(Errors.INACCESSIBLE_TYPE.on(expression, expressionType, inaccessibleClassesWithSmartCast)) } } } - private fun findInaccessibleJavaTypes(type: KotlinType, c: ResolutionContext<*>): List { + private fun findInaccessibleJavaClasses(type: KotlinType, c: ResolutionContext<*>): Collection { val scopeOwner = c.scope.ownerDescriptor - val inaccessibleTypes = SmartList() - findInaccessibleJavaTypesRec(type, scopeOwner, inaccessibleTypes, hashSetOf()) - return inaccessibleTypes + val inaccessibleJavaClasses = LinkedHashSet() + findInaccessibleJavaClassesRec(type, scopeOwner, inaccessibleJavaClasses) + return inaccessibleJavaClasses } - private fun findInaccessibleJavaTypesRec( + private fun findInaccessibleJavaClassesRec( type: KotlinType, scopeOwner: DeclarationDescriptor, - inaccessibleTypes: SmartList, - visitedTypeConstructors: MutableSet + inaccessibleClasses: MutableCollection ) { - val typeConstructor = type.constructor.declarationDescriptor - if (typeConstructor is ClassDescriptor) { - if (visitedTypeConstructors.contains(typeConstructor)) return - visitedTypeConstructors.add(typeConstructor) + val declarationDescriptor = type.constructor.declarationDescriptor - if (typeConstructor is JavaClassDescriptor && !Visibilities.isVisibleIgnoringReceiver(typeConstructor, scopeOwner)) { - inaccessibleTypes.add(type) - } - for (typeProjection in type.arguments) { - findInaccessibleJavaTypesRec(typeProjection.type, scopeOwner, inaccessibleTypes, visitedTypeConstructors) + if (declarationDescriptor is JavaClassDescriptor) { + if (!Visibilities.isVisibleIgnoringReceiver(declarationDescriptor, scopeOwner)) { + inaccessibleClasses.add(declarationDescriptor) } } + + for (typeProjection in type.arguments) { + if (typeProjection.isStarProjection) continue + findInaccessibleJavaClassesRec(typeProjection.type, scopeOwner, inaccessibleClasses) + } } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index e4b5135353a..56a92bfd71b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -112,7 +112,7 @@ public interface Errors { DiagnosticFactory3 EXPOSED_SUPER_INTERFACE = DiagnosticFactory3.create(ERROR); DiagnosticFactory3 EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory3.create(ERROR); - DiagnosticFactory2> INACCESSIBLE_TYPE = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2> INACCESSIBLE_TYPE = DiagnosticFactory2.create(WARNING); DiagnosticFactory1> PLATFORM_CLASS_MAPPED_TO_KOTLIN = DiagnosticFactory1.create(WARNING); 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 74a0ce2fa1f..dbdbce6cb0f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -114,7 +114,7 @@ public class DefaultErrorMessages { MAP.put(EXPOSED_SUPER_INTERFACE, "''{0}'' sub-interface exposes its ''{2}'' supertype{1}", TO_STRING, TO_STRING, TO_STRING); MAP.put(EXPOSED_TYPEALIAS_EXPANDED_TYPE, "''{0}'' typealias exposes ''{2}'' in expanded type{1}", TO_STRING, TO_STRING, TO_STRING); - MAP.put(INACCESSIBLE_TYPE, "Type {0} is inaccessible in this context due to: {1}", RENDER_TYPE, RENDER_COLLECTION_OF_TYPES); + MAP.put(INACCESSIBLE_TYPE, "Type {0} is inaccessible in this context due to: {1}", RENDER_TYPE, commaSeparated(FQ_NAMES_IN_TYPES)); MAP.put(REDECLARATION, "Conflicting declarations: {0}", commaSeparated(COMPACT_WITH_MODIFIERS)); MAP.put(PACKAGE_OR_CLASSIFIER_REDECLARATION, "Redeclaration: {0}", STRING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt index 3fe5fcca6a7..45b7ec10e3a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -39,9 +39,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.TypeBounds.Bound import org.jetbrains.kotlin.resolve.calls.inference.TypeBounds.BoundKind.LOWER_BOUND import org.jetbrains.kotlin.resolve.calls.inference.TypeBounds.BoundKind.UPPER_BOUND import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition -import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPositionKind.* -import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.derivedFrom import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.getValidityConstraintForConstituentType import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.types.*