Uast: unifying resolve to two methods resolveToDeclaration and resolveToPsiMethod
This commit is contained in:
@@ -63,7 +63,9 @@ abstract class KotlinUAnnotationBase<T : KtCallElement>(
|
||||
|
||||
protected abstract fun computeClassDescriptor(): ClassDescriptor?
|
||||
|
||||
override fun resolve(): PsiClass? = computeClassDescriptor()?.toSource()?.getMaybeLightElement() as? PsiClass
|
||||
override fun resolve(): PsiClass? = computeClassDescriptor()?.let {
|
||||
sourcePsi.calleeExpression?.let { ktExpression -> resolveToDeclaration(ktExpression, it) }
|
||||
} as? PsiClass
|
||||
|
||||
override fun findAttributeValue(name: String?): UExpression? =
|
||||
findDeclaredAttributeValue(name) ?: findAttributeDefaultValue(name ?: "value")
|
||||
|
||||
+1
-4
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.psi.KtImportDirective
|
||||
import org.jetbrains.kotlin.psi.KtReferenceExpression
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UImportStatement
|
||||
import org.jetbrains.uast.USimpleNameReferenceExpression
|
||||
@@ -63,9 +62,7 @@ class KotlinUImportStatement(
|
||||
|
||||
override fun resolve(): PsiElement? {
|
||||
val reference = psi.getQualifiedElementSelector() as? KtReferenceExpression ?: return null
|
||||
val bindingContext = reference.analyze()
|
||||
val referenceTarget = bindingContext[BindingContext.REFERENCE_TARGET, reference] ?: return null
|
||||
return referenceTarget.toSource()?.getMaybeLightElement()
|
||||
return resolveToDeclaration(reference)
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.uast.kotlin
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiNamedElement
|
||||
import com.intellij.psi.ResolveResult
|
||||
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
|
||||
@@ -45,7 +46,7 @@ class KotlinUCallableReferenceExpression(
|
||||
override val resolvedName: String?
|
||||
get() = (resolve() as? PsiNamedElement)?.name
|
||||
|
||||
override fun resolve() = sourcePsi.callableReference.resolveCallToDeclaration()
|
||||
override fun resolve(): PsiElement? = resolveToDeclaration(sourcePsi.callableReference)
|
||||
|
||||
override fun multiResolve(): Iterable<ResolveResult> = getResolveResultVariants(sourcePsi.callableReference)
|
||||
|
||||
|
||||
+3
-1
@@ -16,8 +16,10 @@
|
||||
|
||||
package org.jetbrains.uast.kotlin
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiNamedElement
|
||||
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.uast.UCallExpression
|
||||
import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UQualifiedReferenceExpression
|
||||
@@ -33,7 +35,7 @@ class KotlinUQualifiedReferenceExpression(
|
||||
override val selector by lz { KotlinConverter.convertOrEmpty(sourcePsi.selectorExpression, this) }
|
||||
override val accessType = UastQualifiedExpressionAccessType.SIMPLE
|
||||
|
||||
override fun resolve() = sourcePsi.selectorExpression?.resolveCallToDeclaration()
|
||||
override fun resolve(): PsiElement? = sourcePsi.selectorExpression?.let { resolveToDeclaration(it) }
|
||||
|
||||
override val resolvedName: String?
|
||||
get() = (resolve() as? PsiNamedElement)?.name
|
||||
|
||||
+2
-1
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.uast.kotlin
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiNamedElement
|
||||
import com.intellij.psi.ResolveResult
|
||||
import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression
|
||||
@@ -36,6 +37,6 @@ class KotlinUSafeQualifiedExpression(
|
||||
override val resolvedName: String?
|
||||
get() = (resolve() as? PsiNamedElement)?.name
|
||||
|
||||
override fun resolve() = sourcePsi.selectorExpression?.resolveCallToDeclaration()
|
||||
override fun resolve(): PsiElement? = sourcePsi.selectorExpression?.let { resolveToDeclaration(it) }
|
||||
override fun multiResolve(): Iterable<ResolveResult> = getResolveResultVariants(sourcePsi.selectorExpression)
|
||||
}
|
||||
+9
-61
@@ -16,22 +16,20 @@
|
||||
|
||||
package org.jetbrains.uast.kotlin
|
||||
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import com.intellij.psi.PsiClassType
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiMethod
|
||||
import com.intellij.psi.PsiNamedElement
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
|
||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.constant
|
||||
import org.jetbrains.uast.*
|
||||
import org.jetbrains.uast.internal.acceptList
|
||||
import org.jetbrains.uast.internal.log
|
||||
@@ -43,31 +41,7 @@ open class KotlinUSimpleReferenceExpression(
|
||||
override val sourcePsi: KtSimpleNameExpression,
|
||||
givenParent: UElement?
|
||||
) : KotlinAbstractUExpression(givenParent), USimpleNameReferenceExpression, KotlinUElementWithType, KotlinEvaluatableUElement {
|
||||
private val resolvedDeclaration: PsiElement? by lz {
|
||||
sourcePsi.resolveCallToDeclaration()?.let { return@lz it }
|
||||
|
||||
var declarationDescriptor = sourcePsi.analyze()[BindingContext.REFERENCE_TARGET, sourcePsi] ?: return@lz null
|
||||
if (declarationDescriptor is ImportedFromObjectCallableDescriptor<*>) {
|
||||
declarationDescriptor = declarationDescriptor.callableFromObject
|
||||
}
|
||||
if (declarationDescriptor is SyntheticJavaPropertyDescriptor) {
|
||||
declarationDescriptor = when (sourcePsi.readWriteAccess()) {
|
||||
ReferenceAccess.WRITE, ReferenceAccess.READ_WRITE ->
|
||||
declarationDescriptor.setMethod ?: declarationDescriptor.getMethod
|
||||
ReferenceAccess.READ -> declarationDescriptor.getMethod
|
||||
}
|
||||
}
|
||||
|
||||
if (declarationDescriptor is PackageViewDescriptor) {
|
||||
return@lz JavaPsiFacade.getInstance(sourcePsi.project).findPackage(declarationDescriptor.fqName.asString())
|
||||
}
|
||||
|
||||
resolveToPsiClass(this, declarationDescriptor, sourcePsi)?.let { return@lz it }
|
||||
if (declarationDescriptor is DeclarationDescriptorWithSource) {
|
||||
declarationDescriptor.source.getPsi()?.let { it.getMaybeLightElement() ?: it }?.let { return@lz it }
|
||||
}
|
||||
return@lz resolveDeserialized(sourcePsi, declarationDescriptor, sourcePsi.readWriteAccess())
|
||||
}
|
||||
private val resolvedDeclaration: PsiElement? by lz { resolveToDeclaration(sourcePsi) }
|
||||
|
||||
override val identifier get() = sourcePsi.getReferencedName()
|
||||
|
||||
@@ -190,31 +164,6 @@ open class KotlinUSimpleReferenceExpression(
|
||||
override fun resolve(): PsiMethod? = resolveToPsiMethod(sourcePsi, accessorDescriptor)
|
||||
}
|
||||
|
||||
private fun KtExpression.readWriteAccess(): ReferenceAccess {
|
||||
var expression = getQualifiedExpressionForSelectorOrThis()
|
||||
loop@ while (true) {
|
||||
val parent = expression.parent
|
||||
when (parent) {
|
||||
is KtParenthesizedExpression, is KtAnnotatedExpression, is KtLabeledExpression -> expression = parent as KtExpression
|
||||
else -> break@loop
|
||||
}
|
||||
}
|
||||
|
||||
val assignment = expression.getAssignmentByLHS()
|
||||
if (assignment != null) {
|
||||
return when (assignment.operationToken) {
|
||||
KtTokens.EQ -> ReferenceAccess.WRITE
|
||||
else -> ReferenceAccess.READ_WRITE
|
||||
}
|
||||
}
|
||||
|
||||
return if ((expression.parent as? KtUnaryExpression)?.operationToken
|
||||
in constant { setOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS) }
|
||||
)
|
||||
ReferenceAccess.READ_WRITE
|
||||
else
|
||||
ReferenceAccess.READ
|
||||
}
|
||||
}
|
||||
|
||||
class KotlinClassViaConstructorUSimpleReferenceExpression(
|
||||
@@ -228,8 +177,7 @@ class KotlinClassViaConstructorUSimpleReferenceExpression(
|
||||
private val resolved by lazy {
|
||||
when (val resultingDescriptor = sourcePsi.getResolvedCall(sourcePsi.analyze())?.descriptorForResolveViaConstructor()) {
|
||||
is ConstructorDescriptor -> {
|
||||
resultingDescriptor.constructedClass.toSource()?.getMaybeLightElement()
|
||||
?: (resultingDescriptor as? DeserializedCallableMemberDescriptor)?.let { resolveContainingDeserializedClass(sourcePsi, it) }
|
||||
sourcePsi.calleeExpression?.let { resolveToDeclaration(it, resultingDescriptor) }
|
||||
}
|
||||
is SamConstructorDescriptor ->
|
||||
(resultingDescriptor.returnType?.getFunctionalInterfaceType(this, sourcePsi) as? PsiClassType)?.resolve()
|
||||
|
||||
+80
-18
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.builtins.isBuiltinFunctionalTypeOrSubtype
|
||||
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment
|
||||
import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
|
||||
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor
|
||||
@@ -48,10 +49,13 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature
|
||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parents
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableTypeConstructor
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch
|
||||
@@ -60,14 +64,17 @@ import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
|
||||
import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
|
||||
import org.jetbrains.kotlin.resolve.constants.IntegerValueTypeConstructor
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
|
||||
import org.jetbrains.kotlin.synthetic.SamAdapterExtensionFunctionDescriptor
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||
import org.jetbrains.kotlin.type.MapPsiToAsmDesc
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.types.typeUtil.builtIns
|
||||
import org.jetbrains.kotlin.types.typeUtil.contains
|
||||
import org.jetbrains.kotlin.types.typeUtil.isInterface
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.constant
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
import org.jetbrains.uast.*
|
||||
@@ -132,7 +139,7 @@ internal fun resolveToPsiMethod(
|
||||
internal fun getContainingLightClass(original: KtDeclaration): KtLightClass? =
|
||||
(original.containingClassOrObject?.toLightClass() ?: original.containingKtFile.findFacadeClass())
|
||||
|
||||
internal fun resolveContainingDeserializedClass(context: KtElement, memberDescriptor: DeserializedCallableMemberDescriptor): PsiClass? {
|
||||
private fun resolveContainingDeserializedClass(context: KtElement, memberDescriptor: DeserializedCallableMemberDescriptor): PsiClass? {
|
||||
val containingDeclaration = memberDescriptor.containingDeclaration
|
||||
return when (containingDeclaration) {
|
||||
is LazyJavaPackageFragment -> {
|
||||
@@ -142,24 +149,24 @@ internal fun resolveContainingDeserializedClass(context: KtElement, memberDescri
|
||||
JavaPsiFacade.getInstance(context.project).findClass(containingClassQualifiedName, context.resolveScope) ?: return null
|
||||
}
|
||||
is DeserializedClassDescriptor -> {
|
||||
val declaredPsiType = containingDeclaration.defaultType.toPsiType(null, context, false)
|
||||
val declaredPsiType = containingDeclaration.defaultType.toPsiType(null as PsiModifierListOwner?, context, false)
|
||||
(declaredPsiType as? PsiClassType)?.resolve() ?: return null
|
||||
}
|
||||
else -> return null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun resolveToPsiClass(uElement: UElement, declarationDescriptor: DeclarationDescriptor, context: KtElement): PsiClass? =
|
||||
private fun resolveToPsiClass(uElement: () -> UElement?, declarationDescriptor: DeclarationDescriptor, context: KtElement): PsiClass? =
|
||||
when (declarationDescriptor) {
|
||||
is ConstructorDescriptor -> declarationDescriptor.returnType
|
||||
is ClassDescriptor -> declarationDescriptor.defaultType
|
||||
is TypeParameterDescriptor -> declarationDescriptor.defaultType
|
||||
is TypeAliasDescriptor -> declarationDescriptor.expandedType
|
||||
else -> null
|
||||
}?.toPsiType(uElement, context, true).let { PsiTypesUtil.getPsiClass(it) }
|
||||
}?.toPsiType(uElement.invoke(), context, true).let { PsiTypesUtil.getPsiClass(it) }
|
||||
|
||||
|
||||
internal fun resolveDeserialized(
|
||||
private fun resolveDeserialized(
|
||||
context: KtElement,
|
||||
descriptor: DeclarationDescriptor,
|
||||
accessHint: ReferenceAccess? = null
|
||||
@@ -236,7 +243,7 @@ private fun PsiMethod.matchesDesc(desc: String) = desc == buildString {
|
||||
|
||||
private fun getMethodSignatureFromDescriptor(context: KtElement, descriptor: CallableDescriptor): JvmMemberSignature? {
|
||||
fun PsiType.raw() = (this as? PsiClassType)?.rawType() ?: PsiPrimitiveType.getUnboxedType(this) ?: this
|
||||
fun KotlinType.toPsiType() = toPsiType(null, context, false).raw()
|
||||
fun KotlinType.toPsiType() = toPsiType(null as PsiModifierListOwner?, context, false).raw()
|
||||
|
||||
val originalDescriptor = descriptor.original
|
||||
val receiverType = originalDescriptor.extensionReceiverParameter?.type?.toPsiType()
|
||||
@@ -251,8 +258,8 @@ private fun getMethodSignatureFromDescriptor(context: KtElement, descriptor: Cal
|
||||
|
||||
internal fun <T> lz(initializer: () -> T) = lazy(LazyThreadSafetyMode.SYNCHRONIZED, initializer)
|
||||
|
||||
internal fun KotlinType.toPsiType(source: UElement, element: KtElement, boxed: Boolean): PsiType =
|
||||
toPsiType(source.getParentOfType<UDeclaration>(false)?.javaPsi as? PsiModifierListOwner, element, boxed)
|
||||
internal fun KotlinType.toPsiType(source: UElement?, element: KtElement, boxed: Boolean): PsiType =
|
||||
toPsiType(source?.getParentOfType<UDeclaration>(false)?.javaPsi as? PsiModifierListOwner, element, boxed)
|
||||
|
||||
internal fun KotlinType.toPsiType(lightDeclaration: PsiModifierListOwner?, context: KtElement, boxed: Boolean): PsiType {
|
||||
if (this.isError) return UastErrorType
|
||||
@@ -351,7 +358,7 @@ internal fun KtClassOrObject.toPsiType(): PsiType {
|
||||
return PsiTypesUtil.getClassType(lightClass)
|
||||
}
|
||||
|
||||
internal fun PsiElement.getMaybeLightElement(): PsiElement? {
|
||||
private fun PsiElement.getMaybeLightElement(): PsiElement? {
|
||||
return when (this) {
|
||||
is KtDeclaration -> {
|
||||
val lightElement = toLightElements().firstOrNull()
|
||||
@@ -374,15 +381,6 @@ internal fun PsiElement.getMaybeLightElement(): PsiElement? {
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtElement.resolveCallToDeclaration(resultingDescriptor: DeclarationDescriptor? = null): PsiElement? {
|
||||
val descriptor = resultingDescriptor ?: run {
|
||||
val resolvedCall = getResolvedCall(analyze()) ?: return null
|
||||
resolvedCall.resultingDescriptor
|
||||
}
|
||||
|
||||
return descriptor.toSource()?.getMaybeLightElement()
|
||||
}
|
||||
|
||||
internal fun KtExpression.unwrapBlockOrParenthesis(): KtExpression {
|
||||
val innerExpression = KtPsiUtil.safeDeparenthesize(this)
|
||||
if (innerExpression is KtBlockExpression) {
|
||||
@@ -473,4 +471,68 @@ internal enum class ReferenceAccess(val isRead: Boolean, val isWrite: Boolean) {
|
||||
READ(true, false), WRITE(false, true), READ_WRITE(true, true)
|
||||
}
|
||||
|
||||
internal fun resolveToDeclaration(sourcePsi: KtExpression): PsiElement? =
|
||||
when (sourcePsi) {
|
||||
is KtSimpleNameExpression ->
|
||||
sourcePsi.analyze()[BindingContext.REFERENCE_TARGET, sourcePsi]
|
||||
?.let { resolveToDeclaration(sourcePsi, it) }
|
||||
else ->
|
||||
sourcePsi.getResolvedCall(sourcePsi.analyze())?.resultingDescriptor
|
||||
?.let { descriptor -> resolveToDeclaration(sourcePsi, descriptor) }
|
||||
}
|
||||
|
||||
|
||||
internal fun resolveToDeclaration(sourcePsi: KtExpression, declarationDescriptor: DeclarationDescriptor): PsiElement? {
|
||||
declarationDescriptor.toSource()?.getMaybeLightElement()?.let { return it }
|
||||
|
||||
var declarationDescriptor = declarationDescriptor
|
||||
if (declarationDescriptor is ImportedFromObjectCallableDescriptor<*>) {
|
||||
declarationDescriptor = declarationDescriptor.callableFromObject
|
||||
}
|
||||
if (declarationDescriptor is SyntheticJavaPropertyDescriptor) {
|
||||
declarationDescriptor = when (sourcePsi.readWriteAccess()) {
|
||||
ReferenceAccess.WRITE, ReferenceAccess.READ_WRITE ->
|
||||
declarationDescriptor.setMethod ?: declarationDescriptor.getMethod
|
||||
ReferenceAccess.READ -> declarationDescriptor.getMethod
|
||||
}
|
||||
}
|
||||
|
||||
if (declarationDescriptor is PackageViewDescriptor) {
|
||||
return JavaPsiFacade.getInstance(sourcePsi.project).findPackage(declarationDescriptor.fqName.asString())
|
||||
}
|
||||
|
||||
resolveToPsiClass({ sourcePsi.toUElement() }, declarationDescriptor, sourcePsi)?.let { return it }
|
||||
if (declarationDescriptor is DeclarationDescriptorWithSource) {
|
||||
declarationDescriptor.source.getPsi()?.let { it.getMaybeLightElement() ?: it }?.let { return it }
|
||||
}
|
||||
return resolveDeserialized(sourcePsi, declarationDescriptor, sourcePsi.readWriteAccess())
|
||||
}
|
||||
|
||||
internal fun KtExpression.readWriteAccess(): ReferenceAccess {
|
||||
var expression = getQualifiedExpressionForSelectorOrThis()
|
||||
loop@ while (true) {
|
||||
val parent = expression.parent
|
||||
when (parent) {
|
||||
is KtParenthesizedExpression, is KtAnnotatedExpression, is KtLabeledExpression -> expression = parent as KtExpression
|
||||
else -> break@loop
|
||||
}
|
||||
}
|
||||
|
||||
val assignment = expression.getAssignmentByLHS()
|
||||
if (assignment != null) {
|
||||
return when (assignment.operationToken) {
|
||||
KtTokens.EQ -> ReferenceAccess.WRITE
|
||||
else -> ReferenceAccess.READ_WRITE
|
||||
}
|
||||
}
|
||||
|
||||
return if ((expression.parent as? KtUnaryExpression)?.operationToken
|
||||
in constant { setOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS) }
|
||||
)
|
||||
ReferenceAccess.READ_WRITE
|
||||
else
|
||||
ReferenceAccess.READ
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
+2
-3
@@ -18,8 +18,7 @@ import org.jetbrains.uast.UElement
|
||||
import org.jetbrains.uast.UMultiResolvable
|
||||
import org.jetbrains.uast.UResolvable
|
||||
import org.jetbrains.uast.kotlin.KotlinUastResolveProviderService
|
||||
import org.jetbrains.uast.kotlin.getMaybeLightElement
|
||||
import org.jetbrains.uast.kotlin.toSource
|
||||
import org.jetbrains.uast.kotlin.resolveToDeclaration
|
||||
|
||||
|
||||
internal fun getReferenceVariants(ktElement: KtElement, nameHint: String): Sequence<DeclarationDescriptor> =
|
||||
@@ -31,7 +30,7 @@ internal fun UElement.getResolveResultVariants(ktExpression: KtExpression?): Ite
|
||||
val referenceVariants = getReferenceVariants(ktExpression, ktExpression.name ?: ktExpression.text)
|
||||
|
||||
fun asCandidateInfo(descriptor: DeclarationDescriptor): CandidateInfo? =
|
||||
descriptor.toSource()?.getMaybeLightElement()?.let { CandidateInfo(it, PsiSubstitutor.EMPTY) }
|
||||
resolveToDeclaration(ktExpression, descriptor)?.let { CandidateInfo(it, PsiSubstitutor.EMPTY) }
|
||||
|
||||
return referenceVariants.mapNotNull(::asCandidateInfo).asIterable()
|
||||
}
|
||||
|
||||
+4
-4
@@ -1,10 +1,10 @@
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> PsiClass:Closeable: Closeable
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:java.io: io
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = io) -> PsiPackage:java.io: io
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = Closeable) -> PsiClass:Closeable: Closeable
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> PsiClass:InputStream: InputStream
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:java.io: io
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = io) -> PsiPackage:java.io: io
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = InputStream) -> PsiClass:InputStream: InputStream
|
||||
|
||||
+1
-1
@@ -50,6 +50,6 @@ UBlockExpression -> UCallExpression (kind = UastCallKind(name='constructor_call'
|
||||
UBinaryExpression (operator = =) -> USimpleNameReferenceExpression (identifier = s) -> Light Parameter: s
|
||||
UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String
|
||||
ULocalVariable (name = local) -> USimpleNameReferenceExpression (identifier = s) -> Light Parameter: s
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:toString: toString
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = local) -> LightVariableBuilder:local: local
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to PsiMethod:toString) -> USimpleNameReferenceExpression (identifier = toString) -> PsiMethod:toString: toString
|
||||
|
||||
+16
-16
@@ -1,39 +1,39 @@
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> PsiMethod:currentThread: currentThread
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = lang) -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = Thread) -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = currentThread) -> PsiMethod:currentThread: currentThread
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> PsiField:NORM_PRIORITY: NORM_PRIORITY
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = lang) -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = Thread) -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = NORM_PRIORITY) -> PsiField:NORM_PRIORITY: NORM_PRIORITY
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> PsiClass:UncaughtExceptionHandler: UncaughtExceptionHandler
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = lang) -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = Thread) -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = UncaughtExceptionHandler) -> PsiClass:UncaughtExceptionHandler: UncaughtExceptionHandler
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = lang) -> PsiPackage:java.lang: lang
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = Thread) -> PsiClass:Thread: Thread
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = sleep) -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> PsiMethod:emptyList: emptyList
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:kotlin.collections: collections
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = kotlin) -> PsiPackage:kotlin: kotlin
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = collections) -> PsiPackage:kotlin.collections: collections
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = emptyList) -> PsiMethod:emptyList: emptyList
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UImportStatement (isOnDemand = false) -> UQualifiedReferenceExpression -> PsiField:SIZE_BYTES: SIZE_BYTES
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiClass:IntCompanionObject: IntCompanionObject
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiClass:Integer: Integer
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = kotlin) -> PsiPackage:kotlin: kotlin
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = Int) -> PsiClass:Integer: Integer
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = Companion) -> PsiClass:IntCompanionObject: IntCompanionObject
|
||||
|
||||
+11
-11
@@ -14,7 +14,7 @@ UBlockExpression -> UQualifiedReferenceExpression -> KtLightMethodImpl:foo: foo
|
||||
}
|
||||
}: A
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to KtLightMethodImpl:inlineFoo) -> USimpleNameReferenceExpression (identifier = inlineFoo) -> KtLightMethodImpl:inlineFoo: inlineFoo
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:forEach: forEach
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:listOf) -> USimpleNameReferenceExpression (identifier = listOf) -> PsiMethod:listOf: listOf
|
||||
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 0))(resolves to KtLightMethodImpl:A) -> USimpleNameReferenceExpression (identifier = A) -> KtLightClassImpl:open class A {
|
||||
fun foo() {}
|
||||
@@ -25,32 +25,32 @@ UBlockExpression -> UQualifiedReferenceExpression -> KtLightMethodImpl:foo: foo
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:forEach) -> USimpleNameReferenceExpression (identifier = forEach) -> PsiMethod:forEach: forEach
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:println) -> USimpleNameReferenceExpression (identifier = println) -> PsiMethod:println: println
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:println) -> USimpleNameReferenceExpression (identifier = it) -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:joinToString: joinToString
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:listOf) -> USimpleNameReferenceExpression (identifier = listOf) -> PsiMethod:listOf: listOf
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to PsiMethod:joinToString) -> USimpleNameReferenceExpression (identifier = joinToString) -> PsiMethod:joinToString: joinToString
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:size: size
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:listOf) -> USimpleNameReferenceExpression (identifier = listOf) -> PsiMethod:listOf: listOf
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = size) -> PsiMethod:size: size
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:getIndices: getIndices
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:listOf) -> USimpleNameReferenceExpression (identifier = listOf) -> PsiMethod:listOf: listOf
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = indices) -> PsiMethod:getIndices: getIndices
|
||||
UTypeReferenceExpression (name = java.util.Date) -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UTypeReferenceExpression (name = java.util.Date) -> USimpleNameReferenceExpression (identifier = util) -> PsiPackage:java.util: util
|
||||
UTypeReferenceExpression (name = java.util.Date) -> USimpleNameReferenceExpression (identifier = Date) -> PsiClass:Date: Date
|
||||
ULocalVariable (name = date) -> UQualifiedReferenceExpression -> PsiMethod:Date: Date
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiPackage:java.util: util
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = java) -> PsiPackage:java: java
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = util) -> PsiPackage:java.util: util
|
||||
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 0))(resolves to PsiMethod:Date) -> USimpleNameReferenceExpression (identifier = Date) -> PsiMethod:Date: Date
|
||||
UBinaryExpression (operator = =) -> UQualifiedReferenceExpression -> null: null
|
||||
UBinaryExpression (operator = =) -> UQualifiedReferenceExpression -> PsiMethod:setTime: setTime
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = date) -> LightVariableBuilder:date: date
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = time) -> PsiMethod:setTime: setTime
|
||||
UBinaryExpression (operator = =) -> USimpleNameReferenceExpression (identifier = =) -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:last: last
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:listOf) -> USimpleNameReferenceExpression (identifier = listOf) -> PsiMethod:listOf: listOf
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to PsiMethod:last) -> USimpleNameReferenceExpression (identifier = last) -> PsiMethod:last: last
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:setValue: setValue
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> PsiMethod:first: first
|
||||
UQualifiedReferenceExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:mutableMapOf) -> USimpleNameReferenceExpression (identifier = mutableMapOf) -> PsiMethod:mutableMapOf: mutableMapOf
|
||||
UBinaryExpression (operator = <other>) -> USimpleNameReferenceExpression (identifier = to) -> PsiMethod:to: to
|
||||
@@ -58,7 +58,7 @@ UBlockExpression -> UQualifiedReferenceExpression -> KtLightMethodImpl:foo: foo
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to PsiMethod:first) -> USimpleNameReferenceExpression (identifier = first) -> PsiMethod:first: first
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:setValue) -> USimpleNameReferenceExpression (identifier = setValue) -> PsiMethod:setValue: setValue
|
||||
UBinaryExpression (operator = ..) -> USimpleNameReferenceExpression (identifier = ..) -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:longRangeContains: longRangeContains
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = intRange) -> LightVariableBuilder:intRange: intRange
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:longRangeContains) -> USimpleNameReferenceExpression (identifier = contains) -> PsiMethod:longRangeContains: longRangeContains
|
||||
UBinaryExpressionWithType -> USimpleNameReferenceExpression (identifier = as) -> null: null
|
||||
@@ -82,7 +82,7 @@ UTypeReferenceExpression (name = A) -> USimpleNameReferenceExpression (identifie
|
||||
}
|
||||
}: A
|
||||
UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> KotlinLightTypeParameter:T: T
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> null: null
|
||||
UBlockExpression -> UQualifiedReferenceExpression -> PsiMethod:isEmpty: isEmpty
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = listT) -> Light Parameter: listT
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0))(resolves to PsiMethod:isEmpty) -> USimpleNameReferenceExpression (identifier = isEmpty) -> PsiMethod:isEmpty: isEmpty
|
||||
UForEachExpression -> USimpleNameReferenceExpression (identifier = listT) -> Light Parameter: listT
|
||||
|
||||
@@ -19,7 +19,7 @@ UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifie
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:listOf) -> USimpleNameReferenceExpression (identifier = at) -> LightVariableBuilder:at: at
|
||||
UTypeReferenceExpression (name = java.util.List<? extends java.lang.String>) -> USimpleNameReferenceExpression (identifier = List) -> PsiClass:List: List
|
||||
UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String
|
||||
ULocalVariable (name = tsl) -> UQualifiedReferenceExpression -> null: null
|
||||
ULocalVariable (name = tsl) -> UQualifiedReferenceExpression -> PsiMethod:map: map
|
||||
UQualifiedReferenceExpression -> USimpleNameReferenceExpression (identifier = tl) -> LightVariableBuilder:tl: tl
|
||||
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))(resolves to PsiMethod:map) -> USimpleNameReferenceExpression (identifier = map) -> PsiMethod:map: map
|
||||
UReturnExpression -> UQualifiedReferenceExpression -> null: null
|
||||
|
||||
Reference in New Issue
Block a user