Determine automatically which types from java.lang is aliased in default imported kotlin packages and exclude them from imported java.lang.* scope.
This commit is contained in:
+1
-13
@@ -62,16 +62,4 @@ private val DEFAULT_IMPORTS_FOR_JVM: List<ImportPath> = ArrayList<ImportPath>().
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val EXCLUDED_IMPORTS_FOR_JVM: List<FqName> = listOf(
|
private val EXCLUDED_IMPORTS_FOR_JVM: List<FqName> = emptyList()
|
||||||
"Error",
|
|
||||||
"Exception",
|
|
||||||
"RuntimeException",
|
|
||||||
"IllegalArgumentException",
|
|
||||||
"IllegalStateException",
|
|
||||||
"IndexOutOfBoundsException",
|
|
||||||
"UnsupportedOperationException",
|
|
||||||
"NumberFormatException",
|
|
||||||
"NullPointerException",
|
|
||||||
"ClassCastException",
|
|
||||||
"AssertionError"
|
|
||||||
).map { FqName("java.lang.$it") }
|
|
||||||
@@ -95,7 +95,7 @@ class FileScopeFactory(
|
|||||||
val allUnderImportResolver = createImportResolver(AllUnderImportsIndexed(imports), bindingTrace) // TODO: should we count excludedImports here also?
|
val allUnderImportResolver = createImportResolver(AllUnderImportsIndexed(imports), bindingTrace) // TODO: should we count excludedImports here also?
|
||||||
|
|
||||||
val defaultExplicitImportResolver = createImportResolver(ExplicitImportsIndexed(defaultImportsFiltered), tempTrace)
|
val defaultExplicitImportResolver = createImportResolver(ExplicitImportsIndexed(defaultImportsFiltered), tempTrace)
|
||||||
val defaultAllUnderImportResolver = createImportResolver(AllUnderImportsIndexed(defaultImportsFiltered), tempTrace, moduleDescriptor.excludedImports)
|
val defaultAllUnderImportResolver = createImportResolver(AllUnderImportsIndexed(defaultImportsFiltered), tempTrace, moduleDescriptor.effectivelyExcludedImports)
|
||||||
|
|
||||||
val dummyContainerDescriptor = DummyContainerDescriptor(file, packageFragment)
|
val dummyContainerDescriptor = DummyContainerDescriptor(file, packageFragment)
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ interface ModuleDescriptor : DeclarationDescriptor, ModuleParameters {
|
|||||||
fun <T> getCapability(capability: Capability<T>): T?
|
fun <T> getCapability(capability: Capability<T>): T?
|
||||||
|
|
||||||
class Capability<T>(val name: String)
|
class Capability<T>(val name: String)
|
||||||
|
|
||||||
|
val effectivelyExcludedImports: List<FqName>
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ModuleParameters {
|
interface ModuleParameters {
|
||||||
|
|||||||
@@ -17,14 +17,16 @@
|
|||||||
package org.jetbrains.kotlin.descriptors.impl
|
package org.jetbrains.kotlin.descriptors.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleParameters
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
|
|
||||||
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.isSubpackageOf
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
import org.jetbrains.kotlin.storage.getValue
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.check
|
||||||
import org.jetbrains.kotlin.utils.sure
|
import org.jetbrains.kotlin.utils.sure
|
||||||
import java.lang.IllegalArgumentException
|
import java.lang.IllegalArgumentException
|
||||||
|
|
||||||
@@ -48,6 +50,22 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
|||||||
fqName: FqName -> LazyPackageViewDescriptorImpl(this, fqName, storageManager)
|
fqName: FqName -> LazyPackageViewDescriptorImpl(this, fqName, storageManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val effectivelyExcludedImports: List<FqName> by storageManager.createLazyValue {
|
||||||
|
val packagesWithAliases = listOf(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, KotlinBuiltIns.COLLECTIONS_PACKAGE_FQ_NAME)
|
||||||
|
val dependencies = this.dependencies.sure { "Dependencies of module $id were not set" }
|
||||||
|
val builtinTypeAliases = dependencies.allDependencies.filter { it != this }.flatMap {
|
||||||
|
System.out.flush()
|
||||||
|
packagesWithAliases.map(it::getPackage).flatMap {
|
||||||
|
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 nonKotlinAliasedTypeFqNames = builtinTypeAliases.mapNotNull { it.expandedType.constructor.declarationDescriptor?.fqNameSafe }.filter { nonKotlinDefaultImportedPackages.any(it::isSubpackageOf) }
|
||||||
|
|
||||||
|
excludedImports + nonKotlinAliasedTypeFqNames
|
||||||
|
}
|
||||||
|
|
||||||
override fun getPackage(fqName: FqName): PackageViewDescriptor = packages(fqName)
|
override fun getPackage(fqName: FqName): PackageViewDescriptor = packages(fqName)
|
||||||
|
|
||||||
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> {
|
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> {
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ class DescriptorKindFilter(
|
|||||||
private fun DeclarationDescriptor.kind(): Int {
|
private fun DeclarationDescriptor.kind(): Int {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is ClassDescriptor -> if (this.kind.isSingleton) SINGLETON_CLASSIFIERS_MASK else NON_SINGLETON_CLASSIFIERS_MASK
|
is ClassDescriptor -> if (this.kind.isSingleton) SINGLETON_CLASSIFIERS_MASK else NON_SINGLETON_CLASSIFIERS_MASK
|
||||||
|
is TypeAliasDescriptor -> TYPE_ALIASES_MASK
|
||||||
is ClassifierDescriptor -> NON_SINGLETON_CLASSIFIERS_MASK
|
is ClassifierDescriptor -> NON_SINGLETON_CLASSIFIERS_MASK
|
||||||
is PackageFragmentDescriptor, is PackageViewDescriptor -> PACKAGES_MASK
|
is PackageFragmentDescriptor, is PackageViewDescriptor -> PACKAGES_MASK
|
||||||
is FunctionDescriptor -> FUNCTIONS_MASK
|
is FunctionDescriptor -> FUNCTIONS_MASK
|
||||||
@@ -123,14 +124,18 @@ class DescriptorKindFilter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val NON_SINGLETON_CLASSIFIERS_MASK: Int = 0x01
|
private var nextMaskValue: Int = 0x01
|
||||||
val SINGLETON_CLASSIFIERS_MASK: Int = 0x02
|
private fun nextMask() = nextMaskValue.apply { nextMaskValue = nextMaskValue shl 1 }
|
||||||
val PACKAGES_MASK: Int = 0x04
|
|
||||||
val FUNCTIONS_MASK: Int = 0x08
|
|
||||||
val VARIABLES_MASK: Int = 0x10
|
|
||||||
|
|
||||||
val ALL_KINDS_MASK: Int = 0x1F
|
val NON_SINGLETON_CLASSIFIERS_MASK: Int = nextMask()
|
||||||
val CLASSIFIERS_MASK: Int = NON_SINGLETON_CLASSIFIERS_MASK or SINGLETON_CLASSIFIERS_MASK
|
val SINGLETON_CLASSIFIERS_MASK: Int = nextMask()
|
||||||
|
val TYPE_ALIASES_MASK: Int = nextMask()
|
||||||
|
val PACKAGES_MASK: Int = nextMask()
|
||||||
|
val FUNCTIONS_MASK: Int = nextMask()
|
||||||
|
val VARIABLES_MASK: Int = nextMask()
|
||||||
|
|
||||||
|
val ALL_KINDS_MASK: Int = nextMask() - 1
|
||||||
|
val CLASSIFIERS_MASK: Int = NON_SINGLETON_CLASSIFIERS_MASK or SINGLETON_CLASSIFIERS_MASK or TYPE_ALIASES_MASK
|
||||||
val VALUES_MASK: Int = SINGLETON_CLASSIFIERS_MASK or FUNCTIONS_MASK or VARIABLES_MASK
|
val VALUES_MASK: Int = SINGLETON_CLASSIFIERS_MASK or FUNCTIONS_MASK or VARIABLES_MASK
|
||||||
val CALLABLES_MASK: Int = FUNCTIONS_MASK or VARIABLES_MASK
|
val CALLABLES_MASK: Int = FUNCTIONS_MASK or VARIABLES_MASK
|
||||||
|
|
||||||
@@ -138,6 +143,7 @@ class DescriptorKindFilter(
|
|||||||
@JvmField val CALLABLES: DescriptorKindFilter = DescriptorKindFilter(CALLABLES_MASK)
|
@JvmField val CALLABLES: DescriptorKindFilter = DescriptorKindFilter(CALLABLES_MASK)
|
||||||
@JvmField val NON_SINGLETON_CLASSIFIERS: DescriptorKindFilter = DescriptorKindFilter(NON_SINGLETON_CLASSIFIERS_MASK)
|
@JvmField val NON_SINGLETON_CLASSIFIERS: DescriptorKindFilter = DescriptorKindFilter(NON_SINGLETON_CLASSIFIERS_MASK)
|
||||||
@JvmField val SINGLETON_CLASSIFIERS: DescriptorKindFilter = DescriptorKindFilter(SINGLETON_CLASSIFIERS_MASK)
|
@JvmField val SINGLETON_CLASSIFIERS: DescriptorKindFilter = DescriptorKindFilter(SINGLETON_CLASSIFIERS_MASK)
|
||||||
|
@JvmField val TYPE_ALIASES: DescriptorKindFilter = DescriptorKindFilter(TYPE_ALIASES_MASK)
|
||||||
@JvmField val CLASSIFIERS: DescriptorKindFilter = DescriptorKindFilter(CLASSIFIERS_MASK)
|
@JvmField val CLASSIFIERS: DescriptorKindFilter = DescriptorKindFilter(CLASSIFIERS_MASK)
|
||||||
@JvmField val PACKAGES: DescriptorKindFilter = DescriptorKindFilter(PACKAGES_MASK)
|
@JvmField val PACKAGES: DescriptorKindFilter = DescriptorKindFilter(PACKAGES_MASK)
|
||||||
@JvmField val FUNCTIONS: DescriptorKindFilter = DescriptorKindFilter(FUNCTIONS_MASK)
|
@JvmField val FUNCTIONS: DescriptorKindFilter = DescriptorKindFilter(FUNCTIONS_MASK)
|
||||||
|
|||||||
@@ -68,6 +68,12 @@ public class ErrorUtils {
|
|||||||
return emptyList();
|
return emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<FqName> getEffectivelyExcludedImports() {
|
||||||
|
return emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Annotations getAnnotations() {
|
public Annotations getAnnotations() {
|
||||||
|
|||||||
Reference in New Issue
Block a user