Consider only direct children of non-kotlin default imported packages when looking for aliased types.

This commit is contained in:
Ilya Gorbunov
2016-10-07 20:44:28 +03:00
parent 3baf2f8942
commit f2c5fee1cf
2 changed files with 13 additions and 3 deletions
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.isChildOf
import org.jetbrains.kotlin.name.isSubpackageOf import org.jetbrains.kotlin.name.isSubpackageOf
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
@@ -54,14 +55,21 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
val packagesWithAliases = listOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, KotlinBuiltIns.TEXT_PACKAGE_FQ_NAME) val packagesWithAliases = listOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, KotlinBuiltIns.TEXT_PACKAGE_FQ_NAME)
val dependencies = this.dependencies.sure { "Dependencies of module $id were not set" } val dependencies = this.dependencies.sure { "Dependencies of module $id were not set" }
val builtinTypeAliases = dependencies.allDependencies.filter { it != this }.flatMap { val builtinTypeAliases = dependencies.allDependencies.filter { it != this }.flatMap {
System.out.flush()
packagesWithAliases.map(it::getPackage).flatMap { packagesWithAliases.map(it::getPackage).flatMap {
it.memberScope.getContributedDescriptors(DescriptorKindFilter.TYPE_ALIASES).filterIsInstance<TypeAliasDescriptor>() it.memberScope.getContributedDescriptors(DescriptorKindFilter.TYPE_ALIASES).filterIsInstance<TypeAliasDescriptor>()
} }
} }
val nonKotlinDefaultImportedPackages = defaultImports.filter { it.isAllUnder }.mapNotNull { it.fqnPart().check { !it.isSubpackageOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) } } val nonKotlinDefaultImportedPackages =
val nonKotlinAliasedTypeFqNames = builtinTypeAliases.mapNotNull { it.expandedType.constructor.declarationDescriptor?.fqNameSafe }.filter { nonKotlinDefaultImportedPackages.any(it::isSubpackageOf) } defaultImports
.filter { it.isAllUnder }
.mapNotNull {
it.fqnPart().check { !it.isSubpackageOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) }
}
val nonKotlinAliasedTypeFqNames =
builtinTypeAliases
.mapNotNull { it.expandedType.constructor.declarationDescriptor?.fqNameSafe }
.filter { nonKotlinDefaultImportedPackages.any(it::isChildOf) }
excludedImports + nonKotlinAliasedTypeFqNames excludedImports + nonKotlinAliasedTypeFqNames
} }
@@ -24,6 +24,8 @@ fun FqName.isSubpackageOf(packageName: FqName): Boolean {
} }
} }
fun FqName.isChildOf(packageName: FqName): Boolean = parentOrNull() == packageName
private fun isSubpackageOf(subpackageNameStr: String, packageNameStr: String): Boolean { private fun isSubpackageOf(subpackageNameStr: String, packageNameStr: String): Boolean {
return subpackageNameStr.startsWith(packageNameStr) && subpackageNameStr[packageNameStr.length] == '.' return subpackageNameStr.startsWith(packageNameStr) && subpackageNameStr[packageNameStr.length] == '.'
} }