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.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<ReflectionAPICallChecker>()
container.useImpl<JavaSyntheticScopes>()
@@ -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<? extends DeclarationDescriptor> 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<ClassDescriptor> kotlinAnalogsForClass = platformToKotlinMap.mapPlatformClass((ClassDescriptor) descriptor);
if (!kotlinAnalogsForClass.isEmpty()) {
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.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<ClassifierUsageChecker>,
private val additionalAnnotationCheckers: List<AdditionalAnnotationChecker>,
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 callCheckers: List<CallChecker> = DEFAULT_CALL_CHECKERS + additionalCallCheckers
@@ -100,6 +102,7 @@ abstract class PlatformConfigurator(
additionalAnnotationCheckers.forEach { useInstance(it) }
useInstance(identifierChecker)
useInstance(overloadFilter)
useInstance(platformToKotlinClassMap)
}
}
@@ -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
@@ -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<FqName>? = null)
= LazyImportResolver(storageManager, qualifiedExpressionResolver, moduleDescriptor, indexedImports, aliasImportNames concat excludedImports, trace, packageFragment)
fun createImportResolver(indexedImports: IndexedImports, trace: BindingTrace, excludedImports: List<FqName>? = 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?
@@ -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<FqName>,
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() {
@@ -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<JsCallChecker>()