Support platform modifier in back-ends, add multi-platform integration test

Skip 'platform' declarations completely in back-ends
This commit is contained in:
Alexander Udalov
2016-10-28 19:21:27 +03:00
parent c1eebacd55
commit a4169416ad
10 changed files with 127 additions and 13 deletions
@@ -20,11 +20,11 @@ import com.google.common.collect.HashMultimap
import com.google.common.collect.Multimap
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.diagnostics.Errors.REDECLARATION
import org.jetbrains.kotlin.diagnostics.reportOnDeclaration
import org.jetbrains.kotlin.diagnostics.reportOnDeclarationOrFail
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.FqName
@@ -78,14 +78,17 @@ class DeclarationResolver(
for ((fqName, declarationsOrPackageDirectives) in topLevelFqNames.asMap()) {
if (fqName.isRoot) continue
val descriptors = getTopLevelDescriptorsByFqName(topLevelDescriptorProvider, fqName, NoLookupLocation.WHEN_CHECK_REDECLARATIONS)
// TODO: report error on platform class and impl val, or vice versa
val (platform, impl) =
getTopLevelDescriptorsByFqName(topLevelDescriptorProvider, fqName, NoLookupLocation.WHEN_CHECK_REDECLARATIONS)
.partition { it is MemberDescriptor && it.isPlatform }
if (descriptors.size > 1) {
for (declarationOrPackageDirective in declarationsOrPackageDirectives) {
val reportAt =
if (declarationOrPackageDirective is KtPackageDirective) declarationOrPackageDirective.getNameIdentifier()
else declarationOrPackageDirective
trace.report(Errors.PACKAGE_OR_CLASSIFIER_REDECLARATION.on(reportAt!!, fqName.shortName().asString()))
for (descriptors in listOf(platform, impl)) {
if (descriptors.size > 1) {
for (directive in declarationsOrPackageDirectives) {
val reportAt = (directive as? KtPackageDirective)?.nameIdentifier ?: directive
trace.report(Errors.PACKAGE_OR_CLASSIFIER_REDECLARATION.on(reportAt, fqName.shortName().asString()))
}
}
}
}