Pass PlatformToKotlinClassMap instance to PlatformTypesMappedToKotlinChecker

The purpose of this change is to allow PlatformToKotlinClassMap to be removed
from ModuleDescriptor
This commit is contained in:
Alexander Udalov
2016-10-05 17:53:44 +03:00
parent 0360d0e4f6
commit b77388bd48
7 changed files with 42 additions and 27 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm.platform
import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.PlatformConfigurator
import org.jetbrains.kotlin.resolve.jvm.JvmOverloadFilter import org.jetbrains.kotlin.resolve.jvm.JvmOverloadFilter
import org.jetbrains.kotlin.resolve.jvm.JvmTypeSpecificityComparator import org.jetbrains.kotlin.resolve.jvm.JvmTypeSpecificityComparator
@@ -73,9 +74,10 @@ object JvmPlatformConfigurator : PlatformConfigurator(
identifierChecker = JvmSimpleNameBacktickChecker, identifierChecker = JvmSimpleNameBacktickChecker,
overloadFilter = JvmOverloadFilter overloadFilter = JvmOverloadFilter,
) {
platformToKotlinClassMap = JavaToKotlinClassMap.INSTANCE
) {
override fun configureModuleComponents(container: StorageComponentContainer) { override fun configureModuleComponents(container: StorageComponentContainer) {
container.useImpl<ReflectionAPICallChecker>() container.useImpl<ReflectionAPICallChecker>()
container.useImpl<JavaSyntheticScopes>() container.useImpl<JavaSyntheticScopes>()
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.resolve;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap; import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap;
import org.jetbrains.kotlin.psi.KtElement; import org.jetbrains.kotlin.psi.KtElement;
import org.jetbrains.kotlin.psi.KtExpression; import org.jetbrains.kotlin.psi.KtExpression;
@@ -30,9 +29,8 @@ import java.util.Collection;
import static org.jetbrains.kotlin.diagnostics.Errors.PLATFORM_CLASS_MAPPED_TO_KOTLIN; import static org.jetbrains.kotlin.diagnostics.Errors.PLATFORM_CLASS_MAPPED_TO_KOTLIN;
public class PlatformTypesMappedToKotlinChecker { public class PlatformTypesMappedToKotlinChecker {
public static void checkPlatformTypesMappedToKotlin( public static void checkPlatformTypesMappedToKotlin(
@NotNull ModuleDescriptor module, @NotNull PlatformToKotlinClassMap platformToKotlinMap,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull KtImportDirective importDirective, @NotNull KtImportDirective importDirective,
@NotNull Collection<? extends DeclarationDescriptor> descriptors @NotNull Collection<? extends DeclarationDescriptor> descriptors
@@ -40,20 +38,19 @@ public class PlatformTypesMappedToKotlinChecker {
KtExpression importedReference = importDirective.getImportedReference(); KtExpression importedReference = importDirective.getImportedReference();
if (importedReference != null) { if (importedReference != null) {
for (DeclarationDescriptor descriptor : descriptors) { for (DeclarationDescriptor descriptor : descriptors) {
reportPlatformClassMappedToKotlin(module, trace, importedReference, descriptor); reportPlatformClassMappedToKotlin(platformToKotlinMap, trace, importedReference, descriptor);
} }
} }
} }
public static void reportPlatformClassMappedToKotlin( public static void reportPlatformClassMappedToKotlin(
@NotNull ModuleDescriptor module, @NotNull PlatformToKotlinClassMap platformToKotlinMap,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull KtElement element, @NotNull KtElement element,
@NotNull DeclarationDescriptor descriptor @NotNull DeclarationDescriptor descriptor
) { ) {
if (!(descriptor instanceof ClassDescriptor)) return; if (!(descriptor instanceof ClassDescriptor)) return;
PlatformToKotlinClassMap platformToKotlinMap = module.getPlatformToKotlinClassMap();
Collection<ClassDescriptor> kotlinAnalogsForClass = platformToKotlinMap.mapPlatformClass((ClassDescriptor) descriptor); Collection<ClassDescriptor> kotlinAnalogsForClass = platformToKotlinMap.mapPlatformClass((ClassDescriptor) descriptor);
if (!kotlinAnalogsForClass.isEmpty()) { if (!kotlinAnalogsForClass.isEmpty()) {
trace.report(PLATFORM_CLASS_MAPPED_TO_KOTLIN.on(element, kotlinAnalogsForClass)); trace.report(PLATFORM_CLASS_MAPPED_TO_KOTLIN.on(element, kotlinAnalogsForClass));
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.ModuleParameters import org.jetbrains.kotlin.descriptors.ModuleParameters
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap
import org.jetbrains.kotlin.resolve.calls.checkers.* import org.jetbrains.kotlin.resolve.calls.checkers.*
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
import org.jetbrains.kotlin.resolve.scopes.SyntheticConstructorsProvider import org.jetbrains.kotlin.resolve.scopes.SyntheticConstructorsProvider
@@ -45,7 +46,7 @@ abstract class TargetPlatform(
override val defaultModuleParameters = ModuleParameters.Empty override val defaultModuleParameters = ModuleParameters.Empty
override val platformConfigurator = override val platformConfigurator =
object : PlatformConfigurator(DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf(), listOf(), object : PlatformConfigurator(DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf(), listOf(),
IdentifierChecker.DEFAULT, OverloadFilter.DEFAULT) { IdentifierChecker.DEFAULT, OverloadFilter.DEFAULT, PlatformToKotlinClassMap.EMPTY) {
override fun configureModuleComponents(container: StorageComponentContainer) { override fun configureModuleComponents(container: StorageComponentContainer) {
container.useInstance(SyntheticScopes.Empty) container.useInstance(SyntheticScopes.Empty)
container.useInstance(SyntheticConstructorsProvider.Empty) container.useInstance(SyntheticConstructorsProvider.Empty)
@@ -82,7 +83,8 @@ abstract class PlatformConfigurator(
additionalClassifierUsageCheckers: List<ClassifierUsageChecker>, additionalClassifierUsageCheckers: List<ClassifierUsageChecker>,
private val additionalAnnotationCheckers: List<AdditionalAnnotationChecker>, private val additionalAnnotationCheckers: List<AdditionalAnnotationChecker>,
private val identifierChecker: IdentifierChecker, private val identifierChecker: IdentifierChecker,
private val overloadFilter: OverloadFilter private val overloadFilter: OverloadFilter,
private val platformToKotlinClassMap: PlatformToKotlinClassMap
) { ) {
private val declarationCheckers: List<DeclarationChecker> = DEFAULT_DECLARATION_CHECKERS + additionalDeclarationCheckers private val declarationCheckers: List<DeclarationChecker> = DEFAULT_DECLARATION_CHECKERS + additionalDeclarationCheckers
private val callCheckers: List<CallChecker> = DEFAULT_CALL_CHECKERS + additionalCallCheckers private val callCheckers: List<CallChecker> = DEFAULT_CALL_CHECKERS + additionalCallCheckers
@@ -100,6 +102,7 @@ abstract class PlatformConfigurator(
additionalAnnotationCheckers.forEach { useInstance(it) } additionalAnnotationCheckers.forEach { useInstance(it) }
useInstance(identifierChecker) useInstance(identifierChecker)
useInstance(overloadFilter) useInstance(overloadFilter)
useInstance(platformToKotlinClassMap)
} }
} }
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.diagnostics.Errors.* import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo
import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode
@@ -60,9 +61,9 @@ class TypeResolver(
private val dynamicTypesSettings: DynamicTypesSettings, private val dynamicTypesSettings: DynamicTypesSettings,
private val dynamicCallableDescriptors: DynamicCallableDescriptors, private val dynamicCallableDescriptors: DynamicCallableDescriptors,
private val identifierChecker: IdentifierChecker, private val identifierChecker: IdentifierChecker,
private val platformToKotlinClassMap: PlatformToKotlinClassMap,
private val languageVersionSettings: LanguageVersionSettings private val languageVersionSettings: LanguageVersionSettings
) { ) {
open class TypeTransformerForTests { open class TypeTransformerForTests {
open fun transformType(kotlinType: KotlinType): KotlinType? = null open fun transformType(kotlinType: KotlinType): KotlinType? = null
} }
@@ -762,16 +763,18 @@ class TypeResolver(
} }
} }
val result = qualifiedExpressionResolver.resolveDescriptorForType(userType, scope, trace, isDebuggerContext) return qualifiedExpressionResolver.resolveDescriptorForType(userType, scope, trace, isDebuggerContext).apply {
if (result.classifierDescriptor != null) { if (classifierDescriptor != null) {
PlatformTypesMappedToKotlinChecker.reportPlatformClassMappedToKotlin( PlatformTypesMappedToKotlinChecker.reportPlatformClassMappedToKotlin(
moduleDescriptor, trace, userType, result.classifierDescriptor) platformToKotlinClassMap, trace, userType, classifierDescriptor
)
}
} }
return result
} }
companion object { companion object {
@JvmStatic fun resolveProjectionKind(projectionKind: KtProjectionKind): Variance { @JvmStatic
fun resolveProjectionKind(projectionKind: KtProjectionKind): Variance {
return when (projectionKind) { return when (projectionKind) {
KtProjectionKind.IN -> IN_VARIANCE KtProjectionKind.IN -> IN_VARIANCE
KtProjectionKind.OUT -> OUT_VARIANCE KtProjectionKind.OUT -> OUT_VARIANCE
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation
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.platform.PlatformToKotlinClassMap
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtImportDirective
import org.jetbrains.kotlin.psi.KtImportsFactory import org.jetbrains.kotlin.psi.KtImportsFactory
@@ -48,7 +49,8 @@ class FileScopeFactory(
private val moduleDescriptor: ModuleDescriptor, private val moduleDescriptor: ModuleDescriptor,
private val qualifiedExpressionResolver: QualifiedExpressionResolver, private val qualifiedExpressionResolver: QualifiedExpressionResolver,
private val bindingTrace: BindingTrace, private val bindingTrace: BindingTrace,
private val ktImportsFactory: KtImportsFactory private val ktImportsFactory: KtImportsFactory,
private val platformToKotlinClassMap: PlatformToKotlinClassMap
) { ) {
private val defaultImports by storageManager.createLazyValue { private val defaultImports by storageManager.createLazyValue {
ktImportsFactory.createImportDirectives(moduleDescriptor.defaultImports) ktImportsFactory.createImportDirectives(moduleDescriptor.defaultImports)
@@ -83,8 +85,11 @@ class FileScopeFactory(
val packageFragment = topLevelDescriptorProvider.getPackageFragment(file.packageFqName) val packageFragment = topLevelDescriptorProvider.getPackageFragment(file.packageFqName)
?: error("Could not find fragment ${file.packageFqName} for file ${file.name}") ?: error("Could not find fragment ${file.packageFqName} for file ${file.name}")
fun createImportResolver(indexedImports: IndexedImports, trace: BindingTrace, excludedImports: List<FqName>? = null) fun createImportResolver(indexedImports: IndexedImports, trace: BindingTrace, excludedImports: List<FqName>? = null) =
= LazyImportResolver(storageManager, qualifiedExpressionResolver, moduleDescriptor, indexedImports, aliasImportNames concat excludedImports, trace, packageFragment) LazyImportResolver(
storageManager, qualifiedExpressionResolver, moduleDescriptor, platformToKotlinClassMap,
indexedImports, aliasImportNames concat excludedImports, trace, packageFragment
)
val explicitImportResolver = createImportResolver(ExplicitImportsIndexed(imports), bindingTrace) val explicitImportResolver = createImportResolver(ExplicitImportsIndexed(imports), bindingTrace)
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?
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.incremental.KotlinLookupLocation
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation
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.platform.PlatformToKotlinClassMap
import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtImportDirective
import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.psi.KtPsiUtil
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
@@ -72,8 +73,9 @@ interface ImportResolver {
class LazyImportResolver( class LazyImportResolver(
val storageManager: StorageManager, val storageManager: StorageManager,
val qualifiedExpressionResolver: QualifiedExpressionResolver, private val qualifiedExpressionResolver: QualifiedExpressionResolver,
val moduleDescriptor: ModuleDescriptor, val moduleDescriptor: ModuleDescriptor,
private val platformToKotlinClassMap: PlatformToKotlinClassMap,
val indexedImports: IndexedImports, val indexedImports: IndexedImports,
excludedImportNames: Collection<FqName>, excludedImportNames: Collection<FqName>,
private val traceForImportResolve: BindingTrace, private val traceForImportResolve: BindingTrace,
@@ -81,15 +83,16 @@ class LazyImportResolver(
) : ImportResolver { ) : ImportResolver {
private val importedScopesProvider = storageManager.createMemoizedFunctionWithNullableValues { private val importedScopesProvider = storageManager.createMemoizedFunctionWithNullableValues {
directive: KtImportDirective -> directive: KtImportDirective ->
val directiveImportScope = qualifiedExpressionResolver.processImportReference(
directive, moduleDescriptor, traceForImportResolve, excludedImportNames, packageFragment) ?: return@createMemoizedFunctionWithNullableValues null
qualifiedExpressionResolver.processImportReference(
directive, moduleDescriptor, traceForImportResolve, excludedImportNames, packageFragment
)?.apply {
if (!directive.isAllUnder) { if (!directive.isAllUnder) {
PlatformTypesMappedToKotlinChecker.checkPlatformTypesMappedToKotlin( PlatformTypesMappedToKotlinChecker.checkPlatformTypesMappedToKotlin(
moduleDescriptor, traceForImportResolve, directive, directiveImportScope.getContributedDescriptors()) platformToKotlinClassMap, traceForImportResolve, directive, getContributedDescriptors()
)
} }
}
directiveImportScope
} }
override fun forceResolveAllImports() { override fun forceResolveAllImports() {
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallChecker import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallChecker
import org.jetbrains.kotlin.js.resolve.diagnostics.NativeInnerClassChecker import org.jetbrains.kotlin.js.resolve.diagnostics.NativeInnerClassChecker
import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap
import org.jetbrains.kotlin.resolve.IdentifierChecker import org.jetbrains.kotlin.resolve.IdentifierChecker
import org.jetbrains.kotlin.resolve.OverloadFilter import org.jetbrains.kotlin.resolve.OverloadFilter
import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.PlatformConfigurator
@@ -37,7 +38,8 @@ object JsPlatformConfigurator : PlatformConfigurator(
additionalClassifierUsageCheckers = listOf(), additionalClassifierUsageCheckers = listOf(),
additionalAnnotationCheckers = listOf(), additionalAnnotationCheckers = listOf(),
identifierChecker = IdentifierChecker.DEFAULT, identifierChecker = IdentifierChecker.DEFAULT,
overloadFilter = OverloadFilter.DEFAULT overloadFilter = OverloadFilter.DEFAULT,
platformToKotlinClassMap = PlatformToKotlinClassMap.EMPTY
) { ) {
override fun configureModuleComponents(container: StorageComponentContainer) { override fun configureModuleComponents(container: StorageComponentContainer) {
container.useImpl<JsCallChecker>() container.useImpl<JsCallChecker>()