From 99ac9e1c2fa979798360df8491b55a4869bd145f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 2 Dec 2014 18:40:39 +0300 Subject: [PATCH] Singleton made thread-safe in JavaToKotlinClassMap --- .../src/org/jetbrains/jet/codegen/JvmRuntimeTypes.java | 2 +- .../jet/lang/resolve/java/JvmAnalyzerFacade.kt | 2 +- .../lang/resolve/java/TopDownAnalyzerFacadeForJVM.java | 2 +- .../java/kotlinSignature/TypeTransformingVisitor.java | 2 +- .../compiler/AbstractSdkAnnotationsValidityTest.java | 2 +- .../lazy/descriptors/LazyJavaAnnotationDescriptor.kt | 2 +- .../resolve/java/lazy/types/LazyJavaTypeResolver.kt | 6 +++--- .../resolve/java/mapping/JavaToKotlinClassMap.java | 10 +--------- .../debugger/evaluate/KotlinEvaluationBuilder.kt | 2 +- j2k/src/org/jetbrains/jet/j2k/ast/Imports.kt | 2 +- 10 files changed, 12 insertions(+), 20 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JvmRuntimeTypes.java b/compiler/backend/src/org/jetbrains/jet/codegen/JvmRuntimeTypes.java index 5faa1df3d12..761f1635ce6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JvmRuntimeTypes.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JvmRuntimeTypes.java @@ -47,7 +47,7 @@ public class JvmRuntimeTypes { this.reflectionTypes = reflectionTypes; ModuleDescriptor fakeModule = new ModuleDescriptorImpl(Name.special(""), - Collections.emptyList(), JavaToKotlinClassMap.getInstance()); + Collections.emptyList(), JavaToKotlinClassMap.INSTANCE); PackageFragmentDescriptor kotlinJvmInternal = new MutablePackageFragmentDescriptor(fakeModule, new FqName("kotlin.jvm.internal")); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAnalyzerFacade.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAnalyzerFacade.kt index f0c68ec8171..1fbeff8d784 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAnalyzerFacade.kt +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAnalyzerFacade.kt @@ -78,6 +78,6 @@ public object JvmAnalyzerFacade : AnalyzerFacade { FqName javaFqName = KotlinToJavaTypesMap.getInstance().getKotlinToJavaFqName(originalClassFqName); if (javaFqName == null) return null; - Collection descriptors = JavaToKotlinClassMap.getInstance().mapPlatformClass(javaFqName); + Collection descriptors = JavaToKotlinClassMap.INSTANCE.mapPlatformClass(javaFqName); for (ClassDescriptor descriptor : descriptors) { String fqName = DescriptorUtils.getFqName(descriptor).asString(); if (isSameName(qualifiedName, fqName)) { diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractSdkAnnotationsValidityTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractSdkAnnotationsValidityTest.java index 05706dc2e40..8dc4bf52626 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractSdkAnnotationsValidityTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractSdkAnnotationsValidityTest.java @@ -125,7 +125,7 @@ public abstract class AbstractSdkAnnotationsValidityTest extends UsefulTestCase @Override public Void visitClassDescriptor(ClassDescriptor descriptor, Void data) { // skip java.util.Collection, etc. - if (!JavaToKotlinClassMap.getInstance().mapPlatformClass(DescriptorUtils.getFqNameSafe(descriptor)).isEmpty()) { + if (!JavaToKotlinClassMap.INSTANCE.mapPlatformClass(DescriptorUtils.getFqNameSafe(descriptor)).isEmpty()) { return null; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt index f1e1ee5c098..810a0a2be5f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaAnnotationDescriptor.kt @@ -63,7 +63,7 @@ class LazyJavaAnnotationDescriptor( private val type = c.storageManager.createLazyValue {(): JetType -> val fqName = fqName() if (fqName == null) return@createLazyValue ErrorUtils.createErrorType("No fqName: $javaAnnotation") - val annotationClass = JavaToKotlinClassMap.getInstance().mapKotlinClass(fqName, TypeUsage.MEMBER_SIGNATURE_INVARIANT) + val annotationClass = JavaToKotlinClassMap.INSTANCE.mapKotlinClass(fqName, TypeUsage.MEMBER_SIGNATURE_INVARIANT) ?: javaAnnotation.resolve()?.let { javaClass -> c.moduleClassResolver.resolveClass(javaClass) } annotationClass?.getDefaultType() ?: ErrorUtils.createErrorType(fqName.asString()) } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt index 1d06c74867b..5360642c5a7 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt @@ -46,7 +46,7 @@ class LazyJavaTypeResolver( return when (javaType) { is JavaPrimitiveType -> { val canonicalText = javaType.getCanonicalText() - val jetType = JavaToKotlinClassMap.getInstance().mapPrimitiveKotlinClass(canonicalText) + val jetType = JavaToKotlinClassMap.INSTANCE.mapPrimitiveKotlinClass(canonicalText) assert(jetType != null, "Primitive type is not found: " + canonicalText) jetType!! } @@ -65,7 +65,7 @@ class LazyJavaTypeResolver( public fun transformArrayType(arrayType: JavaArrayType, attr: JavaTypeAttributes, isVararg: Boolean = false): JetType { val javaComponentType = arrayType.getComponentType() if (javaComponentType is JavaPrimitiveType) { - val jetType = JavaToKotlinClassMap.getInstance().mapPrimitiveKotlinClass("[" + javaComponentType.getCanonicalText()) + val jetType = JavaToKotlinClassMap.INSTANCE.mapPrimitiveKotlinClass("[" + javaComponentType.getCanonicalText()) if (jetType != null) { return if (PLATFORM_TYPES && attr.allowFlexible) FlexibleJavaClassifierTypeCapabilities.create(jetType, TypeUtils.makeNullable(jetType)) @@ -117,7 +117,7 @@ class LazyJavaTypeResolver( val fqName = classifier.getFqName() .sure("Class type should have a FQ name: " + classifier) - val javaToKotlinClassMap = JavaToKotlinClassMap.getInstance() + val javaToKotlinClassMap = JavaToKotlinClassMap.INSTANCE val howThisTypeIsUsedEffectively = when { attr.flexibility == FLEXIBLE_LOWER_BOUND -> MEMBER_SIGNATURE_COVARIANT attr.flexibility == FLEXIBLE_UPPER_BOUND -> MEMBER_SIGNATURE_CONTRAVARIANT diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java index 0ac0b6b54a2..986db04c493 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/mapping/JavaToKotlinClassMap.java @@ -33,15 +33,7 @@ import org.jetbrains.jet.lang.types.lang.PrimitiveType; import java.util.*; public class JavaToKotlinClassMap extends JavaToKotlinClassMapBuilder implements PlatformToKotlinClassMap { - private static JavaToKotlinClassMap instance = null; - - @NotNull - public static JavaToKotlinClassMap getInstance() { - if (instance == null) { - instance = new JavaToKotlinClassMap(); - } - return instance; - } + public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap(); private final Map classDescriptorMap = new HashMap(); private final Map classDescriptorMapForCovariantPositions = new HashMap(); diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt index e808cdb8bf5..f0953d771fd 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -482,7 +482,7 @@ fun Type.getClassDescriptor(project: Project): ClassDescriptor? { val jvmName = JvmClassName.byInternalName(getInternalName()).getFqNameForClassNameWithoutDollars() - val platformClasses = JavaToKotlinClassMap.getInstance().mapPlatformClass(jvmName) + val platformClasses = JavaToKotlinClassMap.INSTANCE.mapPlatformClass(jvmName) if (platformClasses.notEmpty) return platformClasses.first() return runReadAction { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Imports.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Imports.kt index cea8c79d2f0..5d72c5789ce 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Imports.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Imports.kt @@ -68,7 +68,7 @@ private fun Converter.filterImport(name: String, ref: PsiJavaCodeReferenceElemen if (name in annotationConverter.annotationsToRemove) return null // If imported class has a kotlin analog, drop the import - if (!JavaToKotlinClassMap.getInstance().mapPlatformClass(FqName(name)).isEmpty()) return null + if (!JavaToKotlinClassMap.INSTANCE.mapPlatformClass(FqName(name)).isEmpty()) return null val target = ref.resolve() if (target is KotlinLightClassForPackage) {