diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/InconsistentOperatorFromJavaCallChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/InconsistentOperatorFromJavaCallChecker.kt new file mode 100644 index 00000000000..3bfffae2039 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/InconsistentOperatorFromJavaCallChecker.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.resolve.jvm.checkers + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker +import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull +import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeUniqueAsSequence +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm +import org.jetbrains.kotlin.types.typeUtil.isAnyOrNullableAny +import org.jetbrains.kotlin.util.OperatorNameConventions + +/** + * This checker detects if call by operator convention to a Java method violates some expected contract: + * - "key in map" commonly resolves to an stdlib extension that calls Map.containsKey(), + * but there's a member in ConcurrentHashMap with acceptable signature that delegates to `containsValue` instead + */ +object InconsistentOperatorFromJavaCallChecker : CallChecker { + private val CONCURRENT_HASH_MAP_FQ_NAME = FqName("java.util.concurrent.ConcurrentHashMap") + + override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { + val candidateDescriptor = resolvedCall.candidateDescriptor + if (candidateDescriptor.name != OperatorNameConventions.CONTAINS) return + if (candidateDescriptor.valueParameters.singleOrNull()?.type?.isAnyOrNullableAny() != true) return + if (resolvedCall.call.callElement !is KtBinaryExpression || !resolvedCall.status.possibleTransformToSuccess()) return + + for (callableDescriptor in candidateDescriptor.overriddenTreeUniqueAsSequence(useOriginal = false)) { + val containingClass = callableDescriptor.containingDeclaration as? ClassDescriptor ?: continue + if (containingClass.fqNameOrNull() != CONCURRENT_HASH_MAP_FQ_NAME) continue + + val diagnosticFactory = + if (context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitConcurrentHashMapContains)) + ErrorsJvm.CONCURRENT_HASH_MAP_CONTAINS_OPERATOR_ERROR + else + ErrorsJvm.CONCURRENT_HASH_MAP_CONTAINS_OPERATOR + + context.trace.report(diagnosticFactory.on(reportOn)) + break + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index 6304c5d204e..4d05b24ff41 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -138,6 +138,13 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(EXPLICIT_METADATA_IS_DISALLOWED, "Explicit @Metadata is disallowed"); MAP.put(SUSPENSION_POINT_INSIDE_MONITOR, "A suspension point at {0} is inside a critical section", STRING); MAP.put(SUSPENSION_POINT_INSIDE_SYNCHRONIZED, "The ''{0}'' suspension point is inside a synchronized block", NAME); + + String MESSAGE_FOR_CONCURRENT_HASH_MAP_CONTAINS = + "Method 'contains' from ConcurrentHashMap may have unexpected semantics: it calls 'containsValue' instead of 'containsKey'. " + + "Use explicit form of the call to 'containsKey'/'containsValue'/'contains' or cast the value to kotlin.collections.Map instead. " + + "See https://youtrack.jetbrains.com/issue/KT-18053 for more details"; + MAP.put(CONCURRENT_HASH_MAP_CONTAINS_OPERATOR, MESSAGE_FOR_CONCURRENT_HASH_MAP_CONTAINS); + MAP.put(CONCURRENT_HASH_MAP_CONTAINS_OPERATOR_ERROR, MESSAGE_FOR_CONCURRENT_HASH_MAP_CONTAINS); } @NotNull diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index 37222fd58bc..8b50eb45909 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -125,6 +125,9 @@ public interface ErrorsJvm { DiagnosticFactory1 SUSPENSION_POINT_INSIDE_MONITOR = DiagnosticFactory1.create(ERROR); DiagnosticFactory1 SUSPENSION_POINT_INSIDE_SYNCHRONIZED = DiagnosticFactory1.create(ERROR); + DiagnosticFactory0 CONCURRENT_HASH_MAP_CONTAINS_OPERATOR = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 CONCURRENT_HASH_MAP_CONTAINS_OPERATOR_ERROR = DiagnosticFactory0.create(ERROR); + @SuppressWarnings("UnusedDeclaration") Object _initializer = new Object() { { 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 898c7fbaacc..b96e038c291 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 @@ -50,7 +50,8 @@ object JvmPlatformConfigurator : PlatformConfiguratorBase( ProtectedSyntheticExtensionCallChecker, ReifiedTypeParameterSubstitutionChecker(), RuntimeAssertionsOnExtensionReceiverCallChecker, - ApiVersionIsAtLeastArgumentsChecker + ApiVersionIsAtLeastArgumentsChecker, + InconsistentOperatorFromJavaCallChecker ), additionalTypeCheckers = listOf( diff --git a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt new file mode 100644 index 00000000000..69214b467ba --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt @@ -0,0 +1,78 @@ +// FULL_JDK + +class A : java.util.concurrent.ConcurrentHashMap() { + operator fun contains(x: Char): Boolean = true +} +class B : java.util.concurrent.ConcurrentHashMap() { + override fun contains(value: Any?): Boolean { + return super.contains(value) + } +} + +class C : java.util.concurrent.ConcurrentHashMap() { + operator override fun contains(value: Any?): Boolean { + return super.contains(value) + } +} + +fun main() { + val hm = java.util.concurrent.ConcurrentHashMap() + "" in hm + "" !in hm + 1 !in hm + 2 in hm + + hm.contains("") + hm.contains(1) + + "" in (hm as Map) + "" !in (hm as Map) + 1 in (hm as Map) + 1 !in (hm as Map) + + val a = A() + "" in a + "" !in a + 1 !in a + 2 in a + + ' ' in a + ' ' !in a + a.contains("") + a.contains(1) + + "" in (a as Map) + "" !in (a as Map) + 1 in (a as Map) + 1 !in (a as Map) + + val b = B() + "" in b + "" !in b + 1 !in b + 2 in b + + b.contains("") + b.contains(1) + + "" in (b as Map) + "" !in (b as Map) + 1 in (b as Map) + 1 !in (b as Map) + + // Actually, we could've allow calls here because the owner explicitly declared as operator, but semantics is still weird + val c = C() + "" in c + "" !in c + 1 !in c + 2 in c + + c.contains("") + c.contains(1) + + "" in (c as Map) + "" !in (c as Map) + 1 in (c as Map) + 1 !in (c as Map) +} + diff --git a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.txt b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.txt new file mode 100644 index 00000000000..0bb9bc22bb0 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.txt @@ -0,0 +1,274 @@ +package + +public fun main(): kotlin.Unit + +public final class A : java.util.concurrent.ConcurrentHashMap { + public constructor A() + invisible_fake final override /*1*/ /*fake_override*/ var baseCount: kotlin.Long + invisible_fake final override /*1*/ /*fake_override*/ var cellsBusy: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var counterCells: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.CounterCell!>! + public open override /*1*/ /*fake_override*/ val entries: kotlin.collections.MutableSet> + invisible_fake final override /*1*/ /*fake_override*/ var entrySet: java.util.concurrent.ConcurrentHashMap.EntrySetView! + invisible_fake final override /*1*/ /*fake_override*/ var keySet: java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ val keys: java.util.concurrent.ConcurrentHashMap.KeySetView + invisible_fake final override /*1*/ /*fake_override*/ var nextTable: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ val size: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var sizeCtl: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var table: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ var transferIndex: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var values: java.util.concurrent.ConcurrentHashMap.ValuesView! + public open override /*1*/ /*fake_override*/ val values: kotlin.collections.MutableCollection + invisible_fake final override /*1*/ /*fake_override*/ fun addCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun batchFor(/*0*/ p0: kotlin.Long): kotlin.Int + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any! + public open override /*1*/ /*fake_override*/ fun compute(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun computeIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.Function): kotlin.Int + public open override /*1*/ /*fake_override*/ fun computeIfPresent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun contains(/*0*/ p0: kotlin.Any!): kotlin.Boolean + public final operator fun contains(/*0*/ x: kotlin.Char): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.String): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun elements(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.BiConsumer): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiConsumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun fullAddCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun get(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun getOrDefault(/*0*/ key: kotlin.String, /*1*/ defaultValue: kotlin.Int): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun helpTransfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: java.util.concurrent.ConcurrentHashMap.Node!): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ fun initTable(): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun keySet(/*0*/ p0: kotlin.Int!): java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ fun keys(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun mappingCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun merge(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ from: kotlin.collections.Map): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun putIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + invisible_fake final override /*1*/ /*fake_override*/ fun putVal(/*0*/ p0: kotlin.String!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Boolean): kotlin.Int! + invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun reduce(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, kotlin.collections.(Mutable)Map.(Mutable)Entry!, out kotlin.collections.(Mutable)Map.(Mutable)Entry!>!): kotlin.collections.(Mutable)Map.(Mutable)Entry! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntriesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!>!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceEntriesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!>!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceEntriesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!>!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.String! + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceKeysToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceKeysToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceKeysToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleBiFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntBiFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongBiFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceValuesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceValuesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceValuesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.BiFunction): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun replaceNode(/*0*/ p0: kotlin.Any!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Any!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun search(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun searchEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!): U! + public open override /*1*/ /*fake_override*/ fun searchKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + public open override /*1*/ /*fake_override*/ fun searchValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + invisible_fake final override /*1*/ /*fake_override*/ fun sumCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + invisible_fake final override /*1*/ /*fake_override*/ fun transfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun treeifyBin(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun tryPresize(/*0*/ p0: kotlin.Int): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit +} + +public final class B : java.util.concurrent.ConcurrentHashMap { + public constructor B() + invisible_fake final override /*1*/ /*fake_override*/ var baseCount: kotlin.Long + invisible_fake final override /*1*/ /*fake_override*/ var cellsBusy: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var counterCells: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.CounterCell!>! + public open override /*1*/ /*fake_override*/ val entries: kotlin.collections.MutableSet> + invisible_fake final override /*1*/ /*fake_override*/ var entrySet: java.util.concurrent.ConcurrentHashMap.EntrySetView! + invisible_fake final override /*1*/ /*fake_override*/ var keySet: java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ val keys: java.util.concurrent.ConcurrentHashMap.KeySetView + invisible_fake final override /*1*/ /*fake_override*/ var nextTable: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ val size: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var sizeCtl: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var table: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ var transferIndex: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var values: java.util.concurrent.ConcurrentHashMap.ValuesView! + public open override /*1*/ /*fake_override*/ val values: kotlin.collections.MutableCollection + invisible_fake final override /*1*/ /*fake_override*/ fun addCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun batchFor(/*0*/ p0: kotlin.Long): kotlin.Int + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any! + public open override /*1*/ /*fake_override*/ fun compute(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun computeIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.Function): kotlin.Int + public open override /*1*/ /*fake_override*/ fun computeIfPresent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ fun contains(/*0*/ value: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.String): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun elements(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.BiConsumer): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiConsumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun fullAddCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun get(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun getOrDefault(/*0*/ key: kotlin.String, /*1*/ defaultValue: kotlin.Int): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun helpTransfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: java.util.concurrent.ConcurrentHashMap.Node!): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ fun initTable(): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun keySet(/*0*/ p0: kotlin.Int!): java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ fun keys(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun mappingCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun merge(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ from: kotlin.collections.Map): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun putIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + invisible_fake final override /*1*/ /*fake_override*/ fun putVal(/*0*/ p0: kotlin.String!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Boolean): kotlin.Int! + invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun reduce(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, kotlin.collections.(Mutable)Map.(Mutable)Entry!, out kotlin.collections.(Mutable)Map.(Mutable)Entry!>!): kotlin.collections.(Mutable)Map.(Mutable)Entry! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntriesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!>!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceEntriesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!>!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceEntriesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!>!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.String! + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceKeysToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceKeysToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceKeysToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleBiFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntBiFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongBiFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceValuesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceValuesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceValuesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.BiFunction): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun replaceNode(/*0*/ p0: kotlin.Any!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Any!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun search(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun searchEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!): U! + public open override /*1*/ /*fake_override*/ fun searchKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + public open override /*1*/ /*fake_override*/ fun searchValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + invisible_fake final override /*1*/ /*fake_override*/ fun sumCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + invisible_fake final override /*1*/ /*fake_override*/ fun transfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun treeifyBin(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun tryPresize(/*0*/ p0: kotlin.Int): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit +} + +public final class C : java.util.concurrent.ConcurrentHashMap { + public constructor C() + invisible_fake final override /*1*/ /*fake_override*/ var baseCount: kotlin.Long + invisible_fake final override /*1*/ /*fake_override*/ var cellsBusy: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var counterCells: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.CounterCell!>! + public open override /*1*/ /*fake_override*/ val entries: kotlin.collections.MutableSet> + invisible_fake final override /*1*/ /*fake_override*/ var entrySet: java.util.concurrent.ConcurrentHashMap.EntrySetView! + invisible_fake final override /*1*/ /*fake_override*/ var keySet: java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ val keys: java.util.concurrent.ConcurrentHashMap.KeySetView + invisible_fake final override /*1*/ /*fake_override*/ var nextTable: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ val size: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var sizeCtl: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var table: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ var transferIndex: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var values: java.util.concurrent.ConcurrentHashMap.ValuesView! + public open override /*1*/ /*fake_override*/ val values: kotlin.collections.MutableCollection + invisible_fake final override /*1*/ /*fake_override*/ fun addCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun batchFor(/*0*/ p0: kotlin.Long): kotlin.Int + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any! + public open override /*1*/ /*fake_override*/ fun compute(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun computeIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.Function): kotlin.Int + public open override /*1*/ /*fake_override*/ fun computeIfPresent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ fun contains(/*0*/ value: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.String): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun elements(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.BiConsumer): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiConsumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun fullAddCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun get(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun getOrDefault(/*0*/ key: kotlin.String, /*1*/ defaultValue: kotlin.Int): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun helpTransfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: java.util.concurrent.ConcurrentHashMap.Node!): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ fun initTable(): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun keySet(/*0*/ p0: kotlin.Int!): java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ fun keys(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun mappingCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun merge(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ from: kotlin.collections.Map): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun putIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + invisible_fake final override /*1*/ /*fake_override*/ fun putVal(/*0*/ p0: kotlin.String!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Boolean): kotlin.Int! + invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun reduce(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, kotlin.collections.(Mutable)Map.(Mutable)Entry!, out kotlin.collections.(Mutable)Map.(Mutable)Entry!>!): kotlin.collections.(Mutable)Map.(Mutable)Entry! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntriesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!>!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceEntriesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!>!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceEntriesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!>!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.String! + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceKeysToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceKeysToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceKeysToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleBiFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntBiFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongBiFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceValuesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceValuesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceValuesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.BiFunction): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun replaceNode(/*0*/ p0: kotlin.Any!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Any!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun search(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun searchEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!): U! + public open override /*1*/ /*fake_override*/ fun searchKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + public open override /*1*/ /*fake_override*/ fun searchValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + invisible_fake final override /*1*/ /*fake_override*/ fun sumCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + invisible_fake final override /*1*/ /*fake_override*/ fun transfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun treeifyBin(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun tryPresize(/*0*/ p0: kotlin.Int): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt new file mode 100644 index 00000000000..21e60701ba6 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt @@ -0,0 +1,79 @@ +// !LANGUAGE: +ProhibitConcurrentHashMapContains +// FULL_JDK + +class A : java.util.concurrent.ConcurrentHashMap() { + operator fun contains(x: Char): Boolean = true +} +class B : java.util.concurrent.ConcurrentHashMap() { + override fun contains(value: Any?): Boolean { + return super.contains(value) + } +} + +class C : java.util.concurrent.ConcurrentHashMap() { + operator override fun contains(value: Any?): Boolean { + return super.contains(value) + } +} + +fun main() { + val hm = java.util.concurrent.ConcurrentHashMap() + "" in hm + "" !in hm + 1 !in hm + 2 in hm + + hm.contains("") + hm.contains(1) + + "" in (hm as Map) + "" !in (hm as Map) + 1 in (hm as Map) + 1 !in (hm as Map) + + val a = A() + "" in a + "" !in a + 1 !in a + 2 in a + + ' ' in a + ' ' !in a + a.contains("") + a.contains(1) + + "" in (a as Map) + "" !in (a as Map) + 1 in (a as Map) + 1 !in (a as Map) + + val b = B() + "" in b + "" !in b + 1 !in b + 2 in b + + b.contains("") + b.contains(1) + + "" in (b as Map) + "" !in (b as Map) + 1 in (b as Map) + 1 !in (b as Map) + + // Actually, we could've allow calls here because the owner explicitly declared as operator, but semantics is still weird + val c = C() + "" in c + "" !in c + 1 !in c + 2 in c + + c.contains("") + c.contains(1) + + "" in (c as Map) + "" !in (c as Map) + 1 in (c as Map) + 1 !in (c as Map) +} + diff --git a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.txt b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.txt new file mode 100644 index 00000000000..0bb9bc22bb0 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.txt @@ -0,0 +1,274 @@ +package + +public fun main(): kotlin.Unit + +public final class A : java.util.concurrent.ConcurrentHashMap { + public constructor A() + invisible_fake final override /*1*/ /*fake_override*/ var baseCount: kotlin.Long + invisible_fake final override /*1*/ /*fake_override*/ var cellsBusy: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var counterCells: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.CounterCell!>! + public open override /*1*/ /*fake_override*/ val entries: kotlin.collections.MutableSet> + invisible_fake final override /*1*/ /*fake_override*/ var entrySet: java.util.concurrent.ConcurrentHashMap.EntrySetView! + invisible_fake final override /*1*/ /*fake_override*/ var keySet: java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ val keys: java.util.concurrent.ConcurrentHashMap.KeySetView + invisible_fake final override /*1*/ /*fake_override*/ var nextTable: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ val size: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var sizeCtl: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var table: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ var transferIndex: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var values: java.util.concurrent.ConcurrentHashMap.ValuesView! + public open override /*1*/ /*fake_override*/ val values: kotlin.collections.MutableCollection + invisible_fake final override /*1*/ /*fake_override*/ fun addCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun batchFor(/*0*/ p0: kotlin.Long): kotlin.Int + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any! + public open override /*1*/ /*fake_override*/ fun compute(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun computeIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.Function): kotlin.Int + public open override /*1*/ /*fake_override*/ fun computeIfPresent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun contains(/*0*/ p0: kotlin.Any!): kotlin.Boolean + public final operator fun contains(/*0*/ x: kotlin.Char): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.String): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun elements(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.BiConsumer): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiConsumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun fullAddCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun get(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun getOrDefault(/*0*/ key: kotlin.String, /*1*/ defaultValue: kotlin.Int): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun helpTransfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: java.util.concurrent.ConcurrentHashMap.Node!): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ fun initTable(): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun keySet(/*0*/ p0: kotlin.Int!): java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ fun keys(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun mappingCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun merge(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ from: kotlin.collections.Map): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun putIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + invisible_fake final override /*1*/ /*fake_override*/ fun putVal(/*0*/ p0: kotlin.String!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Boolean): kotlin.Int! + invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun reduce(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, kotlin.collections.(Mutable)Map.(Mutable)Entry!, out kotlin.collections.(Mutable)Map.(Mutable)Entry!>!): kotlin.collections.(Mutable)Map.(Mutable)Entry! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntriesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!>!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceEntriesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!>!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceEntriesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!>!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.String! + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceKeysToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceKeysToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceKeysToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleBiFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntBiFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongBiFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceValuesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceValuesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceValuesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.BiFunction): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun replaceNode(/*0*/ p0: kotlin.Any!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Any!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun search(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun searchEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!): U! + public open override /*1*/ /*fake_override*/ fun searchKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + public open override /*1*/ /*fake_override*/ fun searchValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + invisible_fake final override /*1*/ /*fake_override*/ fun sumCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + invisible_fake final override /*1*/ /*fake_override*/ fun transfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun treeifyBin(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun tryPresize(/*0*/ p0: kotlin.Int): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit +} + +public final class B : java.util.concurrent.ConcurrentHashMap { + public constructor B() + invisible_fake final override /*1*/ /*fake_override*/ var baseCount: kotlin.Long + invisible_fake final override /*1*/ /*fake_override*/ var cellsBusy: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var counterCells: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.CounterCell!>! + public open override /*1*/ /*fake_override*/ val entries: kotlin.collections.MutableSet> + invisible_fake final override /*1*/ /*fake_override*/ var entrySet: java.util.concurrent.ConcurrentHashMap.EntrySetView! + invisible_fake final override /*1*/ /*fake_override*/ var keySet: java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ val keys: java.util.concurrent.ConcurrentHashMap.KeySetView + invisible_fake final override /*1*/ /*fake_override*/ var nextTable: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ val size: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var sizeCtl: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var table: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ var transferIndex: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var values: java.util.concurrent.ConcurrentHashMap.ValuesView! + public open override /*1*/ /*fake_override*/ val values: kotlin.collections.MutableCollection + invisible_fake final override /*1*/ /*fake_override*/ fun addCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun batchFor(/*0*/ p0: kotlin.Long): kotlin.Int + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any! + public open override /*1*/ /*fake_override*/ fun compute(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun computeIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.Function): kotlin.Int + public open override /*1*/ /*fake_override*/ fun computeIfPresent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ fun contains(/*0*/ value: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.String): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun elements(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.BiConsumer): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiConsumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun fullAddCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun get(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun getOrDefault(/*0*/ key: kotlin.String, /*1*/ defaultValue: kotlin.Int): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun helpTransfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: java.util.concurrent.ConcurrentHashMap.Node!): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ fun initTable(): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun keySet(/*0*/ p0: kotlin.Int!): java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ fun keys(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun mappingCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun merge(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ from: kotlin.collections.Map): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun putIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + invisible_fake final override /*1*/ /*fake_override*/ fun putVal(/*0*/ p0: kotlin.String!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Boolean): kotlin.Int! + invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun reduce(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, kotlin.collections.(Mutable)Map.(Mutable)Entry!, out kotlin.collections.(Mutable)Map.(Mutable)Entry!>!): kotlin.collections.(Mutable)Map.(Mutable)Entry! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntriesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!>!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceEntriesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!>!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceEntriesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!>!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.String! + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceKeysToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceKeysToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceKeysToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleBiFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntBiFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongBiFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceValuesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceValuesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceValuesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.BiFunction): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun replaceNode(/*0*/ p0: kotlin.Any!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Any!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun search(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun searchEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!): U! + public open override /*1*/ /*fake_override*/ fun searchKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + public open override /*1*/ /*fake_override*/ fun searchValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + invisible_fake final override /*1*/ /*fake_override*/ fun sumCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + invisible_fake final override /*1*/ /*fake_override*/ fun transfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun treeifyBin(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun tryPresize(/*0*/ p0: kotlin.Int): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit +} + +public final class C : java.util.concurrent.ConcurrentHashMap { + public constructor C() + invisible_fake final override /*1*/ /*fake_override*/ var baseCount: kotlin.Long + invisible_fake final override /*1*/ /*fake_override*/ var cellsBusy: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var counterCells: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.CounterCell!>! + public open override /*1*/ /*fake_override*/ val entries: kotlin.collections.MutableSet> + invisible_fake final override /*1*/ /*fake_override*/ var entrySet: java.util.concurrent.ConcurrentHashMap.EntrySetView! + invisible_fake final override /*1*/ /*fake_override*/ var keySet: java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ val keys: java.util.concurrent.ConcurrentHashMap.KeySetView + invisible_fake final override /*1*/ /*fake_override*/ var nextTable: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ val size: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var sizeCtl: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var table: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ var transferIndex: kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ var values: java.util.concurrent.ConcurrentHashMap.ValuesView! + public open override /*1*/ /*fake_override*/ val values: kotlin.collections.MutableCollection + invisible_fake final override /*1*/ /*fake_override*/ fun addCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun batchFor(/*0*/ p0: kotlin.Long): kotlin.Int + public open override /*1*/ /*fake_override*/ fun clear(): kotlin.Unit + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any! + public open override /*1*/ /*fake_override*/ fun compute(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun computeIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.Function): kotlin.Int + public open override /*1*/ /*fake_override*/ fun computeIfPresent(/*0*/ p0: kotlin.String, /*1*/ p1: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ fun contains(/*0*/ value: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsKey(/*0*/ key: kotlin.String): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun containsValue(/*0*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun elements(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: java.util.function.BiConsumer): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiConsumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEach(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachEntry(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachKey(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Consumer!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun forEachValue(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.Consumer!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun fullAddCount(/*0*/ p0: kotlin.Long, /*1*/ p1: kotlin.Boolean): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun get(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun getOrDefault(/*0*/ key: kotlin.String, /*1*/ defaultValue: kotlin.Int): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun helpTransfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: java.util.concurrent.ConcurrentHashMap.Node!): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + invisible_fake final override /*1*/ /*fake_override*/ fun initTable(): kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>! + public open override /*1*/ /*fake_override*/ fun isEmpty(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun keySet(/*0*/ p0: kotlin.Int!): java.util.concurrent.ConcurrentHashMap.KeySetView! + public open override /*1*/ /*fake_override*/ fun keys(): java.util.Enumeration! + public open override /*1*/ /*fake_override*/ fun mappingCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun merge(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: java.util.function.BiFunction): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun put(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun putAll(/*0*/ from: kotlin.collections.Map): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun putIfAbsent(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + invisible_fake final override /*1*/ /*fake_override*/ fun putVal(/*0*/ p0: kotlin.String!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Boolean): kotlin.Int! + invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun reduce(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!, kotlin.collections.(Mutable)Map.(Mutable)Entry!, out kotlin.collections.(Mutable)Map.(Mutable)Entry!>!): kotlin.collections.(Mutable)Map.(Mutable)Entry! + public open override /*1*/ /*fake_override*/ fun reduceEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceEntriesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!>!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceEntriesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!>!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceEntriesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!>!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.String! + public open override /*1*/ /*fake_override*/ fun reduceKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceKeysToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceKeysToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceKeysToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleBiFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntBiFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongBiFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun reduceValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, /*2*/ p2: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun reduceValuesToDouble(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToDoubleFunction!, /*2*/ p2: kotlin.Double, /*3*/ p3: java.util.function.DoubleBinaryOperator!): kotlin.Double + public open override /*1*/ /*fake_override*/ fun reduceValuesToInt(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToIntFunction!, /*2*/ p2: kotlin.Int, /*3*/ p3: java.util.function.IntBinaryOperator!): kotlin.Int + public open override /*1*/ /*fake_override*/ fun reduceValuesToLong(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.ToLongFunction!, /*2*/ p2: kotlin.Long, /*3*/ p3: java.util.function.LongBinaryOperator!): kotlin.Long + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun remove(/*0*/ key: kotlin.String, /*1*/ value: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int): kotlin.Int? + public open override /*1*/ /*fake_override*/ fun replace(/*0*/ p0: kotlin.String, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun replaceAll(/*0*/ p0: java.util.function.BiFunction): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun replaceNode(/*0*/ p0: kotlin.Any!, /*1*/ p1: kotlin.Int!, /*2*/ p2: kotlin.Any!): kotlin.Int! + public open override /*1*/ /*fake_override*/ fun search(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.BiFunction!): U! + public open override /*1*/ /*fake_override*/ fun searchEntries(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!, out U!>!): U! + public open override /*1*/ /*fake_override*/ fun searchKeys(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + public open override /*1*/ /*fake_override*/ fun searchValues(/*0*/ p0: kotlin.Long, /*1*/ p1: java.util.function.Function!): U! + invisible_fake final override /*1*/ /*fake_override*/ fun sumCount(): kotlin.Long + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + invisible_fake final override /*1*/ /*fake_override*/ fun transfer(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun treeifyBin(/*0*/ p0: kotlin.Array<(out) java.util.concurrent.ConcurrentHashMap.Node!>!, /*1*/ p1: kotlin.Int): kotlin.Unit + invisible_fake final override /*1*/ /*fake_override*/ fun tryPresize(/*0*/ p0: kotlin.Int): kotlin.Unit + invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream!): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 0be80022dfe..bb0d0611dc8 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -2705,6 +2705,16 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/java"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("concurrentHashMapContains.kt") + public void testConcurrentHashMapContains() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt"); + } + + @TestMetadata("concurrentHashMapContainsError.kt") + public void testConcurrentHashMapContainsError() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt"); + } + @TestMetadata("functionN.kt") public void testFunctionN() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/java/functionN.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index 836e8c1930c..2f4f7d582c8 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -2705,6 +2705,16 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/java"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("concurrentHashMapContains.kt") + public void testConcurrentHashMapContains() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt"); + } + + @TestMetadata("concurrentHashMapContainsError.kt") + public void testConcurrentHashMapContainsError() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt"); + } + @TestMetadata("functionN.kt") public void testFunctionN() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/java/functionN.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index f749257257c..d6f2af6ac57 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -93,6 +93,7 @@ enum class LanguageFeature( NoConstantValueAttributeForNonConstVals(KOTLIN_1_4, kind = BUG_FIX), WarningOnMainUnusedParameter(KOTLIN_1_4), PolymorphicSignature(KOTLIN_1_4), + ProhibitConcurrentHashMapContains(KOTLIN_1_4, kind = BUG_FIX), ProperVisibilityForCompanionObjectInstanceField(sinceVersion = null, kind = BUG_FIX), // Temporarily disabled, see KT-27084/KT-22379 diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java index cb62b3d0a5d..312a9b4b330 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java @@ -35,6 +35,8 @@ import static org.jetbrains.kotlin.idea.highlighter.IdeRenderers.*; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.ACCIDENTAL_OVERRIDE; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.CONFLICTING_JVM_DECLARATIONS; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS; +import static org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.CONCURRENT_HASH_MAP_CONTAINS_OPERATOR; +import static org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.CONCURRENT_HASH_MAP_CONTAINS_OPERATOR_ERROR; /** @@ -187,6 +189,13 @@ public class IdeErrorMessages { MAP.put(NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS, "Actual class ''{0}'' has no corresponding members for expected class members:{1}", NAME, new IncompatibleExpectedActualClassScopesRenderer(IdeMultiplatformDiagnosticRenderingMode.INSTANCE)); + String MESSAGE_FOR_CONCURRENT_HASH_MAP_CONTAINS = + "Method 'contains' from ConcurrentHashMap may have unexpected semantics: it calls 'containsValue' instead of 'containsKey'.
" + + "Use explicit form of the call to 'containsKey'/'containsValue'/'contains' or cast the value to kotlin.collections.Map instead.
" + + "See https://youtrack.jetbrains.com/issue/KT-18053 for more details"; + MAP.put(CONCURRENT_HASH_MAP_CONTAINS_OPERATOR, MESSAGE_FOR_CONCURRENT_HASH_MAP_CONTAINS); + MAP.put(CONCURRENT_HASH_MAP_CONTAINS_OPERATOR_ERROR, MESSAGE_FOR_CONCURRENT_HASH_MAP_CONTAINS); + MAP.setImmutable(); }