JS: prohibit private inline members of external classes, since KT-14031 was postponed
This commit is contained in:
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.js.resolve.diagnostics
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.js.PredefinedAnnotation
|
||||
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
@@ -28,7 +27,10 @@ import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.checkers.SimpleDeclarationChecker
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.*
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
||||
|
||||
class JsExternalChecker : SimpleDeclarationChecker {
|
||||
@@ -51,7 +53,7 @@ class JsExternalChecker : SimpleDeclarationChecker {
|
||||
else if (descriptor is ClassDescriptor && descriptor.isInner) {
|
||||
diagnosticHolder.report(ErrorsJs.WRONG_EXTERNAL_DECLARATION.on(declaration, "inner class"))
|
||||
}
|
||||
else if (isPrivateNonInlineMemberOfExternalClass(descriptor)) {
|
||||
else if (isPrivateMemberOfExternalClass(descriptor)) {
|
||||
diagnosticHolder.report(ErrorsJs.WRONG_EXTERNAL_DECLARATION.on(declaration, "private member of class"))
|
||||
}
|
||||
|
||||
@@ -82,11 +84,9 @@ class JsExternalChecker : SimpleDeclarationChecker {
|
||||
AnnotationsUtils.hasAnnotation(descriptor, PredefinedAnnotation.NATIVE)
|
||||
}
|
||||
|
||||
private fun isPrivateNonInlineMemberOfExternalClass(descriptor: DeclarationDescriptor): Boolean {
|
||||
private fun isPrivateMemberOfExternalClass(descriptor: DeclarationDescriptor): Boolean {
|
||||
if (descriptor is PropertyAccessorDescriptor && descriptor.visibility == descriptor.correspondingProperty.visibility) return false
|
||||
if (descriptor !is MemberDescriptor || descriptor.visibility != Visibilities.PRIVATE) return false
|
||||
if (descriptor is FunctionDescriptor && descriptor.isInline) return false
|
||||
if (descriptor is PropertyDescriptor && descriptor.accessors.all { it.isInline }) return false
|
||||
|
||||
val containingDeclaration = descriptor.containingDeclaration as? ClassDescriptor ?: return false
|
||||
return AnnotationsUtils.isNativeObject(containingDeclaration)
|
||||
|
||||
Reference in New Issue
Block a user