From 21b438f55d2e95586b02359f5d4a68fbb363bc7d Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Wed, 6 Dec 2023 12:48:36 +0100 Subject: [PATCH] Replace the trove4j collections usages with the fastutil ones The trove4j library is licensed under LGPL, and that causes some troubles while working with it. The fastutil library provides the same functionality in the context of our needs, and is licensed under the Apache license. ^KTI-1135 In Progress --- analysis/light-classes-base/build.gradle.kts | 2 +- .../classes/KotlinClassInnerStuffCache.kt | 8 ++++---- compiler/cli/cli-base/build.gradle.kts | 2 +- .../cli/jvm/compiler/CliVirtualFileFinder.kt | 4 ++-- .../compiler/KotlinCliJavaFileManagerImpl.kt | 10 +++++----- .../cli/jvm/index/JvmDependenciesIndexImpl.kt | 4 ++-- compiler/daemon/build.gradle.kts | 2 +- .../kotlin/daemon/RemoteLookupTrackerClient.kt | 11 +++++------ compiler/frontend/build.gradle.kts | 2 +- .../kotlin/resolve/lazy/FileScopeFactory.kt | 4 ++-- .../kotlin/resolve/lazy/LazyImportScope.kt | 4 ++-- .../types/expressions/PreliminaryLoopVisitor.kt | 4 ++-- compiler/psi/build.gradle.kts | 2 +- .../psi/KotlinStringLiteralTextEscaper.kt | 8 ++++---- compiler/resolution.common.jvm/build.gradle.kts | 2 +- .../impl/classFiles/BinaryJavaClass.kt | 4 ++-- compiler/resolution/build.gradle.kts | 2 +- .../results/OverloadingConflictResolver.kt | 15 ++++++--------- compiler/tests-common/build.gradle.kts | 1 - .../kotlin/test/testFramework/Equality.kt | 10 ++++++++++ .../test/testFramework/KtUsefulTestCase.java | 14 +++++++++----- js/js.ast/build.gradle.kts | 2 +- .../js/backend/JsReservedIdentifiers.java | 4 ++-- .../js/backend/JsToStringGenerationVisitor.java | 4 ++-- js/js.sourcemap/build.gradle.kts | 2 +- .../kotlin/js/sourceMap/SourceMap3Builder.kt | 13 +++---------- .../kotlin/code/CodeConformanceTest.kt | 17 ----------------- 27 files changed, 71 insertions(+), 86 deletions(-) create mode 100644 compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/Equality.kt diff --git a/analysis/light-classes-base/build.gradle.kts b/analysis/light-classes-base/build.gradle.kts index f4f3fae5042..4849f5662a6 100644 --- a/analysis/light-classes-base/build.gradle.kts +++ b/analysis/light-classes-base/build.gradle.kts @@ -12,7 +12,7 @@ dependencies { api(project(":core:compiler.common.jvm")) implementation(project(":analysis:project-structure")) compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) } sourceSets { diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinClassInnerStuffCache.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinClassInnerStuffCache.kt index fa7d49e4ab9..bd4074f40d2 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinClassInnerStuffCache.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinClassInnerStuffCache.kt @@ -19,7 +19,7 @@ import com.intellij.psi.util.MethodSignatureBackedByPsiMethod import com.intellij.psi.util.PsiUtil import com.intellij.util.ArrayUtil import com.intellij.util.IncorrectOperationException -import gnu.trove.THashMap +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightParameter @@ -84,7 +84,7 @@ class KotlinClassInnerStuffCache( private val fieldByNameCache = cache { val fields = this.fields.takeIf { it.isNotEmpty() } ?: return@cache emptyMap() - Collections.unmodifiableMap(THashMap(fields.size).apply { + Collections.unmodifiableMap(Object2ObjectOpenHashMap(fields.size).apply { for (field in fields) { putIfAbsent(field.name, field) } @@ -101,7 +101,7 @@ class KotlinClassInnerStuffCache( private val methodByNameCache = cache { val methods = this.methods.takeIf { it.isNotEmpty() } ?: return@cache emptyMap() - Collections.unmodifiableMap(THashMap>().apply { + Collections.unmodifiableMap(Object2ObjectOpenHashMap>().apply { for ((key, list) in methods.groupByTo(HashMap()) { it.name }) { put(key, list.toTypedArray()) } @@ -119,7 +119,7 @@ class KotlinClassInnerStuffCache( private val innerClassByNameCache = cache { val classes = this.innerClasses.takeIf { it.isNotEmpty() } ?: return@cache emptyMap() - Collections.unmodifiableMap(THashMap().apply { + Collections.unmodifiableMap(Object2ObjectOpenHashMap().apply { for (psiClass in classes) { val name = psiClass.name if (name == null) { diff --git a/compiler/cli/cli-base/build.gradle.kts b/compiler/cli/cli-base/build.gradle.kts index 9355df98568..4d38211144e 100644 --- a/compiler/cli/cli-base/build.gradle.kts +++ b/compiler/cli/cli-base/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { compileOnly(toolsJarApi()) compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) compileOnly(commonDependency("org.jetbrains.intellij.deps:asm-all")) } diff --git a/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt b/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt index af5cb568ecd..056d87c3bf1 100644 --- a/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt +++ b/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.cli.jvm.compiler import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.GlobalSearchScope -import gnu.trove.THashSet +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import org.jetbrains.kotlin.cli.jvm.index.JavaRoot import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndex import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder @@ -51,7 +51,7 @@ class CliVirtualFileFinder( } override fun findMetadataTopLevelClassesInPackage(packageFqName: FqName): Set { - val result = THashSet() + val result = ObjectOpenHashSet() index.traverseDirectoriesInPackage(packageFqName, continueSearch = { dir, _ -> for (child in dir.children) { if (child.extension == MetadataPackageFragment.METADATA_FILE_EXTENSION) { diff --git a/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt b/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt index 8b2d66ea123..a53cdaa6ce1 100644 --- a/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt +++ b/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt @@ -23,8 +23,8 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.* import com.intellij.psi.impl.file.PsiPackageImpl import com.intellij.psi.search.GlobalSearchScope -import gnu.trove.THashMap -import gnu.trove.THashSet +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import org.jetbrains.kotlin.cli.jvm.index.JavaRoot import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndex import org.jetbrains.kotlin.cli.jvm.index.SingleJavaFileRootsIndex @@ -50,7 +50,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ private lateinit var index: JvmDependenciesIndex private lateinit var singleJavaFileRootsIndex: SingleJavaFileRootsIndex private lateinit var packagePartProviders: List - private val topLevelClassesCache: MutableMap = THashMap() + private val topLevelClassesCache: MutableMap = Object2ObjectOpenHashMap() private val allScope = GlobalSearchScope.allScope(myPsiManager.project) private var usePsiClassFilesReading = false @@ -96,7 +96,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ }?.takeIf { it in searchScope } } - private val binaryCache: MutableMap = THashMap() + private val binaryCache: MutableMap = Object2ObjectOpenHashMap() private val signatureParsingComponent = BinaryClassSignatureParser() fun findClass(classId: ClassId, searchScope: GlobalSearchScope) = findClass(JavaClassFinder.Request(classId), searchScope) @@ -263,7 +263,7 @@ class KotlinCliJavaFileManagerImpl(private val myPsiManager: PsiManager) : CoreJ } override fun knownClassNamesInPackage(packageFqName: FqName): Set { - val result = THashSet() + val result = ObjectOpenHashSet() index.traverseDirectoriesInPackage(packageFqName, continueSearch = { dir, _ -> for (child in dir.children) { if (child.extension == "class" || child.extension == "java" || child.extension == "sig") { diff --git a/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt b/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt index 745f29e6c9b..cec1ef87ed5 100644 --- a/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt +++ b/compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt @@ -9,7 +9,7 @@ import com.intellij.ide.highlighter.JavaClassFileType import com.intellij.ide.highlighter.JavaFileType import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile -import gnu.trove.THashMap +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import java.util.* @@ -58,7 +58,7 @@ class JvmDependenciesIndexImpl(_roots: List) : JvmDependenciesIndex { override val indexedRoots by lazy { roots.asSequence() } private val packageCache: Array> by lazy { - Array(roots.size) { THashMap() } + Array(roots.size) { Object2ObjectOpenHashMap() } } override fun traverseDirectoriesInPackage( diff --git a/compiler/daemon/build.gradle.kts b/compiler/daemon/build.gradle.kts index 21e0646e535..31bc604e55f 100644 --- a/compiler/daemon/build.gradle.kts +++ b/compiler/daemon/build.gradle.kts @@ -9,7 +9,7 @@ dependencies { compileOnly(project(":compiler:cli")) compileOnly(project(":compiler:incremental-compilation-impl")) compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) runtimeOnly(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false } diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt index 37c648af271..d9052d5e628 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt @@ -16,8 +16,8 @@ package org.jetbrains.kotlin.daemon -import gnu.trove.THashMap -import gnu.trove.THashSet +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import org.jetbrains.kotlin.daemon.common.DummyProfiler import org.jetbrains.kotlin.daemon.common.Profiler import org.jetbrains.kotlin.daemon.common.withMeasure @@ -35,7 +35,7 @@ class RemoteLookupTrackerClient( private val isDoNothing = profiler.withMeasure(this) { facade.lookupTracker_isDoNothing() } // Map: FileName -> (ScopeFqName -> Set) - private val lookups = THashMap>>() + private val lookups = Object2ObjectOpenHashMap>>() private val interner = createStringInterner() override val requiresPosition: Boolean = profiler.withMeasure(this) { facade.lookupTracker_requiresPosition() } @@ -51,8 +51,7 @@ class RemoteLookupTrackerClient( LookupInfo(filePath, position, scopeFqName, scopeKind, name) else internedName - - lookups.getOrPut(filePath, ::THashMap).getOrPut(internedSymbolFqName, ::THashSet).add(objectToPut) + lookups.getOrPut(filePath, ::Object2ObjectOpenHashMap).getOrPut(internedSymbolFqName, ::ObjectOpenHashSet).add(objectToPut) } override fun clear() { @@ -64,7 +63,7 @@ class RemoteLookupTrackerClient( } private fun flush() { - if (isDoNothing || lookups.isEmpty) return + if (isDoNothing || lookups.isEmpty()) return profiler.withMeasure(this) { facade.lookupTracker_record( diff --git a/compiler/frontend/build.gradle.kts b/compiler/frontend/build.gradle.kts index 9ba2433dabe..1e82e36b0c0 100644 --- a/compiler/frontend/build.gradle.kts +++ b/compiler/frontend/build.gradle.kts @@ -17,7 +17,7 @@ dependencies { api(project(":kotlin-script-runtime")) api(commonDependency("io.javaslang","javaslang")) compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) compileOnly(libs.guava) } 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 26f6c08f0f5..dac4fc31669 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.resolve.lazy -import gnu.trove.THashSet +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.incremental.components.LookupLocation @@ -257,7 +257,7 @@ class FileScopeFactory( parentScope: ImportingScope ): ImportingScope { val scope = packageView.memberScope - val names by lazy(LazyThreadSafetyMode.PUBLICATION) { scope.computeAllNames()?.let(::THashSet) } + val names by lazy(LazyThreadSafetyMode.PUBLICATION) { scope.computeAllNames()?.let(::ObjectOpenHashSet) } val packageName = packageView.fqName val excludedNames = aliasImportNames.mapNotNull { if (it.parent() == packageName) it.shortName() else null } 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 dea4bbdb93c..76189c91103 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.resolve.lazy import com.google.common.collect.HashMultimap import com.google.common.collect.ImmutableListMultimap import com.google.common.collect.ListMultimap -import gnu.trove.THashSet +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMapper import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings @@ -130,7 +130,7 @@ open class LazyImportResolver( } val allNames: Set? by components.storageManager.createNullableLazyValue { - indexedImports.imports.asIterable().flatMapToNullable(THashSet()) { getImportScope(it).computeImportedNames() } + indexedImports.imports.asIterable().flatMapToNullable(ObjectOpenHashSet()) { getImportScope(it).computeImportedNames() } } fun definitelyDoesNotContainName(name: Name): Boolean { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PreliminaryLoopVisitor.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PreliminaryLoopVisitor.kt index 0e3fce910de..835d9447395 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PreliminaryLoopVisitor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PreliminaryLoopVisitor.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.types.expressions -import gnu.trove.THashSet +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.psi.KtLoopExpression @@ -37,7 +37,7 @@ class PreliminaryLoopVisitor private constructor() : AssignedVariablesSearcher() languageVersionSettings: LanguageVersionSettings ): DataFlowInfo { var resultFlowInfo = dataFlowInfo - val nonTrivialValues = THashSet().apply { + val nonTrivialValues = ObjectOpenHashSet().apply { addAll(dataFlowInfo.completeNullabilityInfo.iterator().map { it._1 }) addAll(dataFlowInfo.completeTypeInfo.iterator().map { it._1 }) } diff --git a/compiler/psi/build.gradle.kts b/compiler/psi/build.gradle.kts index 0481ed22cd2..9dc7729370a 100644 --- a/compiler/psi/build.gradle.kts +++ b/compiler/psi/build.gradle.kts @@ -17,7 +17,7 @@ dependencies { compileOnly(intellijCore()) compileOnly(libs.guava) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) jflexPath(commonDependency("org.jetbrains.intellij.deps.jflex", "jflex")) } diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KotlinStringLiteralTextEscaper.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KotlinStringLiteralTextEscaper.kt index 771bb5a1de6..201e6ba01c6 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KotlinStringLiteralTextEscaper.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KotlinStringLiteralTextEscaper.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.psi import com.intellij.openapi.util.TextRange import com.intellij.psi.LiteralTextEscaper -import gnu.trove.TIntArrayList +import it.unimi.dsi.fastutil.ints.IntArrayList import org.jetbrains.kotlin.psi.psiUtil.getContentRange import org.jetbrains.kotlin.psi.psiUtil.isSingleQuoted import kotlin.math.min @@ -27,7 +27,7 @@ class KotlinStringLiteralTextEscaper(host: KtStringTemplateExpression) : Literal private var sourceOffsets: IntArray? = null override fun decode(rangeInsideHost: TextRange, outChars: StringBuilder): Boolean { - val sourceOffsetsList = TIntArrayList() + val sourceOffsetsList = IntArrayList() var sourceOffset = 0 for (child in myHost.entries) { @@ -44,7 +44,7 @@ class KotlinStringLiteralTextEscaper(host: KtStringTemplateExpression) : Literal //don't allow injection if its range starts or ends inside escaped sequence //but still process offsets for the already decoded part sourceOffsetsList.add(sourceOffset) - sourceOffsets = sourceOffsetsList.toNativeArray() + sourceOffsets = sourceOffsetsList.toIntArray() return false } val unescaped = child.unescapedValue @@ -64,7 +64,7 @@ class KotlinStringLiteralTextEscaper(host: KtStringTemplateExpression) : Literal } } sourceOffsetsList.add(sourceOffset) - sourceOffsets = sourceOffsetsList.toNativeArray() + sourceOffsets = sourceOffsetsList.toIntArray() return true } diff --git a/compiler/resolution.common.jvm/build.gradle.kts b/compiler/resolution.common.jvm/build.gradle.kts index 48722848892..d302f24c5dc 100644 --- a/compiler/resolution.common.jvm/build.gradle.kts +++ b/compiler/resolution.common.jvm/build.gradle.kts @@ -11,7 +11,7 @@ dependencies { implementation(commonDependency("io.javaslang","javaslang")) compileOnly(intellijCore()) compileOnly(commonDependency("org.jetbrains.intellij.deps:asm-all")) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) compileOnly(libs.guava) } diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt index 598651e8efa..02c1fd8c913 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.load.java.structure.impl.classFiles import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.SearchScope -import gnu.trove.THashMap +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass @@ -64,7 +64,7 @@ class BinaryJavaClass( // Short name of a nested class of this class -> access flags as seen in the InnerClasses attribute value. // Note that it doesn't include classes mentioned in other InnerClasses attribute values (those which are not nested in this class). - private val ownInnerClassNameToAccess: MutableMap = THashMap() + private val ownInnerClassNameToAccess: MutableMap = Object2ObjectOpenHashMap() override val innerClassNames get() = ownInnerClassNameToAccess.keys diff --git a/compiler/resolution/build.gradle.kts b/compiler/resolution/build.gradle.kts index f7709218475..18fe805f713 100644 --- a/compiler/resolution/build.gradle.kts +++ b/compiler/resolution/build.gradle.kts @@ -8,7 +8,7 @@ dependencies { api(project(":core:descriptors")) api(project(":compiler:resolution.common")) compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) } sourceSets { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt index c0d7a3114e2..ac4ec948271 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt @@ -16,8 +16,8 @@ package org.jetbrains.kotlin.resolve.calls.results -import gnu.trove.THashSet -import gnu.trove.TObjectHashingStrategy +import it.unimi.dsi.fastutil.Hash +import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.UnsignedTypes @@ -26,9 +26,7 @@ import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor import org.jetbrains.kotlin.resolve.DescriptorEquivalenceForOverrides import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode -import org.jetbrains.kotlin.resolve.descriptorUtil.getKotlinTypeRefiner import org.jetbrains.kotlin.resolve.descriptorUtil.isTypeRefinementEnabled -import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.varargParameterPosition import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -55,15 +53,14 @@ open class OverloadingConflictResolver( private val isTypeRefinementEnabled by lazy { module.isTypeRefinementEnabled() } - private val resolvedCallHashingStrategy = object : TObjectHashingStrategy { + private val resolvedCallHashingStrategy = object : Hash.Strategy { override fun equals(call1: C?, call2: C?): Boolean = if (call1 != null && call2 != null) call1.resultingDescriptor == call2.resultingDescriptor else call1 == call2 - override fun computeHashCode(call: C?): Int = - call?.resultingDescriptor?.hashCode() ?: 0 + override fun hashCode(call: C?): Int = call?.resultingDescriptor?.hashCode() ?: 0 } private val C.resultingDescriptor: CallableDescriptor get() = getResultingDescriptor(this) @@ -459,10 +456,10 @@ open class OverloadingConflictResolver( // Different smart casts may lead to the same candidate descriptor wrapped into different ResolvedCallImpl objects private fun uniquifyCandidatesSet(candidates: Collection): Set = - THashSet(candidates.size, resolvedCallHashingStrategy).apply { addAll(candidates) } + ObjectOpenCustomHashSet(candidates.size, resolvedCallHashingStrategy).apply { addAll(candidates) } private fun newResolvedCallSet(expectedSize: Int): MutableSet = - THashSet(expectedSize, resolvedCallHashingStrategy) + ObjectOpenCustomHashSet(expectedSize, resolvedCallHashingStrategy) private fun FlatSignature.candidateDescriptor() = origin.resultingDescriptor.original diff --git a/compiler/tests-common/build.gradle.kts b/compiler/tests-common/build.gradle.kts index a82b1bc9b58..cd3562964fd 100644 --- a/compiler/tests-common/build.gradle.kts +++ b/compiler/tests-common/build.gradle.kts @@ -77,7 +77,6 @@ dependencies { testApi(intellijJavaRt()) // for FileComparisonFailure testImplementation(libs.guava) - testImplementation(commonDependency("org.jetbrains.intellij.deps:trove4j")) testImplementation(commonDependency("org.jetbrains.intellij.deps:asm-all")) testImplementation(commonDependency("org.jetbrains.intellij.deps:log4j")) testImplementation(commonDependency("org.jetbrains.intellij.deps:jdom")) diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/Equality.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/Equality.kt new file mode 100644 index 00000000000..c5470b2befd --- /dev/null +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/Equality.kt @@ -0,0 +1,10 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test.testFramework + +fun interface Equality { + fun equals(o1: T, o2: T): Boolean +} \ No newline at end of file diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/KtUsefulTestCase.java b/compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/KtUsefulTestCase.java index 8d9398a2bc0..588bd5a9f06 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/KtUsefulTestCase.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/KtUsefulTestCase.java @@ -27,8 +27,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.PeekableIterator; import com.intellij.util.containers.PeekableIteratorWrapper; import com.intellij.util.lang.CompoundRuntimeException; -import gnu.trove.Equality; -import gnu.trove.THashSet; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import junit.framework.AssertionFailedError; import junit.framework.TestCase; import org.jetbrains.annotations.Contract; @@ -385,8 +384,8 @@ public abstract class KtUsefulTestCase extends TestCase { final StringBuilder builder = new StringBuilder(); for (final Object o : collection) { - if (o instanceof THashSet) { - builder.append(new TreeSet<>((THashSet)o)); + if (o instanceof ObjectOpenHashSet) { + builder.append(new TreeSet<>((ObjectOpenHashSet)o)); } else { builder.append(o); @@ -439,7 +438,12 @@ public abstract class KtUsefulTestCase extends TestCase { public static void assertOrderedEquals(@NotNull String errorMsg, @NotNull Iterable actual, @NotNull Iterable expected) { - assertOrderedEquals(errorMsg, actual, expected, Equality.CANONICAL); + assertOrderedEquals(errorMsg, actual, expected, new Equality() { + @Override + public boolean equals(T o1, T o2) { + return Objects.equals(o1, o2); + } + }); } public static void assertOrderedEquals(@NotNull String errorMsg, diff --git a/js/js.ast/build.gradle.kts b/js/js.ast/build.gradle.kts index b3b62f629cf..9246b004c30 100644 --- a/js/js.ast/build.gradle.kts +++ b/js/js.ast/build.gradle.kts @@ -6,7 +6,7 @@ plugins { dependencies { api(project(":core:descriptors")) compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) } sourceSets { diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsReservedIdentifiers.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsReservedIdentifiers.java index 0e138e4f0c1..31e8fe9bd99 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsReservedIdentifiers.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsReservedIdentifiers.java @@ -4,7 +4,7 @@ package org.jetbrains.kotlin.js.backend; -import gnu.trove.THashSet; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import java.util.Collections; import java.util.Set; @@ -142,7 +142,7 @@ public class JsReservedIdentifiers { "$stack", "$stackDepth", "$location", }; - reservedGlobalSymbols = new THashSet(commonBuiltins.length); + reservedGlobalSymbols = new ObjectOpenHashSet<>(commonBuiltins.length); Collections.addAll(reservedGlobalSymbols, commonBuiltins); } diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java index a0167fe3a22..1a93be799cc 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java @@ -4,6 +4,7 @@ package org.jetbrains.kotlin.js.backend; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import kotlin.text.StringsKt; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.js.backend.ast.*; @@ -12,7 +13,6 @@ import org.jetbrains.kotlin.js.backend.ast.JsIntLiteral; import org.jetbrains.kotlin.js.backend.ast.JsVars.JsVar; import org.jetbrains.kotlin.js.common.IdentifierPolicyKt; import org.jetbrains.kotlin.js.util.TextOutput; -import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -190,7 +190,7 @@ public class JsToStringGenerationVisitor extends JsVisitor { * because the statements designated by statementEnds and statementStarts are * those that appear directly within these global blocks. */ - private Set globalBlocks = new THashSet(); + private Set globalBlocks = new ObjectOpenHashSet<>(); @NotNull protected final TextOutput p; diff --git a/js/js.sourcemap/build.gradle.kts b/js/js.sourcemap/build.gradle.kts index bb6b52645e1..5c78766ab95 100644 --- a/js/js.sourcemap/build.gradle.kts +++ b/js/js.sourcemap/build.gradle.kts @@ -8,7 +8,7 @@ dependencies { compileOnly(project(":js:js.parser")) // TODO remove, required for JSON AST compileOnly(project(":js:js.frontend")) // TODO remove compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) } sourceSets { diff --git a/js/js.sourcemap/src/org/jetbrains/kotlin/js/sourceMap/SourceMap3Builder.kt b/js/js.sourcemap/src/org/jetbrains/kotlin/js/sourceMap/SourceMap3Builder.kt index a809e63f724..4978d976f53 100644 --- a/js/js.sourcemap/src/org/jetbrains/kotlin/js/sourceMap/SourceMap3Builder.kt +++ b/js/js.sourcemap/src/org/jetbrains/kotlin/js/sourceMap/SourceMap3Builder.kt @@ -4,7 +4,7 @@ */ package org.jetbrains.kotlin.js.sourceMap -import gnu.trove.TObjectIntHashMap +import com.intellij.util.containers.ObjectIntHashMap import org.jetbrains.kotlin.js.parser.sourcemaps.* import java.io.File import java.io.IOException @@ -17,13 +17,6 @@ class SourceMap3Builder( private val pathPrefix: String ) : SourceMapBuilder { - private class ObjectIntHashMap : TObjectIntHashMap() { - override fun get(key: T): Int { - val index = index(key) - return if (index < 0) -1 else _values[index] - } - } - private val out = StringBuilder(8192) private val sources = ObjectIntHashMap() @@ -98,7 +91,7 @@ class SourceMap3Builder( private fun getSourceIndex(source: String, fileIdentity: Any?, contentSupplier: Supplier): Int { val key = SourceKey(source, fileIdentity) - var sourceIndex = sources[key] + var sourceIndex = sources.get(key) if (sourceIndex == -1) { sourceIndex = orderedSources.size sources.put(key, sourceIndex) @@ -109,7 +102,7 @@ class SourceMap3Builder( } private fun getNameIndex(name: String): Int { - var nameIndex = names[name] + var nameIndex = names.get(name) if (nameIndex == -1) { nameIndex = orderedNames.size names.put(name, nameIndex) diff --git a/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt b/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt index a13727eac44..68f3665c1d6 100644 --- a/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt +++ b/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt @@ -216,23 +216,6 @@ class CodeConformanceTest : TestCase() { message = "%d source files contain references to package gnu.trove.\n" + "Please avoid using trove library in new use cases. " + "These files are affected:\n%s", - allowedFiles = listOf( - "analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinClassInnerStuffCache.kt", - "compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt", - "compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt", - "compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt", - "compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt", - "compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt", - "compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt", - "compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PreliminaryLoopVisitor.kt", - "compiler/psi/src/org/jetbrains/kotlin/psi/KotlinStringLiteralTextEscaper.kt", - "compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt", - "compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt", - "compiler/tests-common/tests/org/jetbrains/kotlin/test/testFramework/KtUsefulTestCase.java", - "js/js.ast/src/org/jetbrains/kotlin/js/backend/JsReservedIdentifiers.java", - "js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java", - "js/js.sourcemap/src/org/jetbrains/kotlin/js/sourceMap/SourceMap3Builder.kt", - ) ) { _, source -> "gnu.trove" in source }