From a0c9c0e7b264daddd64667f2f720f32a93f262b4 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 19 Nov 2014 22:33:24 +0300 Subject: [PATCH] Added firstOrNullIsInstance and firstIsInstance methods --- .../jetbrains/jet/lang/psi/TypeRefHelpers.kt | 4 +- .../jet/lang/resolve/TypeResolver.kt | 4 +- .../org/jetbrains/jet/utils/addToStdlib.kt | 37 +++++++++++++++++++ .../resolve/lazy/PartialBodyResolveFilter.kt | 3 +- .../jet/plugin/caches/JetShortNamesCache.kt | 4 +- .../plugin/completion/CompletionSession.kt | 1 + 6 files changed, 46 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/TypeRefHelpers.kt b/compiler/frontend/src/org/jetbrains/jet/lang/psi/TypeRefHelpers.kt index fc6e1698415..a826fe4681d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/TypeRefHelpers.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/TypeRefHelpers.kt @@ -24,12 +24,12 @@ import org.jetbrains.jet.lang.psi.JetPsiFactory import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiErrorElement import org.jetbrains.jet.lang.psi.JetCallableDeclaration +import org.jetbrains.jet.utils.addToStdlib.firstOrNullIsInstance fun getTypeReference(declaration: JetCallableDeclaration): JetTypeReference? { return declaration.getFirstChild()!!.siblings(forward = true) .dropWhile { it.getNode()!!.getElementType() != JetTokens.COLON } - .filterIsInstance(javaClass()) - .firstOrNull() + .firstOrNullIsInstance() } fun setTypeReference(declaration: JetCallableDeclaration, addAfter: PsiElement?, typeRef: JetTypeReference?): JetTypeReference? { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.kt index 6533b1c78d7..eb343a65b59 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.kt @@ -32,9 +32,9 @@ import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvi import kotlin.platform.platformStatic import org.jetbrains.jet.storage.StorageManager import org.jetbrains.jet.context.LazinessToken -import javax.inject.Inject import org.jetbrains.jet.lang.resolve.lazy.LazyEntity import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil +import org.jetbrains.jet.utils.addToStdlib.firstOrNullIsInstance public class TypeResolver( private val annotationResolver: AnnotationResolver, @@ -276,7 +276,7 @@ public class TypeResolver( public fun resolveClass(scope: JetScope, userType: JetUserType, trace: BindingTrace): ClassifierDescriptor? { val classifierDescriptor = qualifiedExpressionResolver.lookupDescriptorsForUserType(userType, scope, trace) - .filterIsInstance(javaClass()).firstOrNull() + .firstOrNullIsInstance() if (classifierDescriptor != null) { ImportsResolver.reportPlatformClassMappedToKotlin(moduleDescriptor, trace, userType, classifierDescriptor) } diff --git a/compiler/util/src/org/jetbrains/jet/utils/addToStdlib.kt b/compiler/util/src/org/jetbrains/jet/utils/addToStdlib.kt index ec8b08f1d99..d80dee86026 100644 --- a/compiler/util/src/org/jetbrains/jet/utils/addToStdlib.kt +++ b/compiler/util/src/org/jetbrains/jet/utils/addToStdlib.kt @@ -18,6 +18,7 @@ package org.jetbrains.jet.utils.addToStdlib import java.util.HashMap import java.util.Collections +import java.util.NoSuchElementException deprecated("Replace with filterKeys when bootstrapped") public fun Map.filterKeys_tmp(predicate: (K)->Boolean): Map { @@ -33,3 +34,39 @@ public fun Map.filterKeys_tmp(predicate: (K)->Boolean): Map { public fun T?.singletonOrEmptyList(): List = if (this != null) Collections.singletonList(this) else Collections.emptyList() public fun T?.singletonOrEmptySet(): Set = if (this != null) Collections.singleton(this) else Collections.emptySet() + +[suppress("NOTHING_TO_INLINE")] +public inline fun Stream<*>.firstOrNullIsInstance(): T? { + for (element in this) if (element is T) return element + return null +} + +[suppress("NOTHING_TO_INLINE")] +public inline fun Iterable<*>.firstOrNullIsInstance(): T? { + for (element in this) if (element is T) return element + return null +} + +[suppress("NOTHING_TO_INLINE")] +public inline fun Array<*>.firstOrNullIsInstance(): T? { + for (element in this) if (element is T) return element + return null +} + +[suppress("NOTHING_TO_INLINE")] +public inline fun Stream<*>.firstIsInstance(): T { + for (element in this) if (element is T) return element + throw NoSuchElementException("No element of given type found") +} + +[suppress("NOTHING_TO_INLINE")] +public inline fun Iterable<*>.firstIsInstance(): T { + for (element in this) if (element is T) return element + throw NoSuchElementException("No element of given type found") +} + +[suppress("NOTHING_TO_INLINE")] +public inline fun Array<*>.firstIsInstance(): T { + for (element in this) if (element is T) return element + throw NoSuchElementException("No element of given type found") +} \ No newline at end of file diff --git a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt index 70f9e7254ca..9d30f7ffd0b 100644 --- a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt +++ b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt @@ -27,6 +27,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.jet.JetNodeTypes import org.jetbrains.jet.lang.psi.psiUtil.isAncestor import org.jetbrains.jet.lang.psi.psiUtil.isProbablyNothing +import org.jetbrains.jet.utils.addToStdlib.firstOrNullIsInstance //TODO: do resolve anonymous object's body @@ -402,6 +403,6 @@ class PartialBodyResolveFilter( } private fun JetBlockExpression.lastStatement(): JetExpression? - = getLastChild()?.siblings(forward = false)?.filterIsInstance()?.firstOrNull() + = getLastChild()?.siblings(forward = false)?.firstOrNullIsInstance() } diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt index b6e148f50f8..1c60af0d779 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/JetShortNamesCache.kt @@ -21,14 +21,14 @@ import com.intellij.psi.PsiMethod import com.intellij.psi.PsiField import com.intellij.psi.PsiClass import org.jetbrains.jet.plugin.stubindex.PackageIndexUtil +import org.jetbrains.jet.utils.addToStdlib.firstIsInstance // used in Upsource, what's why in idea-analysis module public class JetShortNamesCache(private val project: com.intellij.openapi.project.Project) : com.intellij.psi.search.PsiShortNamesCache() { class object { public fun getKotlinInstance(project: com.intellij.openapi.project.Project): org.jetbrains.jet.plugin.caches.JetShortNamesCache = com.intellij.openapi.extensions.Extensions.getArea(project).getExtensionPoint(com.intellij.psi.search.PsiShortNamesCache.EP_NAME).getExtensions() - .filterIsInstance(javaClass()) - .first() + .firstIsInstance() } /** diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt index fe020c46516..34d63ed7ed5 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt @@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptorKi import org.jetbrains.jet.lang.resolve.scopes.DescriptorKindFilter import org.jetbrains.jet.lang.resolve.calls.smartcasts.SmartCastUtils import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.jet.utils.addToStdlib.firstOrNullIsInstance class CompletionSessionConfiguration( val completeNonImportedDeclarations: Boolean,