From d1156211a80dbb710dd96c62ca13d5cfd3f7ad83 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 14 Dec 2016 17:33:20 +0300 Subject: [PATCH] Make JS header/impl name clash checks independent of sources order If an impl source was placed before a header in a sources list, the JS_NAME_CLASH error would be reported. --- .../js/resolve/diagnostics/JsNameClashChecker.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt index fa643b502bd..7b541aba3ba 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameClashChecker.kt @@ -55,7 +55,11 @@ class JsNameClashChecker : SimpleDeclarationChecker { val scope = getScope(suggested.scope) val name = suggested.names.last() val existing = scope[name] - if (existing != null && existing != suggested.descriptor && !(existing is MemberDescriptor && existing.isHeader)) { + if (existing != null && + existing != descriptor && + existing.isImpl == descriptor.isImpl && + existing.isHeader == descriptor.isHeader + ) { diagnosticHolder.report(ErrorsJs.JS_NAME_CLASH.on(declaration, name, existing)) val existingDeclaration = existing.findPsi() if (clashedDescriptors.add(existing) && existingDeclaration is KtDeclaration && existingDeclaration != declaration) { @@ -89,9 +93,15 @@ class JsNameClashChecker : SimpleDeclarationChecker { } } + private val DeclarationDescriptor.isImpl: Boolean + get() = this is MemberDescriptor && this.isImpl + + private val DeclarationDescriptor.isHeader: Boolean + get() = this is MemberDescriptor && this.isHeader + private fun isFakeOverridingNative(descriptor: CallableMemberDescriptor): Boolean { return descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE && - descriptor.overriddenDescriptors.all { !presentsInGeneratedCode(it) } + descriptor.overriddenDescriptors.all { !presentsInGeneratedCode(it) } } private fun getScope(descriptor: DeclarationDescriptor) = scopes.getOrPut(descriptor) {