Extensions PsiElement.getParentOfType with reified T

1. Renamed *ByType -> *OfType (as in PsiTreeUtil.java)
2. Introduced PsiElement.getStrictParentOfType and PsiElement.getNonStrictParentOfType
with reified TP
3. Replaced current usages of PsiTreeUtil.getParentOfType and current
extensions
4. Made reified version of PsiElement.getParentOfTypeAndBranch with
default strict value --- false (as it used)
This commit is contained in:
Denis Zharkov
2014-12-01 10:58:42 +03:00
parent 8b80daa2a1
commit b3bf8933df
53 changed files with 204 additions and 176 deletions
@@ -32,8 +32,8 @@ import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument
import org.jetbrains.jet.JetNodeTypes import org.jetbrains.jet.JetNodeTypes
import java.math.BigInteger import java.math.BigInteger
import org.jetbrains.jet.lang.diagnostics.Errors import org.jetbrains.jet.lang.diagnostics.Errors
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.resolve.calls.callUtil.getResolvedCall import org.jetbrains.jet.lang.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class ConstantExpressionEvaluator private (val trace: BindingTrace) : JetVisitor<CompileTimeConstant<*>, JetType>() { public class ConstantExpressionEvaluator private (val trace: BindingTrace) : JetVisitor<CompileTimeConstant<*>, JetType>() {
@@ -257,7 +257,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
assert (name == "minus", "Only negation should be checked for overflow") assert (name == "minus", "Only negation should be checked for overflow")
if (receiver.value == result) { if (receiver.value == result) {
trace.report(Errors.INTEGER_OVERFLOW.on(PsiTreeUtil.getParentOfType(callExpression, javaClass<JetExpression>()) ?: callExpression)) trace.report(Errors.INTEGER_OVERFLOW.on(callExpression.getStrictParentOfType<JetExpression>() ?: callExpression))
} }
return result return result
} }
@@ -282,7 +282,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
val resultInBigIntegers = checker(toBigInteger(receiver.value), toBigInteger(parameter.value)) val resultInBigIntegers = checker(toBigInteger(receiver.value), toBigInteger(parameter.value))
if (toBigInteger(actualResult) != resultInBigIntegers) { if (toBigInteger(actualResult) != resultInBigIntegers) {
trace.report(Errors.INTEGER_OVERFLOW.on(PsiTreeUtil.getParentOfType(callExpression, javaClass<JetExpression>()) ?: callExpression)) trace.report(Errors.INTEGER_OVERFLOW.on(callExpression.getStrictParentOfType<JetExpression>() ?: callExpression))
} }
return actualResult return actualResult
} }
@@ -50,7 +50,7 @@ public fun JetCallElement.getCallNameExpression(): JetSimpleNameExpression? {
} }
} }
public fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>( public fun PsiElement.getParentOfTypesAndPredicate<T: PsiElement>(
strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean strict : Boolean = false, vararg parentClasses : Class<T>, predicate: (T) -> Boolean
) : T? { ) : T? {
var element = if (strict) getParent() else this var element = if (strict) getParent() else this
@@ -69,8 +69,20 @@ public fun PsiElement.getParentByTypesAndPredicate<T: PsiElement>(
return null return null
} }
public fun PsiElement.getParentByType<T: PsiElement>(parentClass : Class<T>, strict : Boolean = false) : T? { public fun PsiElement.getNonStrictParentOfType<T: PsiElement>(parentClass : Class<T>) : T? {
return PsiTreeUtil.getParentOfType(this, parentClass, strict) return PsiTreeUtil.getParentOfType(this, parentClass, false)
}
inline public fun PsiElement.getParentOfType<reified T: PsiElement>(strict: Boolean): T? {
return PsiTreeUtil.getParentOfType(this, javaClass<T>(), strict)
}
inline public fun PsiElement.getStrictParentOfType<reified T: PsiElement>(): T? {
return PsiTreeUtil.getParentOfType(this, javaClass<T>(), true)
}
inline public fun PsiElement.getNonStrictParentOfType<reified T: PsiElement>(): T? {
return PsiTreeUtil.getParentOfType(this, javaClass<T>(), false)
} }
public fun PsiElement?.isAncestor(element: PsiElement, strict: Boolean = false): Boolean { public fun PsiElement?.isAncestor(element: PsiElement, strict: Boolean = false): Boolean {
@@ -81,9 +93,8 @@ public fun <T: PsiElement> T.getIfChildIsInBranch(element: PsiElement, branch: T
return if (branch().isAncestor(element)) this else null return if (branch().isAncestor(element)) this else null
} }
public fun PsiElement.getParentByTypeAndBranch<T: PsiElement>( inline public fun PsiElement.getParentOfTypeAndBranch<reified T: PsiElement>(strict: Boolean = false, noinline branch: T.() -> PsiElement?) : T? {
parentClass : Class<T>, strict : Boolean = false, branch: T.() -> PsiElement?) : T? { return getParentOfType<T>(strict)?.getIfChildIsInBranch(this, branch)
return getParentByType(parentClass, strict)?.getIfChildIsInBranch(this, branch)
} }
public fun JetClassOrObject.effectiveDeclarations(): List<JetDeclaration> = public fun JetClassOrObject.effectiveDeclarations(): List<JetDeclaration> =
@@ -192,7 +203,7 @@ public fun JetDeclaration.isOverridable(): Boolean {
public fun PsiElement.isExtensionDeclaration(): Boolean { public fun PsiElement.isExtensionDeclaration(): Boolean {
val callable: JetCallableDeclaration? = when (this) { val callable: JetCallableDeclaration? = when (this) {
is JetNamedFunction, is JetProperty -> this as JetCallableDeclaration is JetNamedFunction, is JetProperty -> this as JetCallableDeclaration
is JetPropertyAccessor -> getParentByType(javaClass<JetProperty>()) is JetPropertyAccessor -> getNonStrictParentOfType<JetProperty>()
else -> null else -> null
} }
@@ -22,7 +22,7 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.jet.lang.resolve.BindingContext.LABEL_TARGET import org.jetbrains.jet.lang.resolve.BindingContext.LABEL_TARGET
import org.jetbrains.jet.lang.resolve.BindingContext.FUNCTION import org.jetbrains.jet.lang.resolve.BindingContext.FUNCTION
import org.jetbrains.jet.lang.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR import org.jetbrains.jet.lang.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
import org.jetbrains.jet.lang.resolve.DescriptorUtils import org.jetbrains.jet.lang.resolve.DescriptorUtils
import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor
@@ -34,7 +34,7 @@ public fun JetReturnExpression.getTargetFunctionDescriptor(context: BindingConte
val targetLabel = getTargetLabel() val targetLabel = getTargetLabel()
if (targetLabel != null) return context[LABEL_TARGET, targetLabel]?.let { context[FUNCTION, it] } if (targetLabel != null) return context[LABEL_TARGET, targetLabel]?.let { context[FUNCTION, it] }
val declarationDescriptor = context[DECLARATION_TO_DESCRIPTOR, getParentByType(javaClass<JetDeclarationWithBody>())] val declarationDescriptor = context[DECLARATION_TO_DESCRIPTOR, getNonStrictParentOfType<JetDeclarationWithBody>()]
val containingFunctionDescriptor = DescriptorUtils.getParentOfType(declarationDescriptor, javaClass<FunctionDescriptor>(), false) val containingFunctionDescriptor = DescriptorUtils.getParentOfType(declarationDescriptor, javaClass<FunctionDescriptor>(), false)
if (containingFunctionDescriptor == null) return null if (containingFunctionDescriptor == null) return null
@@ -26,7 +26,7 @@ import com.intellij.psi.util.PsiModificationTracker
import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValue
import org.jetbrains.jet.lang.psi.JetPropertyAccessor import org.jetbrains.jet.lang.psi.JetPropertyAccessor
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetProperty import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.psi.JetClassOrObject import org.jetbrains.jet.lang.psi.JetClassOrObject
import com.intellij.psi.impl.light.LightTypeParameterListBuilder import com.intellij.psi.impl.light.LightTypeParameterListBuilder
@@ -56,7 +56,7 @@ open public class KotlinLightMethodForDeclaration(
private val typeParamsList: CachedValue<PsiTypeParameterList> by Delegates.blockingLazy { private val typeParamsList: CachedValue<PsiTypeParameterList> by Delegates.blockingLazy {
val cacheManager = CachedValuesManager.getManager(delegate.getProject()) val cacheManager = CachedValuesManager.getManager(delegate.getProject())
cacheManager.createCachedValue<PsiTypeParameterList>({ cacheManager.createCachedValue<PsiTypeParameterList>({
val declaration = if (origin is JetPropertyAccessor) origin.getParentByType(javaClass<JetProperty>()) else origin val declaration = if (origin is JetPropertyAccessor) origin.getNonStrictParentOfType<JetProperty>() else origin
val list = if (origin is JetClassOrObject) { val list = if (origin is JetClassOrObject) {
LightTypeParameterListBuilder(getManager(), getLanguage()) LightTypeParameterListBuilder(getManager(), getLanguage())
@@ -19,7 +19,7 @@ package org.jetbrains.jet.asJava
import com.intellij.psi.* import com.intellij.psi.*
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import java.util.ArrayList import java.util.ArrayList
import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration
import org.jetbrains.jet.utils.addToStdlib.singletonOrEmptyList import org.jetbrains.jet.utils.addToStdlib.singletonOrEmptyList
@@ -64,7 +64,7 @@ public fun PsiElement.getRepresentativeLightMethod(): PsiMethod? =
} }
public fun JetParameter.toPsiParameter(): PsiParameter? { public fun JetParameter.toPsiParameter(): PsiParameter? {
val paramList = getParentByType(javaClass<JetParameterList>()) val paramList = getNonStrictParentOfType<JetParameterList>()
if (paramList == null) return null if (paramList == null) return null
val paramIndex = paramList.getParameters().indexOf(this) val paramIndex = paramList.getParameters().indexOf(this)
@@ -85,11 +85,11 @@ public fun JetParameter.toPsiParameter(): PsiParameter? {
} }
public fun JetTypeParameter.toPsiTypeParameters(): List<PsiTypeParameter> { public fun JetTypeParameter.toPsiTypeParameters(): List<PsiTypeParameter> {
val paramList = getParentByType(javaClass<JetTypeParameterList>()) val paramList = getNonStrictParentOfType<JetTypeParameterList>()
if (paramList == null) return listOf() if (paramList == null) return listOf()
val paramIndex = paramList.getParameters().indexOf(this) val paramIndex = paramList.getParameters().indexOf(this)
val jetDeclaration = paramList.getParentByType(javaClass<JetDeclaration>()) ?: return listOf() val jetDeclaration = paramList.getNonStrictParentOfType<JetDeclaration>() ?: return listOf()
val lightOwners = jetDeclaration.toLightElements() val lightOwners = jetDeclaration.toLightElements()
return lightOwners.map { lightOwner -> (lightOwner as PsiTypeParameterListOwner).getTypeParameters()[paramIndex] } return lightOwners.map { lightOwner -> (lightOwner as PsiTypeParameterListOwner).getTypeParameters()[paramIndex] }
@@ -100,4 +100,4 @@ public val PsiElement.unwrapped: PsiElement?
get() = if (this is KotlinLightElement<*, *>) origin else this get() = if (this is KotlinLightElement<*, *>) origin else this
public val PsiElement.namedUnwrappedElement: PsiNamedElement? public val PsiElement.namedUnwrappedElement: PsiNamedElement?
get() = unwrapped?.getParentByType(javaClass<PsiNamedElement>()) get() = unwrapped?.getNonStrictParentOfType<PsiNamedElement>()
@@ -33,13 +33,13 @@ import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.jet.lang.psi.ValueArgument import org.jetbrains.jet.lang.psi.ValueArgument
import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall
import org.jetbrains.jet.lang.resolve.calls.callUtil.getParentResolvedCall import org.jetbrains.jet.lang.resolve.calls.callUtil.getParentResolvedCall
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public abstract class AbstractResolvedCallsTest() : JetLiteFixture() { public abstract class AbstractResolvedCallsTest() : JetLiteFixture() {
override fun createEnvironment(): JetCoreEnvironment = createEnvironmentWithMockJdk(ConfigurationKind.ALL) override fun createEnvironment(): JetCoreEnvironment = createEnvironmentWithMockJdk(ConfigurationKind.ALL)
@@ -51,7 +51,7 @@ public abstract class AbstractResolvedCallsTest() : JetLiteFixture() {
val bindingContext = JvmResolveUtil.analyzeOneFileWithJavaIntegration(jetFile).bindingContext val bindingContext = JvmResolveUtil.analyzeOneFileWithJavaIntegration(jetFile).bindingContext
val element = jetFile.findElementAt(text.indexOf("<caret>")) val element = jetFile.findElementAt(text.indexOf("<caret>"))
val expression = PsiTreeUtil.getParentOfType(element, javaClass<JetExpression>()) val expression = element.getStrictParentOfType<JetExpression>()
val cachedCall = expression?.getParentResolvedCall(bindingContext, strict = false) val cachedCall = expression?.getParentResolvedCall(bindingContext, strict = false)
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.ImportPath
import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElement import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElement
import org.jetbrains.jet.lang.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.jet.lang.resolve.descriptorUtil.getImportableDescriptor
import org.jetbrains.jet.plugin.caches.resolve.ResolutionFacade import org.jetbrains.jet.plugin.caches.resolve.ResolutionFacade
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public object ShortenReferences { public object ShortenReferences {
public fun process(element: JetElement) { public fun process(element: JetElement) {
@@ -192,7 +193,7 @@ public object ShortenReferences {
} }
if (target == null) return false if (target == null) return false
val typeReference = PsiTreeUtil.getParentOfType(userType, javaClass<JetTypeReference>())!! val typeReference = userType.getStrictParentOfType<JetTypeReference>()!!
val scope = resolutionFacade.analyze(typeReference)[BindingContext.TYPE_RESOLUTION_SCOPE, typeReference]!! val scope = resolutionFacade.analyze(typeReference)[BindingContext.TYPE_RESOLUTION_SCOPE, typeReference]!!
val name = target.getName() val name = target.getName()
val targetByName = scope.getClassifier(name) val targetByName = scope.getClassifier(name)
@@ -19,10 +19,9 @@ package org.jetbrains.jet.plugin.findUsages
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.jet.lang.psi.JetForExpression import org.jetbrains.jet.lang.psi.JetForExpression
import org.jetbrains.jet.lang.psi.JetMultiDeclaration import org.jetbrains.jet.lang.psi.JetMultiDeclaration
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetReferenceExpression import org.jetbrains.jet.lang.psi.JetReferenceExpression
import org.jetbrains.jet.lang.psi.JetImportDirective import org.jetbrains.jet.lang.psi.JetImportDirective
import org.jetbrains.jet.lang.psi.psiUtil.getParentByTypeAndBranch
import org.jetbrains.jet.lang.psi.JetCallableReferenceExpression import org.jetbrains.jet.lang.psi.JetCallableReferenceExpression
import org.jetbrains.jet.lang.psi.JetProperty import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
@@ -39,7 +38,7 @@ import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
import org.jetbrains.jet.lang.psi.JetSuperExpression import org.jetbrains.jet.lang.psi.JetSuperExpression
import org.jetbrains.jet.lang.psi.JetDelegatorByExpressionSpecifier import org.jetbrains.jet.lang.psi.JetDelegatorByExpressionSpecifier
import org.jetbrains.jet.lang.psi.psiUtil.getParentByTypesAndPredicate import org.jetbrains.jet.lang.psi.psiUtil.getParentOfTypesAndPredicate
import org.jetbrains.jet.lang.psi.JetBinaryExpression import org.jetbrains.jet.lang.psi.JetBinaryExpression
import org.jetbrains.jet.lang.psi.JetPsiUtil import org.jetbrains.jet.lang.psi.JetPsiUtil
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
@@ -62,6 +61,7 @@ import com.intellij.psi.PsiPackage
import org.jetbrains.jet.lang.descriptors.VariableDescriptor import org.jetbrains.jet.lang.descriptors.VariableDescriptor
import org.jetbrains.jet.plugin.findUsages.UsageTypeEnum.* import org.jetbrains.jet.plugin.findUsages.UsageTypeEnum.*
import org.jetbrains.jet.plugin.caches.resolve.analyze import org.jetbrains.jet.plugin.caches.resolve.analyze
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfTypeAndBranch
public object UsageTypeUtils { public object UsageTypeUtils {
public fun getUsageType(element: PsiElement?): UsageTypeEnum? { public fun getUsageType(element: PsiElement?): UsageTypeEnum? {
@@ -70,23 +70,23 @@ public object UsageTypeUtils {
is JetMultiDeclaration -> return READ is JetMultiDeclaration -> return READ
} }
val refExpr = element?.getParentByType(javaClass<JetReferenceExpression>()) val refExpr = element?.getNonStrictParentOfType<JetReferenceExpression>()
if (refExpr == null) return null if (refExpr == null) return null
val context = refExpr.analyze() val context = refExpr.analyze()
fun getCommonUsageType(): UsageTypeEnum? { fun getCommonUsageType(): UsageTypeEnum? {
return when { return when {
refExpr.getParentByType(javaClass<JetImportDirective>()) != null -> refExpr.getNonStrictParentOfType<JetImportDirective>() != null ->
CLASS_IMPORT CLASS_IMPORT
refExpr.getParentByTypeAndBranch(javaClass<JetCallableReferenceExpression>()) { getCallableReference() } != null -> refExpr.getParentOfTypeAndBranch<JetCallableReferenceExpression>(){ getCallableReference() } != null ->
CALLABLE_REFERENCE CALLABLE_REFERENCE
else -> null else -> null
} }
} }
fun getClassUsageType(): UsageTypeEnum? { fun getClassUsageType(): UsageTypeEnum? {
val property = refExpr.getParentByType(javaClass<JetProperty>()) val property = refExpr.getNonStrictParentOfType<JetProperty>()
if (property != null) { if (property != null) {
when { when {
property.getTypeReference().isAncestor(refExpr) -> property.getTypeReference().isAncestor(refExpr) ->
@@ -97,7 +97,7 @@ public object UsageTypeUtils {
} }
} }
val function = refExpr.getParentByType(javaClass<JetFunction>()) val function = refExpr.getNonStrictParentOfType<JetFunction>()
if (function != null) { if (function != null) {
when { when {
function.getTypeReference().isAncestor(refExpr) -> function.getTypeReference().isAncestor(refExpr) ->
@@ -108,42 +108,42 @@ public object UsageTypeUtils {
} }
return when { return when {
refExpr.getParentByTypeAndBranch(javaClass<JetTypeParameter>()) { getExtendsBound() } != null refExpr.getParentOfTypeAndBranch<JetTypeParameter>(){ getExtendsBound() } != null
|| refExpr.getParentByTypeAndBranch(javaClass<JetTypeConstraint>()) { getBoundTypeReference() } != null -> || refExpr.getParentOfTypeAndBranch<JetTypeConstraint>(){ getBoundTypeReference() } != null ->
TYPE_CONSTRAINT TYPE_CONSTRAINT
refExpr is JetDelegationSpecifier refExpr is JetDelegationSpecifier
|| refExpr.getParentByTypeAndBranch(javaClass<JetDelegationSpecifier>()) { getTypeReference() } != null -> || refExpr.getParentOfTypeAndBranch<JetDelegationSpecifier>(){ getTypeReference() } != null ->
SUPER_TYPE SUPER_TYPE
refExpr.getParentByTypeAndBranch(javaClass<JetTypedef>()) { getTypeReference() } != null -> refExpr.getParentOfTypeAndBranch<JetTypedef>(){ getTypeReference() } != null ->
TYPE_DEFINITION TYPE_DEFINITION
refExpr.getParentByType(javaClass<JetTypeProjection>()) != null -> refExpr.getNonStrictParentOfType<JetTypeProjection>() != null ->
TYPE_PARAMETER TYPE_PARAMETER
refExpr.getParentByTypeAndBranch(javaClass<JetParameter>()) { getTypeReference() } != null -> refExpr.getParentOfTypeAndBranch<JetParameter>(){ getTypeReference() } != null ->
VALUE_PARAMETER_TYPE VALUE_PARAMETER_TYPE
refExpr.getParentByTypeAndBranch(javaClass<JetIsExpression>()) { getTypeReference() } != null -> refExpr.getParentOfTypeAndBranch<JetIsExpression>(){ getTypeReference() } != null ->
IS IS
with(refExpr.getParentByTypeAndBranch(javaClass<JetBinaryExpressionWithTypeRHS>()) { getRight() }) { with(refExpr.getParentOfTypeAndBranch<JetBinaryExpressionWithTypeRHS>(){ getRight() }) {
val opType = this?.getOperationReference()?.getReferencedNameElementType() val opType = this?.getOperationReference()?.getReferencedNameElementType()
opType == JetTokens.AS_KEYWORD || opType == JetTokens.AS_SAFE opType == JetTokens.AS_KEYWORD || opType == JetTokens.AS_SAFE
} -> } ->
CLASS_CAST_TO CLASS_CAST_TO
with(refExpr.getParentByType(javaClass<JetDotQualifiedExpression>())) { with(refExpr.getNonStrictParentOfType<JetDotQualifiedExpression>()) {
if (this == null) false if (this == null) false
else if (getReceiverExpression() == refExpr) true else if (getReceiverExpression() == refExpr) true
else else
getSelectorExpression() == refExpr getSelectorExpression() == refExpr
&& getParentByTypeAndBranch(javaClass<JetDotQualifiedExpression>(), true) { getReceiverExpression() } != null && getParentOfTypeAndBranch<JetDotQualifiedExpression>(strict = true) { getReceiverExpression() } != null
} -> } ->
CLASS_OBJECT_ACCESS CLASS_OBJECT_ACCESS
refExpr.getParentByTypeAndBranch(javaClass<JetSuperExpression>()) { getSuperTypeQualifier() } != null -> refExpr.getParentOfTypeAndBranch<JetSuperExpression>(){ getSuperTypeQualifier() } != null ->
SUPER_TYPE_QUALIFIER SUPER_TYPE_QUALIFIER
else -> null else -> null
@@ -151,11 +151,11 @@ public object UsageTypeUtils {
} }
fun getVariableUsageType(): UsageTypeEnum? { fun getVariableUsageType(): UsageTypeEnum? {
if (refExpr.getParentByTypeAndBranch(javaClass<JetDelegatorByExpressionSpecifier>()) { getDelegateExpression() } != null) { if (refExpr.getParentOfTypeAndBranch<JetDelegatorByExpressionSpecifier>(){ getDelegateExpression() } != null) {
return DELEGATE return DELEGATE
} }
val dotQualifiedExpression = refExpr.getParentByType(javaClass<JetDotQualifiedExpression>()) val dotQualifiedExpression = refExpr.getNonStrictParentOfType<JetDotQualifiedExpression>()
if (dotQualifiedExpression != null) { if (dotQualifiedExpression != null) {
val parent = dotQualifiedExpression.getParent() val parent = dotQualifiedExpression.getParent()
@@ -169,11 +169,11 @@ public object UsageTypeUtils {
} }
return when { return when {
(refExpr.getParentByTypesAndPredicate(false, javaClass<JetBinaryExpression>()) { JetPsiUtil.isAssignment(it) }) (refExpr.getParentOfTypesAndPredicate(false, javaClass<JetBinaryExpression>()) { JetPsiUtil.isAssignment(it) })
?.getLeft().isAncestor(refExpr) -> ?.getLeft().isAncestor(refExpr) ->
WRITE WRITE
refExpr.getParentByType(javaClass<JetSimpleNameExpression>()) != null -> refExpr.getNonStrictParentOfType<JetSimpleNameExpression>() != null ->
READ READ
else -> null else -> null
@@ -194,21 +194,21 @@ public object UsageTypeUtils {
} }
return when { return when {
refExpr.getParentByTypeAndBranch(javaClass<JetDelegationSpecifier>()) { getTypeReference() } != null -> refExpr.getParentOfTypeAndBranch<JetDelegationSpecifier>(){ getTypeReference() } != null ->
SUPER_TYPE SUPER_TYPE
descriptor is ConstructorDescriptor descriptor is ConstructorDescriptor
&& refExpr.getParentByTypeAndBranch(javaClass<JetAnnotationEntry>()) { getTypeReference() } != null -> && refExpr.getParentOfTypeAndBranch<JetAnnotationEntry>(){ getTypeReference() } != null ->
ANNOTATION ANNOTATION
with(refExpr.getParentByTypeAndBranch(javaClass<JetCallExpression>()) { getCalleeExpression() }) { with(refExpr.getParentOfTypeAndBranch<JetCallExpression>(){ getCalleeExpression() }) {
this?.getCalleeExpression() is JetSimpleNameExpression this?.getCalleeExpression() is JetSimpleNameExpression
} -> } ->
if (descriptor is ConstructorDescriptor) CLASS_NEW_OPERATOR else FUNCTION_CALL if (descriptor is ConstructorDescriptor) CLASS_NEW_OPERATOR else FUNCTION_CALL
refExpr.getParentByTypeAndBranch(javaClass<JetBinaryExpression>()) { getOperationReference() } != null, refExpr.getParentOfTypeAndBranch<JetBinaryExpression>(){ getOperationReference() } != null,
refExpr.getParentByTypeAndBranch(javaClass<JetUnaryExpression>()) { getOperationReference() } != null, refExpr.getParentOfTypeAndBranch<JetUnaryExpression>(){ getOperationReference() } != null,
refExpr.getParentByTypeAndBranch(javaClass<JetWhenConditionInRange>()) { getOperationReference() } != null -> refExpr.getParentOfTypeAndBranch<JetWhenConditionInRange>(){ getOperationReference() } != null ->
FUNCTION_CALL FUNCTION_CALL
else -> null else -> null
@@ -217,8 +217,8 @@ public object UsageTypeUtils {
fun getPackageUsageType(): UsageTypeEnum? { fun getPackageUsageType(): UsageTypeEnum? {
return when { return when {
refExpr.getParentByType(javaClass<JetPackageDirective>()) != null -> PACKAGE_DIRECTIVE refExpr.getNonStrictParentOfType<JetPackageDirective>() != null -> PACKAGE_DIRECTIVE
refExpr.getParentByType(javaClass<JetQualifiedExpression>()) != null -> PACKAGE_MEMBER_ACCESS refExpr.getNonStrictParentOfType<JetQualifiedExpression>() != null -> PACKAGE_MEMBER_ACCESS
else -> getClassUsageType() else -> getClassUsageType()
} }
} }
@@ -25,7 +25,7 @@ import org.jetbrains.jet.plugin.quickfix.KotlinSuppressIntentionAction
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.plugin.quickfix.AnnotationHostKind import org.jetbrains.jet.plugin.quickfix.AnnotationHostKind
import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory
import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
class KotlinSuppressableWarningProblemGroup( class KotlinSuppressableWarningProblemGroup(
private val diagnosticFactory: DiagnosticFactory<*> private val diagnosticFactory: DiagnosticFactory<*>
@@ -86,7 +86,7 @@ private object DeclarationKindDetector : JetVisitor<AnnotationHostKind?, Unit?>(
override fun visitClass(d: JetClass, _: Unit?) = detect(d, if (d.isTrait()) "trait" else "class") override fun visitClass(d: JetClass, _: Unit?) = detect(d, if (d.isTrait()) "trait" else "class")
override fun visitClassObject(d: JetClassObject, _: Unit?) = detect(d, "class object", override fun visitClassObject(d: JetClassObject, _: Unit?) = detect(d, "class object",
name = "of " + PsiTreeUtil.getParentOfType(d, javaClass<JetClass>())?.getName()) name = "of " + d.getStrictParentOfType<JetClass>()?.getName())
override fun visitNamedFunction(d: JetNamedFunction, _: Unit?) = detect(d, "fun") override fun visitNamedFunction(d: JetNamedFunction, _: Unit?) = detect(d, "fun")
@@ -21,7 +21,7 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import org.jetbrains.jet.lang.psi.JetElement import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.plugin.JetBundle import org.jetbrains.jet.plugin.JetBundle
import org.jetbrains.jet.lang.psi.psiUtil.getParentByTypesAndPredicate import org.jetbrains.jet.lang.psi.psiUtil.getParentOfTypesAndPredicate
import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInsight.intention.IntentionAction
public abstract class JetSelfTargetingIntention<T: JetElement>(protected val key: String, val elementType: Class<T>) : IntentionAction { public abstract class JetSelfTargetingIntention<T: JetElement>(protected val key: String, val elementType: Class<T>) : IntentionAction {
@@ -37,7 +37,7 @@ public abstract class JetSelfTargetingIntention<T: JetElement>(protected val key
protected fun getTarget(editor: Editor, file: PsiFile): T? { protected fun getTarget(editor: Editor, file: PsiFile): T? {
val offset = editor.getCaretModel().getOffset() val offset = editor.getCaretModel().getOffset()
return file.findElementAt(offset)?.getParentByTypesAndPredicate(false, elementType) { element -> isApplicableTo(element, editor) } return file.findElementAt(offset)?.getParentOfTypesAndPredicate(false, elementType) { element -> isApplicableTo(element, editor) }
} }
public override fun getFamilyName(): String { public override fun getFamilyName(): String {
@@ -17,13 +17,13 @@
package org.jetbrains.jet.plugin.references package org.jetbrains.jet.plugin.references
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
import org.jetbrains.jet.lang.psi.JetProperty import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.psi.JetPropertyDelegate import org.jetbrains.jet.lang.psi.JetPropertyDelegate
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class JetPropertyDelegationMethodsReference(element: JetPropertyDelegate) : JetMultiReference<JetPropertyDelegate>(element) { public class JetPropertyDelegationMethodsReference(element: JetPropertyDelegate) : JetMultiReference<JetPropertyDelegate>(element) {
@@ -34,7 +34,7 @@ public class JetPropertyDelegationMethodsReference(element: JetPropertyDelegate)
} }
override fun getTargetDescriptors(context: BindingContext): Collection<DeclarationDescriptor> { override fun getTargetDescriptors(context: BindingContext): Collection<DeclarationDescriptor> {
val property = PsiTreeUtil.getParentOfType(expression, javaClass<JetProperty>()) val property = expression.getStrictParentOfType<JetProperty>()
if (property == null) { if (property == null) {
return Collections.emptyList() return Collections.emptyList()
} }
@@ -33,10 +33,10 @@ import org.jetbrains.jet.lexer.JetToken
import org.jetbrains.jet.plugin.intentions.OperatorToFunctionIntention import org.jetbrains.jet.plugin.intentions.OperatorToFunctionIntention
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import com.intellij.util.IncorrectOperationException import com.intellij.util.IncorrectOperationException
import org.jetbrains.jet.lang.psi.psiUtil.getParentByTypeAndBranch
import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.lang.resolve.dataClassUtils.isComponentLike import org.jetbrains.jet.lang.resolve.dataClassUtils.isComponentLike
import org.jetbrains.jet.plugin.caches.resolve.analyze import org.jetbrains.jet.plugin.caches.resolve.analyze
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfTypeAndBranch
public class JetSimpleNameReference( public class JetSimpleNameReference(
jetSimpleNameExpression: JetSimpleNameExpression jetSimpleNameExpression: JetSimpleNameExpression
@@ -45,7 +45,7 @@ public class JetSimpleNameReference(
override fun getRangeInElement(): TextRange = TextRange(0, getElement().getTextLength()) override fun getRangeInElement(): TextRange = TextRange(0, getElement().getTextLength())
override fun canRename(): Boolean { override fun canRename(): Boolean {
if (expression.getParentByTypeAndBranch(javaClass<JetWhenConditionInRange>()) { getOperationReference() } != null) return false if (expression.getParentOfTypeAndBranch<JetWhenConditionInRange>(strict = true){ getOperationReference() } != null) return false
val elementType = expression.getReferencedNameElementType() val elementType = expression.getReferencedNameElementType()
if (elementType == JetTokens.PLUSPLUS || elementType == JetTokens.MINUSMINUS) return false if (elementType == JetTokens.PLUSPLUS || elementType == JetTokens.MINUSMINUS) return false
@@ -21,18 +21,19 @@ import com.intellij.psi.PsiElement
import org.jetbrains.jet.asJava.unwrapped import org.jetbrains.jet.asJava.unwrapped
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import org.jetbrains.jet.lang.psi.JetPropertyAccessor import org.jetbrains.jet.lang.psi.JetPropertyAccessor
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType
import org.jetbrains.jet.lang.psi.JetProperty import org.jetbrains.jet.lang.psi.JetProperty
import java.util.HashSet import java.util.HashSet
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.plugin.intentions.OperatorToFunctionIntention import org.jetbrains.jet.plugin.intentions.OperatorToFunctionIntention
import org.jetbrains.jet.lang.psi.JetQualifiedExpression import org.jetbrains.jet.lang.psi.JetQualifiedExpression
import org.jetbrains.jet.lang.psi.JetCallExpression import org.jetbrains.jet.lang.psi.JetCallExpression
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetObjectDeclaration import org.jetbrains.jet.lang.psi.JetObjectDeclaration
import org.jetbrains.jet.lang.psi.JetClass import org.jetbrains.jet.lang.psi.JetClass
import com.intellij.psi.PsiPolyVariantReference import com.intellij.psi.PsiPolyVariantReference
import org.jetbrains.jet.utils.emptyOrSingletonList import org.jetbrains.jet.utils.emptyOrSingletonList
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
// Navigation element of the resolved reference // Navigation element of the resolved reference
// For property accessor return enclosing property // For property accessor return enclosing property
@@ -42,8 +43,8 @@ public val PsiReference.unwrappedTargets: Set<PsiElement>
fun PsiElement.adjust(): PsiElement? { fun PsiElement.adjust(): PsiElement? {
val target = unwrapped val target = unwrapped
return when { return when {
target is JetPropertyAccessor -> target.getParentByType(javaClass<JetProperty>()) target is JetPropertyAccessor -> target.getNonStrictParentOfType<JetProperty>()
target is JetObjectDeclaration && target.isClassObject() -> target.getParentByType(javaClass<JetClass>()) target is JetObjectDeclaration && target.isClassObject() -> target.getNonStrictParentOfType<JetClass>()
else -> target else -> target
} }
} }
@@ -74,5 +75,5 @@ fun AbstractJetReference<out JetExpression>.renameImplicitConventionalCall(newNa
val expr = OperatorToFunctionIntention.convert(expression) as JetQualifiedExpression val expr = OperatorToFunctionIntention.convert(expression) as JetQualifiedExpression
val newCallee = (expr.getSelectorExpression() as JetCallExpression).getCalleeExpression()!!.getReference()!!.handleElementRename(newName) val newCallee = (expr.getSelectorExpression() as JetCallExpression).getCalleeExpression()!!.getReference()!!.handleElementRename(newName)
return PsiTreeUtil.getParentOfType<JetQualifiedExpression>(newCallee, javaClass<JetQualifiedExpression>()) as JetExpression return newCallee.getStrictParentOfType<JetQualifiedExpression>() as JetExpression
} }
@@ -54,16 +54,16 @@ fun PsiReference.checkUsageVsOriginalDescriptor(
} }
fun PsiReference.isImportUsage(): Boolean = fun PsiReference.isImportUsage(): Boolean =
getElement()!!.getParentByType(javaClass<JetImportDirective>()) != null getElement()!!.getNonStrictParentOfType<JetImportDirective>() != null
fun PsiReference.isConstructorUsage(jetClassOrObject: JetClassOrObject): Boolean = with (getElement()!!) { fun PsiReference.isConstructorUsage(jetClassOrObject: JetClassOrObject): Boolean = with (getElement()!!) {
fun getCallDescriptor(bindingContext: BindingContext): DeclarationDescriptor? { fun getCallDescriptor(bindingContext: BindingContext): DeclarationDescriptor? {
val constructorCalleeExpression = getParentByType(javaClass<JetConstructorCalleeExpression>()) val constructorCalleeExpression = getNonStrictParentOfType<JetConstructorCalleeExpression>()
if (constructorCalleeExpression != null) { if (constructorCalleeExpression != null) {
return bindingContext.get(BindingContext.REFERENCE_TARGET, constructorCalleeExpression.getConstructorReferenceExpression()) return bindingContext.get(BindingContext.REFERENCE_TARGET, constructorCalleeExpression.getConstructorReferenceExpression())
} }
val callExpression = getParentByType(javaClass<JetCallExpression>()) val callExpression = getNonStrictParentOfType<JetCallExpression>()
if (callExpression != null) { if (callExpression != null) {
val callee = callExpression.getCalleeExpression() val callee = callExpression.getCalleeExpression()
if (callee is JetReferenceExpression) { if (callee is JetReferenceExpression) {
@@ -75,7 +75,7 @@ fun PsiReference.isConstructorUsage(jetClassOrObject: JetClassOrObject): Boolean
} }
fun checkJavaUsage(): Boolean { fun checkJavaUsage(): Boolean {
val call = getParentByType(javaClass<PsiConstructorCall>()) val call = getNonStrictParentOfType<PsiConstructorCall>()
return call == getParent() && call?.resolveConstructor()?.getContainingClass()?.getNavigationElement() == jetClassOrObject return call == getParent() && call?.resolveConstructor()?.getContainingClass()?.getNavigationElement() == jetClassOrObject
} }
@@ -142,7 +142,7 @@ fun PsiReference.isPropertyReadOnlyUsage(): Boolean {
if (refTarget is KotlinLightMethod) { if (refTarget is KotlinLightMethod) {
val origin = refTarget.origin val origin = refTarget.origin
val declaration: JetNamedDeclaration? = when (origin) { val declaration: JetNamedDeclaration? = when (origin) {
is JetPropertyAccessor -> origin.getParentByType(javaClass<JetProperty>()) is JetPropertyAccessor -> origin.getNonStrictParentOfType<JetProperty>()
is JetProperty, is JetParameter -> origin as JetNamedDeclaration is JetProperty, is JetParameter -> origin as JetNamedDeclaration
else -> null else -> null
} }
@@ -65,6 +65,7 @@ import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
//NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor //NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor
public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<ReferenceTransferableData>() { public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<ReferenceTransferableData>() {
@@ -340,7 +341,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Refere
parent.replace(createQualifiedExpression(psiFactory, text)) parent.replace(createQualifiedExpression(psiFactory, text))
} }
else if (parent is JetUserType) { else if (parent is JetUserType) {
val typeReference = PsiTreeUtil.getParentOfType(expression, javaClass<JetTypeReference>()) val typeReference = expression.getStrictParentOfType<JetTypeReference>()
LOG.assertTrue(typeReference != null, "JetUserType is expected to have parent of type JetTypeReference:\n" + LOG.assertTrue(typeReference != null, "JetUserType is expected to have parent of type JetTypeReference:\n" +
"At: ${DiagnosticUtils.atLocation(expression)}\nFILE:\n${expression.getContainingFile()!!.getText()}") "At: ${DiagnosticUtils.atLocation(expression)}\nFILE:\n${expression.getContainingFile()!!.getText()}")
typeReference!!.replace(psiFactory.createType("$prefixToInsert.${typeReference.getText()}")) typeReference!!.replace(psiFactory.createType("$prefixToInsert.${typeReference.getText()}"))
@@ -396,7 +396,7 @@ public class JetExpressionMover extends AbstractJetUpDownMover {
@Nullable @Nullable
private static PsiElement getMovableElement(@NotNull PsiElement element, boolean lookRight) { private static PsiElement getMovableElement(@NotNull PsiElement element, boolean lookRight) {
//noinspection unchecked //noinspection unchecked
PsiElement movableElement = PsiUtilPackage.getParentByTypesAndPredicate( PsiElement movableElement = PsiUtilPackage.getParentOfTypesAndPredicate(
element, element,
false, false,
MOVABLE_ELEMENT_CLASSES, MOVABLE_ELEMENT_CLASSES,
@@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.resolve.scopes.DescriptorKindFilter
import org.jetbrains.jet.lang.resolve.calls.smartcasts.SmartCastUtils import org.jetbrains.jet.lang.resolve.calls.smartcasts.SmartCastUtils
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo
import org.jetbrains.jet.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.jet.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
class CompletionSessionConfiguration( class CompletionSessionConfiguration(
val completeNonImportedDeclarations: Boolean, val completeNonImportedDeclarations: Boolean,
@@ -202,12 +203,12 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
} }
private fun isOnlyKeywordCompletion() private fun isOnlyKeywordCompletion()
= PsiTreeUtil.getParentOfType(position, javaClass<JetModifierList>()) != null = position.getStrictParentOfType<JetModifierList>() != null
private fun shouldRunOnlyTypeCompletion(): Boolean { private fun shouldRunOnlyTypeCompletion(): Boolean {
// Check that completion in the type annotation context and if there's a qualified // Check that completion in the type annotation context and if there's a qualified
// expression we are at first of it // expression we are at first of it
val typeReference = PsiTreeUtil.getParentOfType(position, javaClass<JetTypeReference>()) val typeReference = position.getStrictParentOfType<JetTypeReference>()
if (typeReference != null) { if (typeReference != null) {
val firstPartReference = PsiTreeUtil.findChildOfType(typeReference, javaClass<JetSimpleNameExpression>()) val firstPartReference = PsiTreeUtil.findChildOfType(typeReference, javaClass<JetSimpleNameExpression>())
return firstPartReference == jetReference!!.expression return firstPartReference == jetReference!!.expression
@@ -27,12 +27,12 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder
import com.intellij.psi.PsiErrorElement import com.intellij.psi.PsiErrorElement
import org.jetbrains.jet.lexer.JetKeywordToken import org.jetbrains.jet.lexer.JetKeywordToken
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType
import org.jetbrains.jet.plugin.completion.handlers.KotlinKeywordInsertHandler import org.jetbrains.jet.plugin.completion.handlers.KotlinKeywordInsertHandler
import org.jetbrains.jet.lang.psi.psiUtil.siblings import org.jetbrains.jet.lang.psi.psiUtil.siblings
import org.jetbrains.jet.lexer.JetTokens.* import org.jetbrains.jet.lexer.JetTokens.*
import org.jetbrains.jet.lang.psi.psiUtil.prevLeafSkipWhitespacesAndComments import org.jetbrains.jet.lang.psi.psiUtil.prevLeafSkipWhitespacesAndComments
import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
class KeywordLookupObject(val keyword: String) class KeywordLookupObject(val keyword: String)
@@ -162,7 +162,7 @@ object KeywordCompletion {
when { when {
nodeType != keywordTokenType -> false nodeType != keywordTokenType -> false
elementAt.getParentByType(javaClass<PsiErrorElement>(), strict = false) != null -> false elementAt.getNonStrictParentOfType<PsiErrorElement>() != null -> false
elementAt.prevLeafSkipWhitespacesAndComments() is PsiErrorElement -> false elementAt.prevLeafSkipWhitespacesAndComments() is PsiErrorElement -> false
@@ -49,6 +49,7 @@ import org.jetbrains.jet.lang.psi.JetFunctionLiteral
import org.jetbrains.jet.lang.psi.psiUtil.prevLeafSkipWhitespacesAndComments import org.jetbrains.jet.lang.psi.psiUtil.prevLeafSkipWhitespacesAndComments
import org.jetbrains.jet.lang.psi.JetValueArgument import org.jetbrains.jet.lang.psi.JetValueArgument
import org.jetbrains.jet.lang.psi.JetValueArgumentList import org.jetbrains.jet.lang.psi.JetValueArgumentList
import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
public class KotlinCompletionContributor : CompletionContributor() { public class KotlinCompletionContributor : CompletionContributor() {
@@ -215,7 +216,7 @@ public class KotlinCompletionContributor : CompletionContributor() {
// no completion in comments // no completion in comments
// TODO: this must be changed if we will have references in doc-comments // TODO: this must be changed if we will have references in doc-comments
if (PsiTreeUtil.getParentOfType(position, javaClass<PsiComment>(), false) != null) return true if (position.getNonStrictParentOfType<PsiComment>() != null) return true
// no completion inside number literals // no completion inside number literals
if (AFTER_NUMBER_LITERAL.accepts(position)) return true if (AFTER_NUMBER_LITERAL.accepts(position)) return true
@@ -18,7 +18,6 @@ package org.jetbrains.jet.plugin.completion
import org.jetbrains.jet.lang.psi.JetValueArgument import org.jetbrains.jet.lang.psi.JetValueArgument
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetCallElement import org.jetbrains.jet.lang.psi.JetCallElement
import org.jetbrains.jet.plugin.references.JetReference import org.jetbrains.jet.plugin.references.JetReference
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
@@ -40,6 +39,7 @@ import com.intellij.codeInsight.completion.InsertHandler
import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.plugin.completion.handlers.WithTailInsertHandler import org.jetbrains.jet.plugin.completion.handlers.WithTailInsertHandler
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
object NamedParametersCompletion { object NamedParametersCompletion {
private val positionFilter = AndFilter( private val positionFilter = AndFilter(
@@ -56,9 +56,9 @@ object NamedParametersCompletion {
public fun isOnlyNamedParameterExpected(position: PsiElement): Boolean { public fun isOnlyNamedParameterExpected(position: PsiElement): Boolean {
if (!positionFilter.isAcceptable(position, position)) return false if (!positionFilter.isAcceptable(position, position)) return false
val thisArgument = PsiTreeUtil.getParentOfType(position, javaClass<JetValueArgument>())!! val thisArgument = position.getStrictParentOfType<JetValueArgument>()!!
val callElement = PsiTreeUtil.getParentOfType(thisArgument, javaClass<JetCallElement>()) ?: return false val callElement = thisArgument.getStrictParentOfType<JetCallElement>() ?: return false
for (argument in callElement.getValueArguments()) { for (argument in callElement.getValueArguments()) {
if (argument == thisArgument) break if (argument == thisArgument) break
@@ -71,9 +71,9 @@ object NamedParametersCompletion {
public fun complete(position: PsiElement, collector: LookupElementsCollector) { public fun complete(position: PsiElement, collector: LookupElementsCollector) {
if (!positionFilter.isAcceptable(position, position)) return if (!positionFilter.isAcceptable(position, position)) return
val valueArgument = PsiTreeUtil.getParentOfType(position, javaClass<JetValueArgument>())!! val valueArgument = position.getStrictParentOfType<JetValueArgument>()!!
val callElement = PsiTreeUtil.getParentOfType(valueArgument, javaClass<JetCallElement>()) ?: return val callElement = valueArgument.getStrictParentOfType<JetCallElement>() ?: return
val callSimpleName = callElement.getCallNameExpression() ?: return val callSimpleName = callElement.getCallNameExpression() ?: return
val callReference = callSimpleName.getReference() as JetReference val callReference = callSimpleName.getReference() as JetReference
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.completion.InsertionContext
import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetImportDirective import org.jetbrains.jet.lang.psi.JetImportDirective
import com.intellij.codeInsight.AutoPopupController import com.intellij.codeInsight.AutoPopupController
import com.intellij.psi.codeStyle.CodeStyleSettingsManager import com.intellij.psi.codeStyle.CodeStyleSettingsManager
@@ -38,6 +37,7 @@ import org.jetbrains.jet.plugin.completion.DeclarationDescriptorLookupObject
import org.jetbrains.jet.lang.descriptors.CallableDescriptor import org.jetbrains.jet.lang.descriptors.CallableDescriptor
import org.jetbrains.jet.lang.psi.JetBinaryExpression import org.jetbrains.jet.lang.psi.JetBinaryExpression
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public abstract class KotlinCallableInsertHandler : BaseDeclarationInsertHandler() { public abstract class KotlinCallableInsertHandler : BaseDeclarationInsertHandler() {
public override fun handleInsert(context: InsertionContext, item: LookupElement) { public override fun handleInsert(context: InsertionContext, item: LookupElement) {
@@ -60,7 +60,7 @@ public abstract class KotlinCallableInsertHandler : BaseDeclarationInsertHandler
if (file is JetFile && o is DeclarationDescriptorLookupObject) { if (file is JetFile && o is DeclarationDescriptorLookupObject) {
val descriptor = o.descriptor as? CallableDescriptor val descriptor = o.descriptor as? CallableDescriptor
if (descriptor != null) { if (descriptor != null) {
if (PsiTreeUtil.getParentOfType(element, javaClass<JetQualifiedExpression>()) != null && if (element.getStrictParentOfType<JetQualifiedExpression>() != null &&
descriptor.getExtensionReceiverParameter() == null) { descriptor.getExtensionReceiverParameter() == null) {
return@runReadAction return@runReadAction
} }
@@ -103,7 +103,7 @@ public class KotlinFunctionInsertHandler(val caretPosition : CaretPosition, val
val element = context.getFile().findElementAt(startOffset) ?: return val element = context.getFile().findElementAt(startOffset) ?: return
when { when {
PsiTreeUtil.getParentOfType(element, javaClass<JetImportDirective>()) != null -> return element.getStrictParentOfType<JetImportDirective>() != null -> return
isInfixCall(element) -> { isInfixCall(element) -> {
if (context.getCompletionChar() == ' ') { if (context.getCompletionChar() == ' ') {
@@ -194,7 +194,7 @@ public class KotlinFunctionInsertHandler(val caretPosition : CaretPosition, val
public val WITH_PARAMETERS_HANDLER: KotlinFunctionInsertHandler = KotlinFunctionInsertHandler(CaretPosition.IN_BRACKETS, null) public val WITH_PARAMETERS_HANDLER: KotlinFunctionInsertHandler = KotlinFunctionInsertHandler(CaretPosition.IN_BRACKETS, null)
private fun shouldAddBrackets(element : PsiElement) : Boolean { private fun shouldAddBrackets(element : PsiElement) : Boolean {
return PsiTreeUtil.getParentOfType(element, javaClass<JetImportDirective>()) == null return element.getStrictParentOfType<JetImportDirective>() == null
} }
private fun indexOfSkippingSpace(document: Document, ch : Char, startIndex : Int) : Int { private fun indexOfSkippingSpace(document: Document, ch : Char, startIndex : Int) : Int {
@@ -19,10 +19,10 @@ package org.jetbrains.jet.plugin.completion.handlers
import com.intellij.codeInsight.completion.InsertHandler import com.intellij.codeInsight.completion.InsertHandler
import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.completion.InsertionContext
import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetFunction import org.jetbrains.jet.lang.psi.JetFunction
import org.jetbrains.jet.lang.psi.JetPsiUtil import org.jetbrains.jet.lang.psi.JetPsiUtil
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public object KotlinKeywordInsertHandler : InsertHandler<LookupElement> { public object KotlinKeywordInsertHandler : InsertHandler<LookupElement> {
private val NO_SPACE_AFTER = setOf(JetTokens.THIS_KEYWORD.toString(), private val NO_SPACE_AFTER = setOf(JetTokens.THIS_KEYWORD.toString(),
@@ -46,7 +46,7 @@ public object KotlinKeywordInsertHandler : InsertHandler<LookupElement> {
if (keyword == JetTokens.RETURN_KEYWORD.toString()) { if (keyword == JetTokens.RETURN_KEYWORD.toString()) {
val element = context.getFile().findElementAt(context.getStartOffset()) val element = context.getFile().findElementAt(context.getStartOffset())
if (element != null) { if (element != null) {
val jetFunction = PsiTreeUtil.getParentOfType(element, javaClass<JetFunction>()) val jetFunction = element.getStrictParentOfType<JetFunction>()
if (jetFunction != null && (!jetFunction.hasDeclaredReturnType() || JetPsiUtil.isVoidType(jetFunction.getTypeReference()))) { if (jetFunction != null && (!jetFunction.hasDeclaredReturnType() || JetPsiUtil.isVoidType(jetFunction.getTypeReference()))) {
// No space for void function // No space for void function
return false return false
@@ -35,7 +35,6 @@ import com.intellij.debugger.settings.NodeRendererSettings
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.JavaPsiFacade import com.intellij.psi.JavaPsiFacade
import com.intellij.debugger.SourcePosition import com.intellij.debugger.SourcePosition
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.debugger.impl.DebuggerContextUtil import com.intellij.debugger.impl.DebuggerContextUtil
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.sun.jdi.AbsentInformationException import com.sun.jdi.AbsentInformationException
@@ -46,6 +45,7 @@ import org.jetbrains.jet.lang.resolve.java.JvmClassName
import com.sun.jdi.ReferenceType import com.sun.jdi.ReferenceType
import org.jetbrains.jet.codegen.AsmUtil import org.jetbrains.jet.codegen.AsmUtil
import org.jetbrains.jet.lang.psi.JetClassOrObject import org.jetbrains.jet.lang.psi.JetClassOrObject
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public open class KotlinObjectRenderer : ClassRenderer() { public open class KotlinObjectRenderer : ClassRenderer() {
@@ -129,7 +129,7 @@ public class KotlinObjectFieldDescriptor(
if (position != null) { if (position != null) {
val element = position.getElementAt() val element = position.getElementAt()
if (element != null) { if (element != null) {
return PsiTreeUtil.getParentOfType(element, javaClass<JetClassOrObject>()) return element.getStrictParentOfType<JetClassOrObject>()
} }
} }
return null return null
@@ -22,7 +22,6 @@ import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.util.text.CharArrayUtil import com.intellij.util.text.CharArrayUtil
import com.intellij.psi.codeStyle.CodeStyleSettingsManager import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetDeclaration
@@ -37,6 +36,7 @@ import com.intellij.psi.tree.TokenSet
import org.jetbrains.jet.JetNodeTypes import org.jetbrains.jet.JetNodeTypes
import org.jetbrains.jet.lang.psi.JetLoopExpression import org.jetbrains.jet.lang.psi.JetLoopExpression
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class KotlinSmartEnterHandler: SmartEnterProcessorWithFixers() { public class KotlinSmartEnterHandler: SmartEnterProcessorWithFixers() {
{ {
@@ -106,7 +106,7 @@ public class KotlinSmartEnterHandler: SmartEnterProcessorWithFixers() {
val settings = CodeStyleSettingsManager.getSettings(file.getProject()) val settings = CodeStyleSettingsManager.getSettings(file.getProject())
val old = settings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE val old = settings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE
settings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = false settings.KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = false
val elt = PsiTreeUtil.getParentOfType(file.findElementAt(caretOffset - 1), javaClass<JetBlockExpression>()) val elt = file.findElementAt(caretOffset - 1).getStrictParentOfType<JetBlockExpression>()
if (elt != null) { if (elt != null) {
reformat(elt) reformat(elt)
} }
@@ -20,13 +20,13 @@ import com.intellij.lang.SmartEnterProcessorWithFixers
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import org.jetbrains.jet.plugin.editor.KotlinSmartEnterHandler import org.jetbrains.jet.plugin.editor.KotlinSmartEnterHandler
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetDeclaration
import org.jetbrains.jet.lang.psi.JetFunction import org.jetbrains.jet.lang.psi.JetFunction
import org.jetbrains.jet.lang.psi.JetClassOrObject import org.jetbrains.jet.lang.psi.JetClassOrObject
import org.jetbrains.jet.lang.psi.JetPsiUtil import org.jetbrains.jet.lang.psi.JetPsiUtil
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.lang.psi.JetNamedFunction import org.jetbrains.jet.lang.psi.JetNamedFunction
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class KotlinFunctionDeclarationBodyFixer : SmartEnterProcessorWithFixers.Fixer<KotlinSmartEnterHandler>() { public class KotlinFunctionDeclarationBodyFixer : SmartEnterProcessorWithFixers.Fixer<KotlinSmartEnterHandler>() {
@@ -34,7 +34,7 @@ public class KotlinFunctionDeclarationBodyFixer : SmartEnterProcessorWithFixers.
if (psiElement !is JetNamedFunction) return if (psiElement !is JetNamedFunction) return
if (psiElement.getBodyExpression() != null|| psiElement.getEqualsToken() != null) return if (psiElement.getBodyExpression() != null|| psiElement.getEqualsToken() != null) return
val parentDeclaration = PsiTreeUtil.getParentOfType(psiElement, javaClass<JetDeclaration>()) val parentDeclaration = psiElement.getStrictParentOfType<JetDeclaration>()
if (parentDeclaration is JetClassOrObject) { if (parentDeclaration is JetClassOrObject) {
if (JetPsiUtil.isTrait(parentDeclaration) || psiElement.hasModifier(JetTokens.ABSTRACT_KEYWORD)) { if (JetPsiUtil.isTrait(parentDeclaration) || psiElement.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
return return
@@ -23,12 +23,12 @@ import com.intellij.usages.rules.ImportFilteringRule
import com.intellij.usages.rules.PsiElementUsage import com.intellij.usages.rules.PsiElementUsage
import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.JetImportDirective import org.jetbrains.jet.lang.psi.JetImportDirective
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
public class JetImportFilteringRule : ImportFilteringRule() { public class JetImportFilteringRule : ImportFilteringRule() {
public override fun isVisible(usage: Usage): Boolean { public override fun isVisible(usage: Usage): Boolean {
if (usage is PsiElementUsage) { if (usage is PsiElementUsage) {
return usage.getElement()?.getParentByType(javaClass<JetImportDirective>()) == null return usage.getElement()?.getNonStrictParentOfType<JetImportDirective>() == null
} }
return true return true
@@ -70,11 +70,11 @@ public class HierarchyUtils {
public static PsiElement getCallHierarchyElement(PsiElement element) { public static PsiElement getCallHierarchyElement(PsiElement element) {
//noinspection unchecked //noinspection unchecked
return PsiUtilPackage.getParentByTypesAndPredicate(element, false, ArrayUtil.EMPTY_CLASS_ARRAY, IS_CALL_HIERARCHY_ELEMENT); return PsiUtilPackage.getParentOfTypesAndPredicate(element, false, ArrayUtil.EMPTY_CLASS_ARRAY, IS_CALL_HIERARCHY_ELEMENT);
} }
public static PsiElement getOverrideHierarchyElement(PsiElement element) { public static PsiElement getOverrideHierarchyElement(PsiElement element) {
//noinspection unchecked //noinspection unchecked
return PsiUtilPackage.getParentByTypesAndPredicate(element, false, ArrayUtil.EMPTY_CLASS_ARRAY, IS_OVERRIDE_HIERARCHY_ELEMENT); return PsiUtilPackage.getParentOfTypesAndPredicate(element, false, ArrayUtil.EMPTY_CLASS_ARRAY, IS_OVERRIDE_HIERARCHY_ELEMENT);
} }
} }
@@ -76,7 +76,7 @@ public abstract class KotlinCallTreeStructure extends HierarchyTreeStructure {
@Nullable @Nullable
protected static PsiMethod getRepresentativePsiMethod(PsiElement element) { protected static PsiMethod getRepresentativePsiMethod(PsiElement element) {
while (true) { while (true) {
element = PsiUtilPackage.getParentByTypesAndPredicate(element, false, ArrayUtil.EMPTY_CLASS_ARRAY, IS_NON_LOCAL_DECLARATION); element = PsiUtilPackage.getParentOfTypesAndPredicate(element, false, ArrayUtil.EMPTY_CLASS_ARRAY, IS_NON_LOCAL_DECLARATION);
if (element == null) return null; if (element == null) return null;
PsiMethod method = getRepresentativePsiMethodForNonLocalDeclaration(element); PsiMethod method = getRepresentativePsiMethodForNonLocalDeclaration(element);
@@ -21,7 +21,6 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.progress.ProgressIndicatorProvider import com.intellij.openapi.progress.ProgressIndicatorProvider
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.resolve.ImportPath import org.jetbrains.jet.lang.resolve.ImportPath
import org.jetbrains.jet.lang.resolve.name.* import org.jetbrains.jet.lang.resolve.name.*
@@ -29,6 +28,7 @@ import org.jetbrains.jet.plugin.references.JetReference
import java.util.HashSet import java.util.HashSet
import java.util.ArrayList import java.util.ArrayList
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class KotlinImportOptimizer() : ImportOptimizer { public class KotlinImportOptimizer() : ImportOptimizer {
@@ -80,8 +80,8 @@ public class KotlinImportOptimizer() : ImportOptimizer {
} }
override fun visitJetElement(element: JetElement) { override fun visitJetElement(element: JetElement) {
if (PsiTreeUtil.getParentOfType(element, javaClass<JetImportDirective>()) != null || if (element.getStrictParentOfType<JetImportDirective>() != null ||
PsiTreeUtil.getParentOfType(element, javaClass<JetPackageDirective>()) != null) { element.getStrictParentOfType<JetPackageDirective>() != null) {
return return
} }
val reference = element.getReference() val reference = element.getReference()
@@ -20,10 +20,10 @@ import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.plugin.JetBundle import org.jetbrains.jet.plugin.JetBundle
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class ConvertToBlockBodyAction : PsiElementBaseIntentionAction() { public class ConvertToBlockBodyAction : PsiElementBaseIntentionAction() {
override fun getFamilyName(): String = JetBundle.message("convert.to.block.body.action.family.name") override fun getFamilyName(): String = JetBundle.message("convert.to.block.body.action.family.name")
@@ -76,7 +76,7 @@ public class ConvertToBlockBodyAction : PsiElementBaseIntentionAction() {
} }
private fun findDeclaration(element: PsiElement): JetDeclarationWithBody? { private fun findDeclaration(element: PsiElement): JetDeclarationWithBody? {
val declaration = PsiTreeUtil.getParentOfType(element, javaClass<JetDeclarationWithBody>()) val declaration = element.getStrictParentOfType<JetDeclarationWithBody>()
if (declaration == null || declaration is JetFunctionLiteral || declaration.hasBlockBody()) return null if (declaration == null || declaration is JetFunctionLiteral || declaration.hasBlockBody()) return null
val body = declaration.getBodyExpression() val body = declaration.getBodyExpression()
if (body == null) return null if (body == null) return null
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.plugin.JetBundle import org.jetbrains.jet.plugin.JetBundle
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
@@ -28,6 +27,7 @@ import org.jetbrains.jet.lexer.JetTokens
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.jet.plugin.caches.resolve.resolveToDescriptor import org.jetbrains.jet.plugin.caches.resolve.resolveToDescriptor
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class ConvertToExpressionBodyAction : PsiElementBaseIntentionAction() { public class ConvertToExpressionBodyAction : PsiElementBaseIntentionAction() {
override fun getFamilyName(): String = JetBundle.message("convert.to.expression.body.action.family.name") override fun getFamilyName(): String = JetBundle.message("convert.to.expression.body.action.family.name")
@@ -70,7 +70,7 @@ public class ConvertToExpressionBodyAction : PsiElementBaseIntentionAction() {
private data class Data(val declaration: JetDeclarationWithBody, val value: JetExpression) private data class Data(val declaration: JetDeclarationWithBody, val value: JetExpression)
private fun calcData(element: PsiElement): Data? { private fun calcData(element: PsiElement): Data? {
val declaration = PsiTreeUtil.getParentOfType(element, javaClass<JetDeclarationWithBody>()) val declaration = element.getStrictParentOfType<JetDeclarationWithBody>()
if (declaration == null || declaration is JetFunctionLiteral) return null if (declaration == null || declaration is JetFunctionLiteral) return null
val body = declaration.getBodyExpression() val body = declaration.getBodyExpression()
if (!declaration.hasBlockBody() || body !is JetBlockExpression) return null if (!declaration.hasBlockBody() || body !is JetBlockExpression) return null
@@ -21,7 +21,6 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler
import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression
import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.jet.lang.psi.JetPsiFactory
@@ -33,10 +32,11 @@ import org.jetbrains.jet.lang.psi.JetFunctionLiteral
import org.jetbrains.jet.plugin.references.JetReference import org.jetbrains.jet.plugin.references.JetReference
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
import org.jetbrains.jet.plugin.caches.resolve.analyze import org.jetbrains.jet.plugin.caches.resolve.analyze
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class ReplaceItWithExplicitFunctionLiteralParamIntention() : PsiElementBaseIntentionAction() { public class ReplaceItWithExplicitFunctionLiteralParamIntention() : PsiElementBaseIntentionAction() {
override fun invoke(project: Project, editor: Editor, element: PsiElement) { override fun invoke(project: Project, editor: Editor, element: PsiElement) {
val simpleNameExpression = PsiTreeUtil.getParentOfType(element, javaClass<JetSimpleNameExpression>())!! val simpleNameExpression = element.getStrictParentOfType<JetSimpleNameExpression>()!!
val simpleNameReference = simpleNameExpression.getReference() as JetReference? val simpleNameReference = simpleNameExpression.getReference() as JetReference?
val target = simpleNameReference?.resolveToDescriptors()?.first()!! val target = simpleNameReference?.resolveToDescriptors()?.first()!!
@@ -55,7 +55,7 @@ public class ReplaceItWithExplicitFunctionLiteralParamIntention() : PsiElementBa
} }
override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean { override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean {
val simpleNameExpression = PsiTreeUtil.getParentOfType(element, javaClass<JetSimpleNameExpression>()) val simpleNameExpression = element.getStrictParentOfType<JetSimpleNameExpression>()
if (simpleNameExpression == null || !isAutoCreatedIt(simpleNameExpression)) { if (simpleNameExpression == null || !isAutoCreatedIt(simpleNameExpression)) {
return false return false
} }
@@ -21,7 +21,7 @@ import com.intellij.openapi.editor.Editor
import org.jetbrains.jet.lang.psi.JetBinaryExpression import org.jetbrains.jet.lang.psi.JetBinaryExpression
import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
@@ -52,7 +52,7 @@ public class SplitIfIntention : JetSelfTargetingIntention<JetExpression>("split.
else -> element as JetSimpleNameExpression else -> element as JetSimpleNameExpression
} }
val ifExpression = currentElement!!.getParentByType(javaClass<JetIfExpression>()) val ifExpression = currentElement!!.getNonStrictParentOfType<JetIfExpression>()
val expression = currentElement.getParent() as JetBinaryExpression val expression = currentElement.getParent() as JetBinaryExpression
val rightExpression = getRight(expression, ifExpression!!.getCondition() as JetExpression) val rightExpression = getRight(expression, ifExpression!!.getCondition() as JetExpression)
val leftExpression = expression.getLeft() val leftExpression = expression.getLeft()
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.ClassKind
import org.jetbrains.jet.lang.psi.JetClass import org.jetbrains.jet.lang.psi.JetClass
import org.jetbrains.jet.lang.psi.JetParameterList import org.jetbrains.jet.lang.psi.JetParameterList
import org.jetbrains.jet.lang.psi.JetNamedDeclaration import org.jetbrains.jet.lang.psi.JetNamedDeclaration
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
/** /**
* Special <code>Expression</code> for parameter names based on its type. * Special <code>Expression</code> for parameter names based on its type.
@@ -61,7 +62,7 @@ private class ParameterNameExpression(
} }
// add names based on selected type // add names based on selected type
val parameter = PsiTreeUtil.getParentOfType(elementAt, javaClass<JetParameter>()) val parameter = elementAt.getStrictParentOfType<JetParameter>()
if (parameter != null) { if (parameter != null) {
val parameterTypeRef = parameter.getTypeReference() val parameterTypeRef = parameter.getTypeReference()
if (parameterTypeRef != null) { if (parameterTypeRef != null) {
@@ -138,7 +139,7 @@ private class TypeParameterListExpression(private val mandatoryTypeParameters: L
val editor = context.getEditor()!! val editor = context.getEditor()!!
val file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()) as JetFile val file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()) as JetFile
val elementAt = file.findElementAt(offset) val elementAt = file.findElementAt(offset)
val declaration = PsiTreeUtil.getParentOfType(elementAt, javaClass<JetNamedDeclaration>()) ?: return TextResult("") val declaration = elementAt.getStrictParentOfType<JetNamedDeclaration>() ?: return TextResult("")
val renderedTypeParameters = LinkedHashSet<RenderedTypeParameter>() val renderedTypeParameters = LinkedHashSet<RenderedTypeParameter>()
renderedTypeParameters.addAll(mandatoryTypeParameters) renderedTypeParameters.addAll(mandatoryTypeParameters)
@@ -35,7 +35,7 @@ import kotlin.properties.Delegates
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
import org.jetbrains.jet.plugin.util.makeNotNullable import org.jetbrains.jet.plugin.util.makeNotNullable
import org.jetbrains.jet.lang.psi.JetAnnotationEntry import org.jetbrains.jet.lang.psi.JetAnnotationEntry
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
private fun JetType.contains(inner: JetType): Boolean { private fun JetType.contains(inner: JetType): Boolean {
return JetTypeChecker.DEFAULT.equalTypes(this, inner) || getArguments().any { inner in it.getType() } return JetTypeChecker.DEFAULT.equalTypes(this, inner) || getArguments().any { inner in it.getType() }
@@ -95,7 +95,7 @@ fun JetExpression.guessTypes(
if (coerceUnusedToUnit if (coerceUnusedToUnit
&& this !is JetDeclaration && this !is JetDeclaration
&& isUsedAsStatement(context) && isUsedAsStatement(context)
&& getParentByType(javaClass<JetAnnotationEntry>()) == null) return array(builtIns.getUnitType()) && getNonStrictParentOfType<JetAnnotationEntry>() == null) return array(builtIns.getUnitType())
// if we know the actual type of the expression // if we know the actual type of the expression
val theType1 = context[BindingContext.EXPRESSION_TYPE, this] val theType1 = context[BindingContext.EXPRESSION_TYPE, this]
@@ -2,7 +2,7 @@ package org.jetbrains.jet.plugin.quickfix.createFromUsage.createClass
import org.jetbrains.jet.lang.diagnostics.Diagnostic import org.jetbrains.jet.lang.diagnostics.Diagnostic
import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInsight.intention.IntentionAction
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetTypeReference import org.jetbrains.jet.lang.psi.JetTypeReference
import org.jetbrains.jet.lang.psi.JetCallExpression import org.jetbrains.jet.lang.psi.JetCallExpression
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
@@ -21,9 +21,9 @@ import java.util.Collections
public object CreateClassFromConstructorCallActionFactory: JetSingleIntentionActionFactory() { public object CreateClassFromConstructorCallActionFactory: JetSingleIntentionActionFactory() {
override fun createAction(diagnostic: Diagnostic): IntentionAction? { override fun createAction(diagnostic: Diagnostic): IntentionAction? {
val diagElement = diagnostic.getPsiElement() val diagElement = diagnostic.getPsiElement()
if (diagElement.getParentByType(javaClass<JetTypeReference>()) != null) return null if (diagElement.getNonStrictParentOfType<JetTypeReference>() != null) return null
val inAnnotationEntry = diagElement.getParentByType(javaClass<JetAnnotationEntry>()) != null val inAnnotationEntry = diagElement.getNonStrictParentOfType<JetAnnotationEntry>() != null
val callExpr = diagElement.getParent() as? JetCallExpression ?: return null val callExpr = diagElement.getParent() as? JetCallExpression ?: return null
if (callExpr.getCalleeExpression() != diagElement) return null if (callExpr.getCalleeExpression() != diagElement) return null
@@ -4,7 +4,7 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic
import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInsight.intention.IntentionAction
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetTypeReference import org.jetbrains.jet.lang.psi.JetTypeReference
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.plugin.quickfix.JetIntentionActionsFactory import org.jetbrains.jet.plugin.quickfix.JetIntentionActionsFactory
@@ -32,7 +32,7 @@ import org.jetbrains.jet.utils.addToStdlib.singletonOrEmptyList
public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActionsFactory() { public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActionsFactory() {
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> { override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
val refExpr = diagnostic.getPsiElement() as? JetSimpleNameExpression ?: return Collections.emptyList() val refExpr = diagnostic.getPsiElement() as? JetSimpleNameExpression ?: return Collections.emptyList()
if (refExpr.getParentByType(javaClass<JetTypeReference>()) != null) return Collections.emptyList() if (refExpr.getNonStrictParentOfType<JetTypeReference>() != null) return Collections.emptyList()
val file = refExpr.getContainingFile() as? JetFile ?: return Collections.emptyList() val file = refExpr.getContainingFile() as? JetFile ?: return Collections.emptyList()
@@ -48,7 +48,7 @@ public object CreateClassFromReferenceExpressionActionFactory : JetIntentionActi
} }
} as? JetExpression ?: return Collections.emptyList() } as? JetExpression ?: return Collections.emptyList()
val inImport = refExpr.getParentByType(javaClass<JetImportDirective>()) != null val inImport = refExpr.getNonStrictParentOfType<JetImportDirective>() != null
val qualifierExpected = refExpr.isDotReceiver() || ((refExpr.getParent() as? JetDotQualifiedExpression)?.isDotReceiver() ?: false) val qualifierExpected = refExpr.isDotReceiver() || ((refExpr.getParent() as? JetDotQualifiedExpression)?.isDotReceiver() ?: false)
if (inImport || qualifierExpected) { if (inImport || qualifierExpected) {
@@ -14,7 +14,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.jet.lang.resolve.scopes.receivers.Qualifier import org.jetbrains.jet.lang.resolve.scopes.receivers.Qualifier
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.* import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.*
import org.jetbrains.jet.lang.diagnostics.Errors import org.jetbrains.jet.lang.diagnostics.Errors
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import java.util.Collections import java.util.Collections
import org.jetbrains.jet.plugin.refactoring.getExtractionContainers import org.jetbrains.jet.plugin.refactoring.getExtractionContainers
@@ -39,7 +39,7 @@ object CreateFunctionOrPropertyFromCallActionFactory : JetSingleIntentionActionF
} }
Errors.NO_VALUE_FOR_PARAMETER, Errors.NO_VALUE_FOR_PARAMETER,
Errors.TOO_MANY_ARGUMENTS -> diagElement.getParentByType(javaClass<JetCallExpression>()) Errors.TOO_MANY_ARGUMENTS -> diagElement.getNonStrictParentOfType<JetCallExpression>()
else -> throw AssertionError("Unexpected diagnostic: ${diagnostic.getFactory()}") else -> throw AssertionError("Unexpected diagnostic: ${diagnostic.getFactory()}")
} as? JetExpression ?: return null } as? JetExpression ?: return null
@@ -10,7 +10,7 @@ import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.Functio
import org.jetbrains.jet.lang.psi.JetProperty import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.CallableInfo import org.jetbrains.jet.plugin.quickfix.createFromUsage.callableBuilder.CallableInfo
@@ -29,7 +29,7 @@ object CreatePropertyDelegateAccessorsActionFactory : JetSingleIntentionActionFa
val builtIns = KotlinBuiltIns.getInstance() val builtIns = KotlinBuiltIns.getInstance()
val property = expression.getParentByType(javaClass<JetProperty>()) ?: return null val property = expression.getNonStrictParentOfType<JetProperty>() ?: return null
val propertyDescriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, property] as? PropertyDescriptor val propertyDescriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, property] as? PropertyDescriptor
?: return null ?: return null
@@ -19,16 +19,18 @@ package org.jetbrains.jet.plugin.refactoring.changeSignature.usages
import org.jetbrains.jet.lang.psi.JetEnumEntry import org.jetbrains.jet.lang.psi.JetEnumEntry
import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeInfo import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeInfo
import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetClass import org.jetbrains.jet.lang.psi.JetClass
import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public class JetEnumEntryWithoutSuperCallUsage(enumEntry: JetEnumEntry) : JetUsageInfo<JetEnumEntry>(enumEntry) { public class JetEnumEntryWithoutSuperCallUsage(enumEntry: JetEnumEntry) : JetUsageInfo<JetEnumEntry>(enumEntry) {
override fun processUsage(changeInfo: JetChangeInfo, element: JetEnumEntry): Boolean { override fun processUsage(changeInfo: JetChangeInfo, element: JetEnumEntry): Boolean {
if (changeInfo.getNewParameters().size > 0) { if (changeInfo.getNewParameters().size > 0) {
val psiFactory = JetPsiFactory(element) val psiFactory = JetPsiFactory(element)
val enumClass = element.getParentByType(javaClass<JetClass>(), true)!! val enumClass = element.getStrictParentOfType<JetClass>()!!
val delegatorToSuperCall = element.addAfter( val delegatorToSuperCall = element.addAfter(
psiFactory.createDelegatorToSuperCall("${enumClass.getName()}()"), psiFactory.createDelegatorToSuperCall("${enumClass.getName()}()"),
element.getNameAsDeclaration() element.getNameAsDeclaration()
@@ -40,7 +40,7 @@ import org.jetbrains.jet.lang.psi.JetSuperExpression
import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.resolve.scopes.receivers.ThisReceiver import org.jetbrains.jet.lang.resolve.scopes.receivers.ThisReceiver
import org.jetbrains.jet.lang.descriptors.ClassKind import org.jetbrains.jet.lang.descriptors.ClassKind
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetDeclaration
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
import org.jetbrains.jet.lang.psi.JetUserType import org.jetbrains.jet.lang.psi.JetUserType
@@ -52,6 +52,8 @@ import org.jetbrains.jet.lang.psi.JetClassInitializer
import org.jetbrains.jet.lang.resolve.calls.callUtil.getResolvedCall import org.jetbrains.jet.lang.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
import org.jetbrains.jet.plugin.util.psi.patternMatching.JetPsiRange import org.jetbrains.jet.plugin.util.psi.patternMatching.JetPsiRange
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
data class ExtractionOptions( data class ExtractionOptions(
val inferUnitTypeForUnusedValues: Boolean, val inferUnitTypeForUnusedValues: Boolean,
@@ -84,7 +86,7 @@ data class ExtractionData(
val project: Project = originalFile.getProject() val project: Project = originalFile.getProject()
val originalElements: List<PsiElement> = originalRange.elements val originalElements: List<PsiElement> = originalRange.elements
val insertBefore: Boolean = targetSibling.getParentByType(javaClass<JetDeclaration>(), true)?.let { val insertBefore: Boolean = targetSibling.getStrictParentOfType<JetDeclaration>()?.let {
it is JetDeclarationWithBody || it is JetClassInitializer it is JetDeclarationWithBody || it is JetClassInitializer
} ?: false } ?: false
@@ -24,7 +24,7 @@ import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle
import org.jetbrains.jet.lang.psi.psiUtil.isInsideOf import org.jetbrains.jet.lang.psi.psiUtil.isInsideOf
import java.util.* import java.util.*
import org.jetbrains.jet.plugin.refactoring.createTempCopy import org.jetbrains.jet.plugin.refactoring.createTempCopy
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.plugin.refactoring.JetNameSuggester import org.jetbrains.jet.plugin.refactoring.JetNameSuggester
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
@@ -67,6 +67,8 @@ import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBo
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.plugin.caches.resolve.findModuleDescriptor import org.jetbrains.jet.plugin.caches.resolve.findModuleDescriptor
import org.jetbrains.jet.plugin.caches.resolve.analyze import org.jetbrains.jet.plugin.caches.resolve.analyze
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
private val DEFAULT_FUNCTION_NAME = "myFun" private val DEFAULT_FUNCTION_NAME = "myFun"
private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType() private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType()
@@ -214,7 +216,7 @@ private fun ExtractionData.analyzeControlFlow(
is ReturnValueInstruction -> { is ReturnValueInstruction -> {
val returnExpression = insn.returnExpressionIfAny val returnExpression = insn.returnExpressionIfAny
if (returnExpression == null) { if (returnExpression == null) {
val containingDeclaration = insn.returnedValue.element?.getParentByType(javaClass<JetDeclarationWithBody>()) val containingDeclaration = insn.returnedValue.element?.getNonStrictParentOfType<JetDeclarationWithBody>()
if (containingDeclaration == pseudocode.getCorrespondingElement()) { if (containingDeclaration == pseudocode.getCorrespondingElement()) {
defaultExits.add(insn) defaultExits.add(insn)
} }
@@ -355,7 +357,7 @@ fun ExtractionData.createTemporaryDeclaration(functionText: String): JetNamedDec
val tmpFile = originalFile.createTempCopy { text -> val tmpFile = originalFile.createTempCopy { text ->
StringBuilder(text).insert(insertPosition, insertText).toString() StringBuilder(text).insert(insertPosition, insertText).toString()
} }
return tmpFile.findElementAt(lookupPosition)?.getParentByType(javaClass<JetNamedDeclaration>())!! return tmpFile.findElementAt(lookupPosition)?.getNonStrictParentOfType<JetNamedDeclaration>()!!
} }
private fun ExtractionData.createTemporaryCodeBlock(): JetBlockExpression = private fun ExtractionData.createTemporaryCodeBlock(): JetBlockExpression =
@@ -378,7 +380,7 @@ private fun JetType.collectReferencedTypes(processTypeArguments: Boolean): List<
} }
fun JetTypeParameter.collectRelevantConstraints(): List<JetTypeConstraint> { fun JetTypeParameter.collectRelevantConstraints(): List<JetTypeConstraint> {
val typeConstraints = getParentByType(javaClass<JetTypeParameterListOwner>())?.getTypeConstraints() val typeConstraints = getNonStrictParentOfType<JetTypeParameterListOwner>()?.getTypeConstraints()
if (typeConstraints == null) return Collections.emptyList() if (typeConstraints == null) return Collections.emptyList()
return typeConstraints.filter { it.getSubjectTypeParameterName()?.getReference()?.resolve() == this} return typeConstraints.filter { it.getSubjectTypeParameterName()?.getReference()?.resolve() == this}
} }
@@ -534,7 +536,7 @@ private fun ExtractionData.inferParametersInfo(
when(it.getKind()) { when(it.getKind()) {
ClassKind.OBJECT, ClassKind.ENUM_CLASS -> it as ClassDescriptor ClassKind.OBJECT, ClassKind.ENUM_CLASS -> it as ClassDescriptor
ClassKind.CLASS_OBJECT, ClassKind.ENUM_ENTRY -> it.getContainingDeclaration() as? ClassDescriptor ClassKind.CLASS_OBJECT, ClassKind.ENUM_ENTRY -> it.getContainingDeclaration() as? ClassDescriptor
else -> if (ref.getParentByType(javaClass<JetTypeReference>()) != null) it as ClassDescriptor else null else -> if (ref.getNonStrictParentOfType<JetTypeReference>() != null) it as ClassDescriptor else null
} }
is ConstructorDescriptor -> it.getContainingDeclaration() is ConstructorDescriptor -> it.getContainingDeclaration()
@@ -598,7 +600,7 @@ private fun ExtractionData.inferParametersInfo(
} }
val varNameValidator = JetNameValidatorImpl( val varNameValidator = JetNameValidatorImpl(
commonParent.getParentByType(javaClass<JetExpression>()), commonParent.getNonStrictParentOfType<JetExpression>(),
originalElements.first, originalElements.first,
JetNameValidatorImpl.Target.PROPERTIES JetNameValidatorImpl.Target.PROPERTIES
) )
@@ -635,7 +637,7 @@ private fun ExtractionData.checkDeclarationsMovingOutOfScope(
val target = expression.getReference()?.resolve() val target = expression.getReference()?.resolve()
if (target is JetNamedDeclaration if (target is JetNamedDeclaration
&& target.isInsideOf(originalElements) && target.isInsideOf(originalElements)
&& target.getParentByType(javaClass<JetDeclaration>(), true) == enclosingDeclaration) { && target.getStrictParentOfType<JetDeclaration>() == enclosingDeclaration) {
declarationsOutOfScope.add(target) declarationsOutOfScope.add(target)
} }
} }
@@ -681,7 +683,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult {
val pseudocodeDeclaration = PsiTreeUtil.getParentOfType( val pseudocodeDeclaration = PsiTreeUtil.getParentOfType(
commonParent, javaClass<JetDeclarationWithBody>(), javaClass<JetClassOrObject>() commonParent, javaClass<JetDeclarationWithBody>(), javaClass<JetClassOrObject>()
) ?: commonParent.getParentByType(javaClass<JetProperty>()) ) ?: commonParent.getNonStrictParentOfType<JetProperty>()
?: return noContainerError ?: return noContainerError
val pseudocode = PseudocodeUtil.generatePseudocode(pseudocodeDeclaration, bindingContext) val pseudocode = PseudocodeUtil.generatePseudocode(pseudocodeDeclaration, bindingContext)
val localInstructions = getLocalInstructions(pseudocode) val localInstructions = getLocalInstructions(pseudocode)
@@ -720,7 +722,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult {
) )
} }
val enclosingDeclaration = commonParent.getParentByType(javaClass<JetDeclaration>(), true)!! val enclosingDeclaration = commonParent.getStrictParentOfType<JetDeclaration>()!!
checkDeclarationsMovingOutOfScope(enclosingDeclaration, controlFlow, bindingContext)?.let { messages.add(it) } checkDeclarationsMovingOutOfScope(enclosingDeclaration, controlFlow, bindingContext)?.let { messages.add(it) }
val functionNameValidator = val functionNameValidator =
@@ -21,7 +21,7 @@ import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import java.util.HashMap import java.util.HashMap
import org.jetbrains.jet.lang.psi.JetTreeVisitorVoid import org.jetbrains.jet.lang.psi.JetTreeVisitorVoid
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetNamedFunction import org.jetbrains.jet.lang.psi.JetNamedFunction
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
@@ -59,6 +59,8 @@ import org.jetbrains.jet.plugin.util.psi.patternMatching.UnificationResult.Stron
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.lang.psi.psiUtil.parents import org.jetbrains.jet.lang.psi.psiUtil.parents
import java.util.ArrayList import java.util.ArrayList
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
fun ExtractableCodeDescriptor.getDeclarationText( fun ExtractableCodeDescriptor.getDeclarationText(
options: ExtractionGeneratorOptions = ExtractionGeneratorOptions.DEFAULT, options: ExtractionGeneratorOptions = ExtractionGeneratorOptions.DEFAULT,
@@ -107,7 +109,7 @@ fun createNameCounterpartMap(from: JetElement, to: JetElement): Map<JetSimpleNam
object: JetTreeVisitorVoid() { object: JetTreeVisitorVoid() {
override fun visitSimpleNameExpression(expression: JetSimpleNameExpression) { override fun visitSimpleNameExpression(expression: JetSimpleNameExpression) {
val offset = expression.getTextRange()!!.getStartOffset() - fromOffset val offset = expression.getTextRange()!!.getStartOffset() - fromOffset
val newExpression = to.findElementAt(offset)?.getParentByType(javaClass<JetSimpleNameExpression>()) val newExpression = to.findElementAt(offset)?.getNonStrictParentOfType<JetSimpleNameExpression>()
assert(newExpression!= null, "Couldn't find expression at $offset in '${to.getText()}'") assert(newExpression!= null, "Couldn't find expression at $offset in '${to.getText()}'")
map[expression] = newExpression!! map[expression] = newExpression!!
@@ -200,7 +202,7 @@ private fun makeCall(
fun insertCall(anchor: PsiElement, wrappedCall: JetExpression) { fun insertCall(anchor: PsiElement, wrappedCall: JetExpression) {
val firstExpression = rangeToReplace.elements.firstOrNull { it is JetExpression } as? JetExpression val firstExpression = rangeToReplace.elements.firstOrNull { it is JetExpression } as? JetExpression
if (firstExpression?.isFunctionLiteralOutsideParentheses() ?: false) { if (firstExpression?.isFunctionLiteralOutsideParentheses() ?: false) {
val functionLiteralArgument = PsiTreeUtil.getParentOfType(firstExpression, javaClass<JetFunctionLiteralArgument>())!! val functionLiteralArgument = firstExpression?.getStrictParentOfType<JetFunctionLiteralArgument>()!!
functionLiteralArgument.moveInsideParenthesesAndReplaceWith(wrappedCall, extractableDescriptor.originalContext) functionLiteralArgument.moveInsideParenthesesAndReplaceWith(wrappedCall, extractableDescriptor.originalContext)
return return
} }
@@ -402,7 +404,7 @@ fun ExtractableCodeDescriptor.generateDeclaration(options: ExtractionGeneratorOp
* before calls/types themselves * before calls/types themselves
*/ */
for ((offsetInBody, resolveResult) in extractionData.refOffsetToDeclaration.entrySet().sortDescendingBy { it.key }) { for ((offsetInBody, resolveResult) in extractionData.refOffsetToDeclaration.entrySet().sortDescendingBy { it.key }) {
val expr = file.findElementAt(bodyOffset + offsetInBody)?.getParentByType(javaClass<JetSimpleNameExpression>()) val expr = file.findElementAt(bodyOffset + offsetInBody)?.getNonStrictParentOfType<JetSimpleNameExpression>()
assert(expr != null, "Couldn't find expression at $offsetInBody in '${body.getText()}'") assert(expr != null, "Couldn't find expression at $offsetInBody in '${body.getText()}'")
originalOffsetByExpr[expr!!] = offsetInBody originalOffsetByExpr[expr!!] = offsetInBody
@@ -422,7 +424,7 @@ fun ExtractableCodeDescriptor.generateDeclaration(options: ExtractionGeneratorOp
replacingReturn = psiFactory.createExpression(if (jumpValue.conditional) "return true" else "return") replacingReturn = psiFactory.createExpression(if (jumpValue.conditional) "return true" else "return")
expressionsToReplaceWithReturn = jumpValue.elementsToReplace.map { jumpElement -> expressionsToReplaceWithReturn = jumpValue.elementsToReplace.map { jumpElement ->
val offsetInBody = jumpElement.getTextRange()!!.getStartOffset() - extractionData.originalStartOffset!! val offsetInBody = jumpElement.getTextRange()!!.getStartOffset() - extractionData.originalStartOffset!!
val expr = file.findElementAt(bodyOffset + offsetInBody)?.getParentByType(jumpElement.javaClass) val expr = file.findElementAt(bodyOffset + offsetInBody)?.getNonStrictParentOfType(jumpElement.javaClass)
assert(expr != null, "Couldn't find expression at $offsetInBody in '${body.getText()}'") assert(expr != null, "Couldn't find expression at $offsetInBody in '${body.getText()}'")
expr!! expr!!
@@ -56,7 +56,6 @@ import com.intellij.openapi.ui.popup.JBPopupAdapter
import com.intellij.openapi.ui.popup.LightweightWindowEvent import com.intellij.openapi.ui.popup.LightweightWindowEvent
import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiDocumentManager
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
import com.intellij.psi.PsiNamedElement import com.intellij.psi.PsiNamedElement
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
@@ -65,6 +64,9 @@ import com.intellij.openapi.util.text.StringUtil
import javax.swing.Icon import javax.swing.Icon
import org.jetbrains.jet.plugin.util.string.collapseSpaces import org.jetbrains.jet.plugin.util.string.collapseSpaces
import org.jetbrains.jet.plugin.caches.resolve.analyze import org.jetbrains.jet.plugin.caches.resolve.analyze
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
fun <T: Any> PsiElement.getAndRemoveCopyableUserData(key: Key<T>): T? { fun <T: Any> PsiElement.getAndRemoveCopyableUserData(key: Key<T>): T? {
val data = getCopyableUserData(key) val data = getCopyableUserData(key)
@@ -131,8 +133,8 @@ public fun PsiElement.getAllExtractionContainers(strict: Boolean = true): List<J
public fun PsiElement.getExtractionContainers(strict: Boolean = true, includeAll: Boolean = false): List<JetElement> { public fun PsiElement.getExtractionContainers(strict: Boolean = true, includeAll: Boolean = false): List<JetElement> {
if (includeAll) return getAllExtractionContainers(strict) if (includeAll) return getAllExtractionContainers(strict)
val declaration = getParentByType(javaClass<JetDeclaration>(), strict)?.let { declaration -> val declaration = getParentOfType<JetDeclaration>(strict)?.let { declaration ->
stream(declaration) { it.getParentByType(javaClass<JetDeclaration>(), true) }.firstOrNull { it !is JetFunctionLiteral } stream(declaration) { it.getStrictParentOfType<JetDeclaration>() }.firstOrNull { it !is JetFunctionLiteral }
} ?: return Collections.emptyList() } ?: return Collections.emptyList()
val parent = declaration.getParent()?.let { val parent = declaration.getParent()?.let {
@@ -259,7 +261,7 @@ fun PsiElement.getLineCount(): Int {
fun PsiElement.isMultiLine(): Boolean = getLineCount() > 1 fun PsiElement.isMultiLine(): Boolean = getLineCount() > 1
public fun JetElement.getContextForContainingDeclarationBody(): BindingContext? { public fun JetElement.getContextForContainingDeclarationBody(): BindingContext? {
val enclosingDeclaration = getParentByType(javaClass<JetDeclaration>(), true) val enclosingDeclaration = getStrictParentOfType<JetDeclaration>()
val bodyElement = when (enclosingDeclaration) { val bodyElement = when (enclosingDeclaration) {
is JetDeclarationWithBody -> enclosingDeclaration.getBodyExpression() is JetDeclarationWithBody -> enclosingDeclaration.getBodyExpression()
is JetWithExpressionInitializer -> enclosingDeclaration.getInitializer() is JetWithExpressionInitializer -> enclosingDeclaration.getInitializer()
@@ -291,7 +293,7 @@ public fun chooseContainerElement<T>(
return (getParent() as JetProperty).renderName() + if (isGetter()) ".get" else ".set" return (getParent() as JetProperty).renderName() + if (isGetter()) ".get" else ".set"
} }
if (this is JetObjectDeclaration && this.isClassObject()) { if (this is JetObjectDeclaration && this.isClassObject()) {
return "Class object of ${getParentByType(javaClass<JetClassOrObject>(), true)?.renderName() ?: "<anonymous>"}" return "Class object of ${getStrictParentOfType<JetClassOrObject>()?.renderName() ?: "<anonymous>"}"
} }
return (this as? PsiNamedElement)?.getName() ?: "<anonymous>" return (this as? PsiNamedElement)?.getName() ?: "<anonymous>"
} }
@@ -41,7 +41,7 @@ import com.intellij.psi.PsiReference
import com.intellij.refactoring.util.MoveRenameUsageInfo import com.intellij.refactoring.util.MoveRenameUsageInfo
import org.jetbrains.jet.plugin.references.JetReference import org.jetbrains.jet.plugin.references.JetReference
import org.jetbrains.jet.asJava.namedUnwrappedElement import org.jetbrains.jet.asJava.namedUnwrappedElement
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.JetImportDirective import org.jetbrains.jet.lang.psi.JetImportDirective
import java.util.ArrayList import java.util.ArrayList
import com.intellij.refactoring.util.NonCodeUsageInfo import com.intellij.refactoring.util.NonCodeUsageInfo
@@ -158,7 +158,7 @@ fun createMoveUsageInfo(
if (reference is JetReference if (reference is JetReference
&& referencedElement.namedUnwrappedElement!!.isExtensionDeclaration() && referencedElement.namedUnwrappedElement!!.isExtensionDeclaration()
&& element.getParentByType(javaClass<JetImportDirective>()) == null) { && element.getNonStrictParentOfType<JetImportDirective>() == null) {
return MoveRenameUsageInfoForExtension( return MoveRenameUsageInfoForExtension(
element, reference, startOffset, endOffset, referencedElement, element.getContainingFile()!!, addImportToOriginalFile element, reference, startOffset, endOffset, referencedElement, element.getContainingFile()!!, addImportToOriginalFile
) )
@@ -21,7 +21,6 @@ import com.intellij.usageView.UsageInfo
import java.util.ArrayList import java.util.ArrayList
import com.intellij.refactoring.util.MoveRenameUsageInfo import com.intellij.refactoring.util.MoveRenameUsageInfo
import org.jetbrains.jet.plugin.references.JetMultiDeclarationReference import org.jetbrains.jet.plugin.references.JetMultiDeclarationReference
import org.jetbrains.jet.lang.psi.psiUtil.getParentByTypeAndBranch
import org.jetbrains.jet.lang.psi.JetWhenConditionInRange import org.jetbrains.jet.lang.psi.JetWhenConditionInRange
import com.intellij.refactoring.rename.UnresolvableCollisionUsageInfo import com.intellij.refactoring.rename.UnresolvableCollisionUsageInfo
import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle
@@ -26,7 +26,7 @@ import org.jetbrains.jet.asJava.unwrapped
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.plugin.references.JetReference import org.jetbrains.jet.plugin.references.JetReference
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.isAncestor import org.jetbrains.jet.lang.psi.psiUtil.isAncestor
import org.jetbrains.jet.lang.psi.psiUtil.parameterIndex import org.jetbrains.jet.lang.psi.psiUtil.parameterIndex
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
@@ -40,7 +40,7 @@ public class KotlinJavaSafeDeleteDelegate : JavaSafeDeleteDelegate {
val element = reference.getElement() as JetElement val element = reference.getElement() as JetElement
val callExpression = element.getParentByType(javaClass<JetCallExpression>()) val callExpression = element.getNonStrictParentOfType<JetCallExpression>()
if (callExpression == null) return if (callExpression == null) return
val calleeExpression = callExpression.getCalleeExpression() val calleeExpression = callExpression.getCalleeExpression()
@@ -42,7 +42,7 @@ import org.jetbrains.jet.plugin.JetBundle
import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil
import org.jetbrains.jet.plugin.references.JetReference import org.jetbrains.jet.plugin.references.JetReference
import java.util.* import java.util.*
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.deleteElementAndCleanParent import org.jetbrains.jet.lang.psi.psiUtil.deleteElementAndCleanParent
import org.jetbrains.jet.plugin.caches.resolve.analyze import org.jetbrains.jet.plugin.caches.resolve.analyze
@@ -88,9 +88,9 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
is SafeDeleteReferenceJavaDeleteUsageInfo -> is SafeDeleteReferenceJavaDeleteUsageInfo ->
usageInfo.getElement()?.let { usageElement -> usageInfo.getElement()?.let { usageElement ->
if (usageElement.getParentByType(javaClass<JetValueArgumentName>()) != null) null if (usageElement.getNonStrictParentOfType<JetValueArgumentName>() != null) null
else { else {
usageElement.getParentByType(javaClass<JetImportDirective>())?.let { importDirective -> usageElement.getNonStrictParentOfType<JetImportDirective>()?.let { importDirective ->
SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as JetDeclaration) SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as JetDeclaration)
} ?: if (forceReferencedElementUnwrapping) { } ?: if (forceReferencedElementUnwrapping) {
SafeDeleteReferenceJavaDeleteUsageInfo(usageElement, element.unwrapped, usageInfo.isSafeDelete()) SafeDeleteReferenceJavaDeleteUsageInfo(usageElement, element.unwrapped, usageInfo.isSafeDelete())
@@ -126,7 +126,7 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
.stream() .stream()
.filterNot { reference -> getIgnoranceCondition().value(reference.getElement()) } .filterNot { reference -> getIgnoranceCondition().value(reference.getElement()) }
.mapTo(usages) { reference -> .mapTo(usages) { reference ->
reference.getElement().getParentByType(javaClass<JetImportDirective>())?.let { importDirective -> reference.getElement().getNonStrictParentOfType<JetImportDirective>()?.let { importDirective ->
SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as JetDeclaration) SafeDeleteImportDirectiveUsageInfo(importDirective, element.unwrapped as JetDeclaration)
} ?: SafeDeleteReferenceSimpleDeleteUsageInfo(element, declaration, false) } ?: SafeDeleteReferenceSimpleDeleteUsageInfo(element, declaration, false)
} }
@@ -135,7 +135,7 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
} }
fun findTypeParameterUsages(parameter: JetTypeParameter) { fun findTypeParameterUsages(parameter: JetTypeParameter) {
val owner = parameter.getParentByType(javaClass<JetTypeParameterListOwner>()) val owner = parameter.getNonStrictParentOfType<JetTypeParameterListOwner>()
if (owner == null) return if (owner == null) return
val parameterList = owner.getTypeParameters() val parameterList = owner.getTypeParameters()
@@ -146,9 +146,9 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
val referencedElement = reference.getElement() val referencedElement = reference.getElement()
val argList = referencedElement.getParentByType(javaClass<JetUserType>())?.let { jetType -> val argList = referencedElement.getNonStrictParentOfType<JetUserType>()?.let { jetType ->
jetType.getTypeArgumentList() jetType.getTypeArgumentList()
} ?: referencedElement.getParentByType(javaClass<JetCallExpression>())?.let { callExpression -> } ?: referencedElement.getNonStrictParentOfType<JetCallExpression>()?.let { callExpression ->
callExpression.getTypeArgumentList() callExpression.getTypeArgumentList()
} ?: null } ?: null
@@ -202,7 +202,7 @@ public class KotlinSafeDeleteProcessor : JavaSafeDeleteProcessor() {
override fun findConflicts(element: PsiElement, allElementsToDelete: Array<out PsiElement>): MutableCollection<String>? { override fun findConflicts(element: PsiElement, allElementsToDelete: Array<out PsiElement>): MutableCollection<String>? {
if (element is JetNamedFunction || element is JetProperty) { if (element is JetNamedFunction || element is JetProperty) {
val jetClass = element.getParentByType(javaClass<JetClass>()) val jetClass = element.getNonStrictParentOfType<JetClass>()
if (jetClass == null || jetClass.getBody() != element.getParent()) return null if (jetClass == null || jetClass.getBody() != element.getParent()) return null
val modifierList = jetClass.getModifierList() val modifierList = jetClass.getModifierList()
@@ -37,7 +37,7 @@ public fun PsiElement.canDeleteElement(): Boolean {
if (isObjectLiteral()) return false if (isObjectLiteral()) return false
if (this is JetParameter) { if (this is JetParameter) {
val declaration = getParentByType(javaClass<JetDeclaration>(), true) val declaration = getStrictParentOfType<JetDeclaration>()
return declaration != null && !(declaration is JetPropertyAccessor && declaration.isSetter()) return declaration != null && !(declaration is JetPropertyAccessor && declaration.isSetter())
} }
@@ -19,7 +19,6 @@ package org.jetbrains.jet.completion
import org.jetbrains.jet.plugin.PluginTestCaseBase import org.jetbrains.jet.plugin.PluginTestCaseBase
import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.JetExpression
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.plugin.completion.renderDataFlowValue import org.jetbrains.jet.plugin.completion.renderDataFlowValue
import org.jetbrains.jet.JetTestUtils import org.jetbrains.jet.JetTestUtils
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
@@ -29,6 +28,7 @@ import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo
import org.jetbrains.jet.plugin.caches.resolve.analyze import org.jetbrains.jet.plugin.caches.resolve.analyze
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
public abstract class AbstractDataFlowValueRenderingTest: JetLightCodeInsightFixtureTestCase() { public abstract class AbstractDataFlowValueRenderingTest: JetLightCodeInsightFixtureTestCase() {
override fun getTestDataPath() : String { override fun getTestDataPath() : String {
@@ -45,7 +45,7 @@ public abstract class AbstractDataFlowValueRenderingTest: JetLightCodeInsightFix
val jetFile = fixture.getFile() as JetFile val jetFile = fixture.getFile() as JetFile
val element = jetFile.findElementAt(fixture.getCaretOffset()) val element = jetFile.findElementAt(fixture.getCaretOffset())
val expression = PsiTreeUtil.getParentOfType(element, javaClass<JetExpression>())!! val expression = element.getStrictParentOfType<JetExpression>()!!
val info = expression.analyze().getDataFlowInfo(expression) val info = expression.analyze().getDataFlowInfo(expression)
val allValues = (info.getCompleteTypeInfo().keySet() + info.getCompleteNullabilityInfo().keySet()).toSet() val allValues = (info.getCompleteTypeInfo().keySet() + info.getCompleteNullabilityInfo().keySet()).toSet()
@@ -22,7 +22,7 @@ import org.jetbrains.jet.plugin.PluginTestCaseBase
import java.io.File import java.io.File
import com.intellij.refactoring.move.moveMembers.MoveMembersProcessor import com.intellij.refactoring.move.moveMembers.MoveMembersProcessor
import com.intellij.refactoring.move.moveMembers.MockMoveMembersOptions import com.intellij.refactoring.move.moveMembers.MockMoveMembersOptions
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import com.intellij.psi.PsiMember import com.intellij.psi.PsiMember
import com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsException import com.intellij.refactoring.BaseRefactoringProcessor.ConflictsInTestsException
import com.google.gson.JsonObject import com.google.gson.JsonObject
@@ -141,7 +141,7 @@ public abstract class AbstractJetMoveTest : MultiFileTestCase() {
enum class MoveAction { enum class MoveAction {
MOVE_MEMBERS { MOVE_MEMBERS {
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
val member = elementAtCaret!!.getParentByType(javaClass<PsiMember>())!! val member = elementAtCaret!!.getNonStrictParentOfType<PsiMember>()!!
val targetClassName = config.getString("targetClass") val targetClassName = config.getString("targetClass")
val visibility = config.getNullableString("visibility") val visibility = config.getNullableString("visibility")
@@ -156,7 +156,7 @@ enum class MoveAction {
MOVE_TOP_LEVEL_CLASSES { MOVE_TOP_LEVEL_CLASSES {
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
val classToMove = elementAtCaret!!.getParentByType(javaClass<PsiClass>())!! val classToMove = elementAtCaret!!.getNonStrictParentOfType<PsiClass>()!!
val targetPackage = config.getString("targetPackage") val targetPackage = config.getString("targetPackage")
MoveClassesOrPackagesProcessor( MoveClassesOrPackagesProcessor(
@@ -191,7 +191,7 @@ enum class MoveAction {
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
val project = mainFile.getProject() val project = mainFile.getProject()
val classToMove = elementAtCaret!!.getParentByType(javaClass<PsiClass>())!! val classToMove = elementAtCaret!!.getNonStrictParentOfType<PsiClass>()!!
val targetClass = config.getString("targetClass") val targetClass = config.getString("targetClass")
MoveClassToInnerProcessor( MoveClassToInnerProcessor(
@@ -209,7 +209,7 @@ enum class MoveAction {
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
val project = mainFile.getProject() val project = mainFile.getProject()
val classToMove = elementAtCaret!!.getParentByType(javaClass<PsiClass>())!! val classToMove = elementAtCaret!!.getNonStrictParentOfType<PsiClass>()!!
val newClassName = config.getNullableString("newClassName") ?: classToMove.getName()!! val newClassName = config.getNullableString("newClassName") ?: classToMove.getName()!!
val outerInstanceParameterName = config.getNullableString("outerInstanceParameterName") val outerInstanceParameterName = config.getNullableString("outerInstanceParameterName")
val targetPackage = config.getString("targetPackage") val targetPackage = config.getString("targetPackage")
@@ -258,7 +258,7 @@ enum class MoveAction {
MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS { MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS {
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
val project = mainFile.getProject() val project = mainFile.getProject()
val elementToMove = elementAtCaret!!.getParentByType(javaClass<JetNamedDeclaration>())!! val elementToMove = elementAtCaret!!.getNonStrictParentOfType<JetNamedDeclaration>()!!
val moveTarget = config.getNullableString("targetPackage")?.let { packageName -> val moveTarget = config.getNullableString("targetPackage")?.let { packageName ->
MoveDestinationKotlinMoveTarget(MultipleRootsMoveDestination(PackageWrapper(mainFile.getManager(), packageName))) MoveDestinationKotlinMoveTarget(MultipleRootsMoveDestination(PackageWrapper(mainFile.getManager(), packageName)))
@@ -18,7 +18,7 @@ package org.jetbrains.jet.resolve
import org.jetbrains.jet.plugin.JetLightCodeInsightFixtureTestCase import org.jetbrains.jet.plugin.JetLightCodeInsightFixtureTestCase
import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.JetTestCaseBuilder import org.jetbrains.jet.JetTestCaseBuilder
import org.jetbrains.jet.plugin.JetWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.jet.plugin.JetWithJdkAndRuntimeLightProjectDescriptor
@@ -59,7 +59,7 @@ public abstract class AbstractPartialBodyResolveTest : JetLightCodeInsightFixtur
else { else {
val offset = editor.getCaretModel().getOffset() val offset = editor.getCaretModel().getOffset()
val element = file.findElementAt(offset) val element = file.findElementAt(offset)
element.getParentByType(javaClass<JetSimpleNameExpression>()) ?: error("No JetSimpleNameExpression at caret") element.getNonStrictParentOfType<JetSimpleNameExpression>() ?: error("No JetSimpleNameExpression at caret")
} }
val resolutionFacade = file.getResolutionFacade() val resolutionFacade = file.getResolutionFacade()
@@ -28,7 +28,7 @@ import org.jetbrains.jet.asJava.KotlinLightMethod
import org.jetbrains.jet.lang.psi.JetProperty import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.psi.JetFunction import org.jetbrains.jet.lang.psi.JetFunction
import org.jetbrains.jet.lang.psi.JetClassOrObject import org.jetbrains.jet.lang.psi.JetClassOrObject
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration
import org.jetbrains.jet.lang.psi.JetPropertyAccessor import org.jetbrains.jet.lang.psi.JetPropertyAccessor
import org.jetbrains.jet.lang.psi.JetParameter import org.jetbrains.jet.lang.psi.JetParameter
@@ -37,6 +37,8 @@ import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType
import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.asJava.KotlinLightField import org.jetbrains.jet.asJava.KotlinLightField
import org.jetbrains.jet.lang.psi.JetObjectDeclaration import org.jetbrains.jet.lang.psi.JetObjectDeclaration
import org.jetbrains.jet.lang.psi.psiUtil.getParentOfType
import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
trait ExpressionConverter { trait ExpressionConverter {
fun convertExpression(expression: PsiExpression, codeConverter: CodeConverter): Expression fun convertExpression(expression: PsiExpression, codeConverter: CodeConverter): Expression
@@ -70,7 +72,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
} }
override fun visitArrayAccessExpression(expression: PsiArrayAccessExpression) { override fun visitArrayAccessExpression(expression: PsiArrayAccessExpression) {
val assignment = PsiTreeUtil.getParentOfType(expression, javaClass<PsiAssignmentExpression>()) val assignment = expression.getStrictParentOfType<PsiAssignmentExpression>()
val lvalue = assignment != null && expression == assignment.getLExpression(); val lvalue = assignment != null && expression == assignment.getLExpression();
result = ArrayAccessExpression(codeConverter.convertExpression(expression.getArrayExpression()), result = ArrayAccessExpression(codeConverter.convertExpression(expression.getArrayExpression()),
codeConverter.convertExpression(expression.getIndexExpression()), codeConverter.convertExpression(expression.getIndexExpression()),
@@ -211,7 +213,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
if (target is KotlinLightMethod) { if (target is KotlinLightMethod) {
val origin = target.origin val origin = target.origin
val isTopLevel = origin?.getParentByType(javaClass<JetClassOrObject>(), true) == null val isTopLevel = origin?.getStrictParentOfType<JetClassOrObject>() == null
if (origin is JetProperty || origin is JetPropertyAccessor || origin is JetParameter) { if (origin is JetProperty || origin is JetPropertyAccessor || origin is JetParameter) {
val property = if (origin is JetPropertyAccessor) val property = if (origin is JetPropertyAccessor)
origin.getParent() as JetProperty origin.getParent() as JetProperty