diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 9c7852f603e..3fa64263b9b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -140,6 +140,7 @@ public interface Errors { DiagnosticFactory3 EXPOSED_SUPER_CLASS = DiagnosticFactory3.create(ERROR); DiagnosticFactory3 EXPOSED_SUPER_INTERFACE = DiagnosticFactory3.create(ERROR); DiagnosticFactory3 EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory3.create(ERROR); + DiagnosticFactory2 EXPOSED_FROM_PRIVATE_IN_FILE = DiagnosticFactory2.create(WARNING); DiagnosticFactory2> INACCESSIBLE_TYPE = DiagnosticFactory2.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 16400125bba..228e1629b59 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -81,6 +81,7 @@ public class DefaultErrorMessages { MAP.put(EXPOSED_SUPER_CLASS, "''{0}'' subclass exposes its ''{2}'' supertype{1}", TO_STRING, TO_STRING, TO_STRING); 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(EXPOSED_FROM_PRIVATE_IN_FILE, "Deprecation: private-in-file class should not expose ''{1}'' type{0}", TO_STRING, TO_STRING); MAP.put(EXTENSION_SHADOWED_BY_MEMBER, "Extension is shadowed by a member: {0}", COMPACT_WITH_MODIFIERS); MAP.put(EXTENSION_FUNCTION_SHADOWED_BY_INNER_CLASS_CONSTRUCTOR, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ExposedVisibilityChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ExposedVisibilityChecker.kt index efd92ebe785..1aaee1c70a0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ExposedVisibilityChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ExposedVisibilityChecker.kt @@ -35,7 +35,14 @@ class ExposedVisibilityChecker(private val trace: BindingTrace? = null) { elementVisibility: EffectiveVisibility, restrictingDescriptor: DescriptorWithRelation ) { - trace?.report(diagnostic.on(element, elementVisibility, restrictingDescriptor, restrictingDescriptor.effectiveVisibility())) + val trace = trace ?: return + val restrictingVisibility = restrictingDescriptor.effectiveVisibility() + if (elementVisibility == EffectiveVisibility.PrivateInFile) { + // Deprecation: condition ^ should be changed to false after 1.6 + trace.report(EXPOSED_FROM_PRIVATE_IN_FILE.on(element, restrictingDescriptor, restrictingVisibility)) + } else { + trace.report(diagnostic.on(element, elementVisibility, restrictingDescriptor, restrictingVisibility)) + } } // NB: does not check any members diff --git a/compiler/testData/diagnostics/tests/exposed/privateInFile.kt b/compiler/testData/diagnostics/tests/exposed/privateInFile.kt index fcd5a4ba323..9adec6bf6b7 100644 --- a/compiler/testData/diagnostics/tests/exposed/privateInFile.kt +++ b/compiler/testData/diagnostics/tests/exposed/privateInFile.kt @@ -11,17 +11,17 @@ class Public { private class PrivateInFileClass { private open class NestedPrivate - fun test1() = NestedPrivate() - fun test2(p: NestedPrivate) {} - fun NestedPrivate.test3() {} - val test4 = NestedPrivate() - class Test5 : NestedPrivate() + fun test1() = NestedPrivate() + fun test2(p: NestedPrivate) {} + fun NestedPrivate.test3() {} + val test4 = NestedPrivate() + class Test5 : NestedPrivate() } private interface PrivateInFile { private class Private - fun expose() = Private() + fun expose() = Private() } // Exposes 'PrivateInFile$Private' via 'expose' diff --git a/compiler/testData/diagnostics/tests/imports/PrivateClassReferencedError.kt b/compiler/testData/diagnostics/tests/imports/PrivateClassReferencedError.kt index 64877e3ae21..3f1ff7262bc 100644 --- a/compiler/testData/diagnostics/tests/imports/PrivateClassReferencedError.kt +++ b/compiler/testData/diagnostics/tests/imports/PrivateClassReferencedError.kt @@ -11,4 +11,4 @@ package a import pack1.SomeClass.* -private class X : N() +private class X : N() diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index a08a01df905..37f2c35c0bb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -199,7 +199,7 @@ class QuickFixRegistrar : QuickFixContributor { for (exposed in listOf( EXPOSED_FUNCTION_RETURN_TYPE, EXPOSED_PARAMETER_TYPE, EXPOSED_PROPERTY_TYPE, EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR, - EXPOSED_RECEIVER_TYPE, EXPOSED_SUPER_CLASS, EXPOSED_SUPER_INTERFACE, EXPOSED_TYPE_PARAMETER_BOUND + EXPOSED_RECEIVER_TYPE, EXPOSED_SUPER_CLASS, EXPOSED_SUPER_INTERFACE, EXPOSED_TYPE_PARAMETER_BOUND, EXPOSED_FROM_PRIVATE_IN_FILE )) { exposed.registerFactory(ChangeVisibilityOnExposureFactory) }