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.
This commit is contained in:
+12
-2
@@ -55,7 +55,11 @@ class JsNameClashChecker : SimpleDeclarationChecker {
|
|||||||
val scope = getScope(suggested.scope)
|
val scope = getScope(suggested.scope)
|
||||||
val name = suggested.names.last()
|
val name = suggested.names.last()
|
||||||
val existing = scope[name]
|
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))
|
diagnosticHolder.report(ErrorsJs.JS_NAME_CLASH.on(declaration, name, existing))
|
||||||
val existingDeclaration = existing.findPsi()
|
val existingDeclaration = existing.findPsi()
|
||||||
if (clashedDescriptors.add(existing) && existingDeclaration is KtDeclaration && existingDeclaration != declaration) {
|
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 {
|
private fun isFakeOverridingNative(descriptor: CallableMemberDescriptor): Boolean {
|
||||||
return descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE &&
|
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) {
|
private fun getScope(descriptor: DeclarationDescriptor) = scopes.getOrPut(descriptor) {
|
||||||
|
|||||||
Reference in New Issue
Block a user