Introduce KtClassOrObject.resolveToDescriptorIfAny()
This commit is contained in:
@@ -20,9 +20,7 @@ package org.jetbrains.kotlin.idea.caches.resolve
|
||||
|
||||
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
@@ -67,6 +65,10 @@ fun KtDeclaration.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = Bo
|
||||
}
|
||||
}
|
||||
|
||||
fun KtClassOrObject.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): ClassDescriptor? {
|
||||
return (this as KtDeclaration).resolveToDescriptorIfAny(bodyResolveMode) as? ClassDescriptor
|
||||
}
|
||||
|
||||
fun KtParameter.resolveToParameterDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): ValueParameterDescriptor? {
|
||||
val context = analyze(bodyResolveMode)
|
||||
return context.get(BindingContext.VALUE_PARAMETER, this) as? ValueParameterDescriptor
|
||||
|
||||
+2
-3
@@ -25,7 +25,6 @@ import com.intellij.psi.impl.light.LightMethod
|
||||
import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
||||
import org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
|
||||
@@ -61,8 +60,8 @@ class KtFakeLightClass(override val kotlinOrigin: KtClassOrObject) :
|
||||
LightClassInheritanceHelper.getService(project).isInheritor(this, baseClass, checkDeep).ifSure { return it }
|
||||
|
||||
val baseKtClass = (baseClass as? KtLightClass)?.kotlinOrigin ?: return false
|
||||
val baseDescriptor = baseKtClass.resolveToDescriptorIfAny() as? ClassDescriptor ?: return false
|
||||
val thisDescriptor = kotlinOrigin.resolveToDescriptorIfAny() as? ClassDescriptor ?: return false
|
||||
val baseDescriptor = baseKtClass.resolveToDescriptorIfAny() ?: return false
|
||||
val thisDescriptor = kotlinOrigin.resolveToDescriptorIfAny() ?: return false
|
||||
return if (checkDeep) DescriptorUtils.isSubclass(thisDescriptor, baseDescriptor) else DescriptorUtils.isDirectSubclass(thisDescriptor, baseDescriptor)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -20,7 +20,6 @@ import com.intellij.ide.util.InheritedMembersNodeProvider
|
||||
import com.intellij.ide.util.treeView.smartTree.TreeElement
|
||||
import com.intellij.psi.NavigatablePsiElement
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
@@ -35,7 +34,7 @@ class KotlinInheritedMembersNodeProvider: InheritedMembersNodeProvider<TreeEleme
|
||||
|
||||
val project = element.project
|
||||
|
||||
val descriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? ClassifierDescriptor ?: return listOf()
|
||||
val descriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return listOf()
|
||||
|
||||
val children = ArrayList<TreeElement>()
|
||||
|
||||
|
||||
+1
-1
@@ -232,7 +232,7 @@ class KotlinAndroidAddStringResource : SelfTargetingIntention<KtLiteralStringTem
|
||||
}
|
||||
|
||||
private fun KtClassOrObject.isSubclassOfAny(baseClasses: Collection<String>): Boolean {
|
||||
val declarationDescriptor = resolveToDescriptorIfAny() as? ClassDescriptor
|
||||
val declarationDescriptor = resolveToDescriptorIfAny()
|
||||
return baseClasses.any { declarationDescriptor?.isSubclassOf(it) ?: false }
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ class ImplementAsConstructorParameter : ImplementMembersHandler() {
|
||||
|
||||
override fun isValidForClass(classOrObject: KtClassOrObject): Boolean {
|
||||
if (classOrObject !is KtClass || classOrObject is KtEnumEntry || classOrObject.isInterface()) return false
|
||||
val classDescriptor = classOrObject.resolveToDescriptorIfAny() as? ClassDescriptor ?: return false
|
||||
val classDescriptor = classOrObject.resolveToDescriptorIfAny() ?: return false
|
||||
return OverrideResolver.getMissingImplementations(classDescriptor).any { it is PropertyDescriptor }
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||
abstract class OverrideImplementMembersHandler : LanguageCodeInsightActionHandler {
|
||||
|
||||
fun collectMembersToGenerate(classOrObject: KtClassOrObject): Collection<OverrideMemberChooserObject> {
|
||||
val descriptor = classOrObject.resolveToDescriptorIfAny() as? ClassDescriptor ?: return emptySet()
|
||||
val descriptor = classOrObject.resolveToDescriptorIfAny() ?: return emptySet()
|
||||
return collectMembersToGenerate(descriptor, classOrObject.project)
|
||||
}
|
||||
|
||||
|
||||
@@ -214,7 +214,7 @@ fun KtDeclaration.toDescriptor(): DeclarationDescriptor? {
|
||||
val bindingContext = analyze()
|
||||
// TODO: temporary code
|
||||
if (this is KtPrimaryConstructor) {
|
||||
return (this.getContainingClassOrObject().resolveToDescriptorIfAny() as? ClassDescriptor)?.unsubstitutedPrimaryConstructor
|
||||
return this.getContainingClassOrObject().resolveToDescriptorIfAny()?.unsubstitutedPrimaryConstructor
|
||||
}
|
||||
|
||||
val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, this]
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ class KotlinBasicStepMethodFilter(
|
||||
}
|
||||
|
||||
if (declaration is KtClass && method.name() == "<init>") {
|
||||
(declaration.resolveToDescriptorIfAny() as? ClassDescriptor)?.unsubstitutedPrimaryConstructor
|
||||
declaration.resolveToDescriptorIfAny()?.unsubstitutedPrimaryConstructor
|
||||
} else {
|
||||
declaration?.resolveToDescriptorIfAny()
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
||||
if (quickNavigation) return renderedDecl
|
||||
|
||||
val declarationDescriptor = element.resolveToDescriptorIfAny()
|
||||
val enumDescriptor = (declarationDescriptor as? ClassDescriptor)?.getSuperClassNotAny() ?: return renderedDecl
|
||||
val enumDescriptor = declarationDescriptor?.getSuperClassNotAny() ?: return renderedDecl
|
||||
|
||||
val enumDeclaration =
|
||||
DescriptorToSourceUtilsIde.getAnyDeclaration(element.project, enumDescriptor) as? KtDeclaration ?: return renderedDecl
|
||||
|
||||
@@ -12,7 +12,6 @@ import com.intellij.codeInspection.ProblemDescriptor
|
||||
import com.intellij.codeInspection.ProblemsHolder
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.PsiElementVisitor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.idea.actions.generate.KotlinGenerateEqualsAndHashcodeAction
|
||||
import org.jetbrains.kotlin.idea.actions.generate.findDeclaredEquals
|
||||
@@ -30,7 +29,7 @@ object DeleteEqualsAndHashCodeFix : LocalQuickFix {
|
||||
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
|
||||
if (!FileModificationService.getInstance().preparePsiElementForWrite(descriptor.psiElement)) return
|
||||
val objectDeclaration = descriptor.psiElement.getStrictParentOfType<KtObjectDeclaration>() ?: return
|
||||
val classDescriptor = objectDeclaration.resolveToDescriptorIfAny() as? ClassDescriptor ?: return
|
||||
val classDescriptor = objectDeclaration.resolveToDescriptorIfAny() ?: return
|
||||
classDescriptor.findDeclaredEquals(false)?.source?.getPsi()?.delete()
|
||||
classDescriptor.findDeclaredHashCode(false)?.source?.getPsi()?.delete()
|
||||
}
|
||||
@@ -59,7 +58,7 @@ class EqualsOrHashCodeInspection : AbstractKotlinInspection() {
|
||||
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
|
||||
return classOrObjectVisitor(fun(classOrObject) {
|
||||
val nameIdentifier = classOrObject.nameIdentifier ?: return
|
||||
val classDescriptor = classOrObject.resolveToDescriptorIfAny() as? ClassDescriptor ?: return
|
||||
val classDescriptor = classOrObject.resolveToDescriptorIfAny() ?: return
|
||||
val hasEquals = classDescriptor.findDeclaredEquals(false) != null
|
||||
val hasHashCode = classDescriptor.findDeclaredHashCode(false) != null
|
||||
if (!hasEquals && !hasHashCode) return
|
||||
|
||||
@@ -25,7 +25,6 @@ import com.intellij.psi.codeStyle.CodeStyleManager
|
||||
import com.intellij.refactoring.util.CommonRefactoringUtil
|
||||
import com.intellij.refactoring.util.RefactoringDescriptionLocation
|
||||
import org.jetbrains.kotlin.asJava.unwrapped
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
import org.jetbrains.kotlin.idea.highlighter.markers.liftToExpected
|
||||
import org.jetbrains.kotlin.idea.runSynchronouslyWithProgress
|
||||
@@ -46,7 +45,7 @@ class ConvertSealedClassToEnumIntention : SelfTargetingRangeIntention<KtClass>(K
|
||||
val nameIdentifier = element.nameIdentifier ?: return null
|
||||
val sealedKeyword = element.modifierList?.getModifier(KtTokens.SEALED_KEYWORD) ?: return null
|
||||
|
||||
val classDescriptor = element.resolveToDescriptorIfAny() as? ClassDescriptor ?: return null
|
||||
val classDescriptor = element.resolveToDescriptorIfAny() ?: return null
|
||||
if (classDescriptor.getSuperClassNotAny() != null) return null
|
||||
|
||||
return TextRange(sealedKeyword.startOffset, nameIdentifier.endOffset)
|
||||
|
||||
@@ -85,7 +85,7 @@ abstract class ImplementAbstractMemberIntentionBase :
|
||||
is KtEnumEntry -> subClass.resolveToDescriptorIfAny()
|
||||
is PsiClass -> subClass.getJavaClassDescriptor()
|
||||
else -> null
|
||||
} as? ClassDescriptor ?: return false
|
||||
} ?: return false
|
||||
return acceptSubClass(classDescriptor, memberDescriptor)
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ abstract class ImplementAbstractMemberIntentionBase :
|
||||
protected abstract val preferConstructorParameters: Boolean
|
||||
|
||||
private fun implementInKotlinClass(editor: Editor?, member: KtNamedDeclaration, targetClass: KtClassOrObject) {
|
||||
val subClassDescriptor = targetClass.resolveToDescriptorIfAny() as? ClassDescriptor ?: return
|
||||
val subClassDescriptor = targetClass.resolveToDescriptorIfAny() ?: return
|
||||
val superMemberDescriptor = member.resolveToDescriptorIfAny() as? CallableMemberDescriptor ?: return
|
||||
val superClassDescriptor = superMemberDescriptor.containingDeclaration as? ClassDescriptor ?: return
|
||||
val substitutor = getTypeSubstitutor(superClassDescriptor.defaultType, subClassDescriptor.defaultType)
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ class MoveMemberOutOfCompanionObjectIntention : MoveMemberOutOfObjectIntention("
|
||||
it.parents
|
||||
.filterIsInstance<KtClassOrObject>()
|
||||
.none {
|
||||
val classDescriptor = it.resolveToDescriptorIfAny() as? ClassDescriptor
|
||||
val classDescriptor = it.resolveToDescriptorIfAny()
|
||||
if (classDescriptor != null && classDescriptor.isSubclassOf(targetClassDescriptor)) return@none true
|
||||
if (it.isTopLevel() || it is KtObjectDeclaration || (it is KtClass && !it.isInner())) return@filter true
|
||||
false
|
||||
|
||||
@@ -60,8 +60,7 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() {
|
||||
if (type.isError) return emptyList()
|
||||
|
||||
val superClass = (type.constructor.declarationDescriptor as? ClassDescriptor) ?: return emptyList()
|
||||
val classDescriptor = classOrObjectDeclaration.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? ClassDescriptor
|
||||
?: return emptyList()
|
||||
val classDescriptor = classOrObjectDeclaration.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return emptyList()
|
||||
val constructors = superClass.constructors.filter { it.isVisible(classDescriptor) }
|
||||
if (constructors.isEmpty()) return emptyList() // no accessible constructor
|
||||
|
||||
|
||||
+1
-1
@@ -483,7 +483,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
|
||||
}
|
||||
|
||||
val isExpectClassMember by lazy {
|
||||
containingElement is KtClassOrObject && (containingElement.resolveToDescriptorIfAny() as? ClassDescriptor)?.isExpect ?: false
|
||||
containingElement is KtClassOrObject && containingElement.resolveToDescriptorIfAny()?.isExpect ?: false
|
||||
}
|
||||
|
||||
val declaration: KtNamedDeclaration = when (callableInfo.kind) {
|
||||
|
||||
+1
-2
@@ -17,7 +17,6 @@
|
||||
package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable
|
||||
|
||||
import com.intellij.psi.PsiClass
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||
@@ -45,7 +44,7 @@ object CreateConstructorFromDelegationCallActionFactory : CreateCallableMemberFr
|
||||
|
||||
val project = currentClass.project
|
||||
|
||||
val classDescriptor = currentClass.resolveToDescriptorIfAny() as? ClassDescriptor ?: return null
|
||||
val classDescriptor = currentClass.resolveToDescriptorIfAny() ?: return null
|
||||
|
||||
val targetClass = if (calleeExpression.isThis) {
|
||||
currentClass
|
||||
|
||||
+1
-1
@@ -86,7 +86,7 @@ open class CreateParameterFromUsageFix<E : KtElement>(
|
||||
if (element !is KtSimpleNameExpression) return null
|
||||
|
||||
val classOrObject = element.getStrictParentOfType<KtClassOrObject>() ?: return null
|
||||
receiverClassDescriptor = classOrObject.resolveToDescriptorIfAny() as? ClassDescriptor ?: return null
|
||||
receiverClassDescriptor = classOrObject.resolveToDescriptorIfAny() ?: return null
|
||||
|
||||
val paramInfo = CreateParameterByRefActionFactory.extractFixData(element)?.parameterInfo
|
||||
if (paramInfo?.callableDescriptor == receiverClassDescriptor.unsubstitutedPrimaryConstructor) return null
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ class ParcelMigrateToParcelizeQuickFix(function: KtClass) : AbstractParcelableQu
|
||||
|
||||
private fun KtClass.findParcelerCompanionObject(): Pair<KtObjectDeclaration, ClassDescriptor>? {
|
||||
for (obj in companionObjects) {
|
||||
val objDescriptor = obj.resolveToDescriptorIfAny() as? ClassDescriptor ?: continue
|
||||
val objDescriptor = obj.resolveToDescriptorIfAny() ?: continue
|
||||
for (superClassifier in objDescriptor.getAllSuperClassifiers()) {
|
||||
val superClass = superClassifier as? ClassDescriptor ?: continue
|
||||
if (superClass.fqNameSafe == PARCELER_FQNAME) return Pair(obj, objDescriptor)
|
||||
|
||||
Reference in New Issue
Block a user