diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CollectionUtil.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CollectionUtil.kt deleted file mode 100644 index 6f32fca05ea..00000000000 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/CollectionUtil.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2000-2019 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.backend.common - -fun Collection.atMostOne(): T? { - return when (this.size) { - 0 -> null - 1 -> this.iterator().next() - else -> throw IllegalArgumentException("Collection has more than one element.") - } -} - -inline fun Iterable.atMostOne(predicate: (T) -> Boolean): T? = this.filter(predicate).atMostOne() \ No newline at end of file diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/SimpleMemberScope.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/SimpleMemberScope.kt index ca032bb8371..0248c11e0aa 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/SimpleMemberScope.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/SimpleMemberScope.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScopeImpl import org.jetbrains.kotlin.utils.Printer +import org.jetbrains.kotlin.utils.atMostOne class SimpleMemberScope(val members: List) : MemberScopeImpl() { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt index a240d4f8718..fc2e0646e2b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringConcatenationLowering.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt index 6a31f980f6f..f9cff3b4de8 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsCommonBackendContext.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js import org.jetbrains.kotlin.backend.common.BackendContext import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.InlineClassesUtils -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt index 988e7aaae44..0dce94637bd 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/AbstractSuspendFunctionsLowering.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.utils.memoryOptimizedMap import org.jetbrains.kotlin.utils.memoryOptimizedMapIndexed import org.jetbrains.kotlin.utils.memoryOptimizedPlus diff --git a/core/util.runtime/src/org/jetbrains/kotlin/utils/CollectionUtil.kt b/core/util.runtime/src/org/jetbrains/kotlin/utils/CollectionUtil.kt index d7aa7cb0052..725bf6ef321 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/utils/CollectionUtil.kt +++ b/core/util.runtime/src/org/jetbrains/kotlin/utils/CollectionUtil.kt @@ -47,3 +47,31 @@ inline fun > Iterable<*>.filte } return destination } + +/** + * Returns the single element of the collection if it contains at most one element. + * + * If the collection is empty, returns `null`. + * + * If the collection contains exactly one element, returns that element. + * + * If the collection contains more than one element, throws an exception. + */ +fun Collection.atMostOne(): T? { + return when (size) { + 0 -> null + 1 -> this.iterator().next() + else -> throw IllegalArgumentException("Collection has more than one element.") + } +} + +/** + * Returns at most one element from the iterable that satisfies the given predicate. + * + * If there are no elements that satisfy [predicate], returns `null`. + * + * If there is exactly one element that satisfies [predicate], returns that element. + * + * If there are more such elements, throws an exception. + */ +inline fun Iterable.atMostOne(predicate: (T) -> Boolean): T? = this.filter(predicate).atMostOne() diff --git a/core/util.runtime/src/org/jetbrains/kotlin/utils/MemoryOptimizedCollectionUtil.kt b/core/util.runtime/src/org/jetbrains/kotlin/utils/MemoryOptimizedCollectionUtil.kt index 96c342bf88e..b388116a040 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/utils/MemoryOptimizedCollectionUtil.kt +++ b/core/util.runtime/src/org/jetbrains/kotlin/utils/MemoryOptimizedCollectionUtil.kt @@ -104,12 +104,13 @@ infix fun Collection.memoryOptimizedZip(other: Collection): List Sequence.atMostOne(): T? { val iterator = iterator() @@ -143,4 +144,4 @@ inline fun Iterable<*>.findIsInstanceAnd(predicate: (T) -> Boolean): * The same as [Collection.toMutableList] extension function, but it returns a SmartList which is better with in sense of memory consumption * @see Collection.toMutableList */ -fun Collection.toSmartList(): List = SmartList(this) \ No newline at end of file +fun Collection.toSmartList(): List = SmartList(this) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt index 43ac2c63235..f6a8d0ab52d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DependenciesTracker.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.backend.konan -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.konan.descriptors.isInteropLibrary import org.jetbrains.kotlin.backend.konan.ir.isFromInteropLibrary import org.jetbrains.kotlin.backend.konan.llvm.FunctionOrigin diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt index 55815b01569..7fcc15ba645 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.backend.konan -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.konan.descriptors.findPackage import org.jetbrains.kotlin.backend.konan.ir.getSuperClassNotAny import org.jetbrains.kotlin.builtins.PrimitiveType diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt index 45dab643ff7..5d2a411271f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/DescriptorUtils.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.backend.konan.descriptors -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.ir.getSuperClassNotAny import org.jetbrains.kotlin.backend.konan.ir.getSuperInterfaces diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt index 3337c9d1bf3..cab5328adea 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/descriptors/LegacyDescriptorUtils.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.backend.konan.descriptors -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns import org.jetbrains.kotlin.descriptors.* diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt index b376c33e029..9e7d63c7e84 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.backend.konan.ir -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.konan.DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION import org.jetbrains.kotlin.backend.konan.descriptors.allOverriddenFunctions import org.jetbrains.kotlin.backend.konan.descriptors.isFromInteropLibrary diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt index 35bca24d361..2c88077dc34 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/Autoboxing.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.AbstractValueUsageTransformer import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.common.getOrPut import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.konan.* diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt index fbf116e2ab2..19004733462 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/BuiltinOperatorLowering.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.backend.konan.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.common.lower.IrBuildingTransformer import org.jetbrains.kotlin.backend.common.lower.at import org.jetbrains.kotlin.backend.common.lower.irNot diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt index 61137693745..7223f12e34d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.backend.konan.optimizations -import org.jetbrains.kotlin.backend.common.atMostOne +import org.jetbrains.kotlin.utils.atMostOne import org.jetbrains.kotlin.backend.common.peek import org.jetbrains.kotlin.backend.common.pop import org.jetbrains.kotlin.backend.common.push