From b77388bd48e82a3bb71aa16c51cdc1bfc76b321f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 5 Oct 2016 17:53:44 +0300 Subject: [PATCH] Pass PlatformToKotlinClassMap instance to PlatformTypesMappedToKotlinChecker The purpose of this change is to allow PlatformToKotlinClassMap to be removed from ModuleDescriptor --- .../jvm/platform/JvmPlatformConfigurator.kt | 6 ++++-- .../PlatformTypesMappedToKotlinChecker.java | 9 +++------ .../jetbrains/kotlin/resolve/TargetPlatform.kt | 7 +++++-- .../jetbrains/kotlin/resolve/TypeResolver.kt | 17 ++++++++++------- .../kotlin/resolve/lazy/FileScopeFactory.kt | 11 ++++++++--- .../kotlin/resolve/lazy/LazyImportScope.kt | 15 +++++++++------ .../kotlin/js/resolve/JsPlatformConfigurator.kt | 4 +++- 7 files changed, 42 insertions(+), 27 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt index bbe1914d1dd..fb55163c5dc 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm.platform import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useInstance +import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.jvm.JvmOverloadFilter import org.jetbrains.kotlin.resolve.jvm.JvmTypeSpecificityComparator @@ -73,9 +74,10 @@ object JvmPlatformConfigurator : PlatformConfigurator( identifierChecker = JvmSimpleNameBacktickChecker, - overloadFilter = JvmOverloadFilter -) { + overloadFilter = JvmOverloadFilter, + platformToKotlinClassMap = JavaToKotlinClassMap.INSTANCE +) { override fun configureModuleComponents(container: StorageComponentContainer) { container.useImpl() container.useImpl() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformTypesMappedToKotlinChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformTypesMappedToKotlinChecker.java index 137118e8f79..754c207eaec 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformTypesMappedToKotlinChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformTypesMappedToKotlinChecker.java @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.resolve; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap; import org.jetbrains.kotlin.psi.KtElement; 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; public class PlatformTypesMappedToKotlinChecker { - public static void checkPlatformTypesMappedToKotlin( - @NotNull ModuleDescriptor module, + @NotNull PlatformToKotlinClassMap platformToKotlinMap, @NotNull BindingTrace trace, @NotNull KtImportDirective importDirective, @NotNull Collection descriptors @@ -40,20 +38,19 @@ public class PlatformTypesMappedToKotlinChecker { KtExpression importedReference = importDirective.getImportedReference(); if (importedReference != null) { for (DeclarationDescriptor descriptor : descriptors) { - reportPlatformClassMappedToKotlin(module, trace, importedReference, descriptor); + reportPlatformClassMappedToKotlin(platformToKotlinMap, trace, importedReference, descriptor); } } } public static void reportPlatformClassMappedToKotlin( - @NotNull ModuleDescriptor module, + @NotNull PlatformToKotlinClassMap platformToKotlinMap, @NotNull BindingTrace trace, @NotNull KtElement element, @NotNull DeclarationDescriptor descriptor ) { if (!(descriptor instanceof ClassDescriptor)) return; - PlatformToKotlinClassMap platformToKotlinMap = module.getPlatformToKotlinClassMap(); Collection kotlinAnalogsForClass = platformToKotlinMap.mapPlatformClass((ClassDescriptor) descriptor); if (!kotlinAnalogsForClass.isEmpty()) { trace.report(PLATFORM_CLASS_MAPPED_TO_KOTLIN.on(element, kotlinAnalogsForClass)); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt index 88c3aef54cb..1ed1c5b7028 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleParameters import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl 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.results.TypeSpecificityComparator import org.jetbrains.kotlin.resolve.scopes.SyntheticConstructorsProvider @@ -45,7 +46,7 @@ abstract class TargetPlatform( override val defaultModuleParameters = ModuleParameters.Empty override val platformConfigurator = object : PlatformConfigurator(DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf(), listOf(), - IdentifierChecker.DEFAULT, OverloadFilter.DEFAULT) { + IdentifierChecker.DEFAULT, OverloadFilter.DEFAULT, PlatformToKotlinClassMap.EMPTY) { override fun configureModuleComponents(container: StorageComponentContainer) { container.useInstance(SyntheticScopes.Empty) container.useInstance(SyntheticConstructorsProvider.Empty) @@ -82,7 +83,8 @@ abstract class PlatformConfigurator( additionalClassifierUsageCheckers: List, private val additionalAnnotationCheckers: List, private val identifierChecker: IdentifierChecker, - private val overloadFilter: OverloadFilter + private val overloadFilter: OverloadFilter, + private val platformToKotlinClassMap: PlatformToKotlinClassMap ) { private val declarationCheckers: List = DEFAULT_DECLARATION_CHECKERS + additionalDeclarationCheckers private val callCheckers: List = DEFAULT_CALL_CHECKERS + additionalCallCheckers @@ -100,6 +102,7 @@ abstract class PlatformConfigurator( additionalAnnotationCheckers.forEach { useInstance(it) } useInstance(identifierChecker) useInstance(overloadFilter) + useInstance(platformToKotlinClassMap) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 99c707314c9..31c37e6cfd2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Errors.* import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo import org.jetbrains.kotlin.psi.codeFragmentUtil.suppressDiagnosticsInDebugMode @@ -60,9 +61,9 @@ class TypeResolver( private val dynamicTypesSettings: DynamicTypesSettings, private val dynamicCallableDescriptors: DynamicCallableDescriptors, private val identifierChecker: IdentifierChecker, + private val platformToKotlinClassMap: PlatformToKotlinClassMap, private val languageVersionSettings: LanguageVersionSettings ) { - open class TypeTransformerForTests { open fun transformType(kotlinType: KotlinType): KotlinType? = null } @@ -762,16 +763,18 @@ class TypeResolver( } } - val result = qualifiedExpressionResolver.resolveDescriptorForType(userType, scope, trace, isDebuggerContext) - if (result.classifierDescriptor != null) { - PlatformTypesMappedToKotlinChecker.reportPlatformClassMappedToKotlin( - moduleDescriptor, trace, userType, result.classifierDescriptor) + return qualifiedExpressionResolver.resolveDescriptorForType(userType, scope, trace, isDebuggerContext).apply { + if (classifierDescriptor != null) { + PlatformTypesMappedToKotlinChecker.reportPlatformClassMappedToKotlin( + platformToKotlinClassMap, trace, userType, classifierDescriptor + ) + } } - return result } companion object { - @JvmStatic fun resolveProjectionKind(projectionKind: KtProjectionKind): Variance { + @JvmStatic + fun resolveProjectionKind(projectionKind: KtProjectionKind): Variance { return when (projectionKind) { KtProjectionKind.IN -> IN_VARIANCE KtProjectionKind.OUT -> OUT_VARIANCE diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 93f8ba45134..40f8ad3ccbe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtImportsFactory @@ -48,7 +49,8 @@ class FileScopeFactory( private val moduleDescriptor: ModuleDescriptor, private val qualifiedExpressionResolver: QualifiedExpressionResolver, private val bindingTrace: BindingTrace, - private val ktImportsFactory: KtImportsFactory + private val ktImportsFactory: KtImportsFactory, + private val platformToKotlinClassMap: PlatformToKotlinClassMap ) { private val defaultImports by storageManager.createLazyValue { ktImportsFactory.createImportDirectives(moduleDescriptor.defaultImports) @@ -83,8 +85,11 @@ class FileScopeFactory( val packageFragment = topLevelDescriptorProvider.getPackageFragment(file.packageFqName) ?: error("Could not find fragment ${file.packageFqName} for file ${file.name}") - fun createImportResolver(indexedImports: IndexedImports, trace: BindingTrace, excludedImports: List? = null) - = LazyImportResolver(storageManager, qualifiedExpressionResolver, moduleDescriptor, indexedImports, aliasImportNames concat excludedImports, trace, packageFragment) + fun createImportResolver(indexedImports: IndexedImports, trace: BindingTrace, excludedImports: List? = null) = + LazyImportResolver( + storageManager, qualifiedExpressionResolver, moduleDescriptor, platformToKotlinClassMap, + indexedImports, aliasImportNames concat excludedImports, trace, packageFragment + ) val explicitImportResolver = createImportResolver(ExplicitImportsIndexed(imports), bindingTrace) val allUnderImportResolver = createImportResolver(AllUnderImportsIndexed(imports), bindingTrace) // TODO: should we count excludedImports here also? diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index e4386bef560..623cb3927e7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.incremental.KotlinLookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.resolve.BindingTrace @@ -72,8 +73,9 @@ interface ImportResolver { class LazyImportResolver( val storageManager: StorageManager, - val qualifiedExpressionResolver: QualifiedExpressionResolver, + private val qualifiedExpressionResolver: QualifiedExpressionResolver, val moduleDescriptor: ModuleDescriptor, + private val platformToKotlinClassMap: PlatformToKotlinClassMap, val indexedImports: IndexedImports, excludedImportNames: Collection, private val traceForImportResolve: BindingTrace, @@ -81,15 +83,16 @@ class LazyImportResolver( ) : ImportResolver { private val importedScopesProvider = storageManager.createMemoizedFunctionWithNullableValues { 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) { PlatformTypesMappedToKotlinChecker.checkPlatformTypesMappedToKotlin( - moduleDescriptor, traceForImportResolve, directive, directiveImportScope.getContributedDescriptors()) + platformToKotlinClassMap, traceForImportResolve, directive, getContributedDescriptors() + ) } - - directiveImportScope + } } override fun forceResolveAllImports() { diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt index c000796de07..e09913d8fd9 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatformConfigurator.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallChecker 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.OverloadFilter import org.jetbrains.kotlin.resolve.PlatformConfigurator @@ -37,7 +38,8 @@ object JsPlatformConfigurator : PlatformConfigurator( additionalClassifierUsageCheckers = listOf(), additionalAnnotationCheckers = listOf(), identifierChecker = IdentifierChecker.DEFAULT, - overloadFilter = OverloadFilter.DEFAULT + overloadFilter = OverloadFilter.DEFAULT, + platformToKotlinClassMap = PlatformToKotlinClassMap.EMPTY ) { override fun configureModuleComponents(container: StorageComponentContainer) { container.useImpl()