KT-2752: fix name clash diagnostic for case of extension property. Add more tests for the diagnostic

This commit is contained in:
Alexey Andreev
2016-05-27 17:04:34 +03:00
parent 8f829557c8
commit 8738458c34
9 changed files with 91 additions and 9 deletions
@@ -61,7 +61,12 @@ class FQNGenerator {
}
val (localName, shared, parent) = getLocalName(descriptor)
return FQNPart(listOf(localName), shared, descriptor, parent)
return FQNPart(listOf(localName), shared, descriptor, fixParent(parent))
}
private fun fixParent(parent: DeclarationDescriptor) = when (parent) {
is PropertyDescriptor -> parent.containingDeclaration
else -> parent
}
private fun getLocalName(descriptor: DeclarationDescriptor): LocalName {
@@ -22,9 +22,11 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.js.naming.FQNGenerator
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DeclarationChecker
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.source.getPsi
@@ -39,7 +41,9 @@ class JsNameChecker : DeclarationChecker {
diagnosticHolder: DiagnosticSink,
bindingContext: BindingContext
) {
checkDescriptor(descriptor, declaration, diagnosticHolder)
if (declaration !is KtProperty || !descriptor.isExtension) {
checkDescriptor(descriptor, declaration, diagnosticHolder)
}
}
private fun checkDescriptor(descriptor: DeclarationDescriptor, declaration: KtDeclaration, diagnosticHolder: DiagnosticSink) {
@@ -87,6 +91,15 @@ class JsNameChecker : DeclarationChecker {
private fun collect(scope: MemberScope, target: MutableMap<String, DeclarationDescriptor>) {
for (descriptor in scope.getContributedDescriptors()) {
collect(descriptor, target)
}
}
private fun collect(descriptor: DeclarationDescriptor, target: MutableMap<String, DeclarationDescriptor>) {
if (descriptor is PropertyDescriptor && descriptor.isExtension) {
descriptor.accessors.forEach { collect(it, target) }
}
else {
val fqn = fqnGenerator.generate(descriptor)
if (fqn.shared && isOpaque(fqn.descriptor)) {
target[fqn.names.last()] = fqn.descriptor
@@ -94,13 +107,6 @@ class JsNameChecker : DeclarationChecker {
}
}
private fun collect(descriptor: DeclarationDescriptor, target: MutableMap<String, DeclarationDescriptor>) {
val fqn = fqnGenerator.generate(descriptor)
if (fqn.shared && isOpaque(fqn.descriptor)) {
target[fqn.names.last()] = fqn.descriptor
}
}
private fun isOpaque(descriptor: DeclarationDescriptor) =
!AnnotationsUtils.isNativeObject(descriptor) && !AnnotationsUtils.isLibraryObject(descriptor)
}