Code cleanup

This commit is contained in:
Him188 2020-12-30 16:53:38 +08:00
parent 1160ff2ad2
commit 7af1821fa6

View File

@ -12,29 +12,16 @@ package net.mamoe.mirai.console.intellij.diagnostics.fix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.imports.canBeAddedToImport
import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.inspections.KotlinUniversalQuickFix
import org.jetbrains.kotlin.idea.quickfix.KotlinCrossLanguageQuickFixAction
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
import org.jetbrains.kotlin.idea.references.resolveToDescriptors
import org.jetbrains.kotlin.idea.util.ImportDescriptorResult
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.getFactoryForImplicitReceiverWithSubtypeOf
import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.nj2k.postProcessing.resolve
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
import org.jetbrains.kotlin.psi.psiUtil.referenceExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class ConvertToPlainTextFix(
/**
@ -102,39 +89,4 @@ class ConvertToPlainTextFix(
}
}
fun applyImport(targetElement: KtElement) {
val targets = targetElement.resolveMainReferenceToDescriptors()
if (targets.isEmpty()) return
val fqName = targets.map { it.importableFqName!! }.single()
val file = targetElement.containingKtFile
val helper = ImportInsertHelper.getInstance(targetElement.project)
if (helper.importDescriptor(file, targets.first()) == ImportDescriptorResult.FAIL) return
val qualifiedExpressions = file.collectDescendantsOfType<KtDotQualifiedExpression> { qualifiedExpression ->
val selector = qualifiedExpression.getQualifiedElementSelector() as? KtNameReferenceExpression
selector?.getReferencedNameAsName() == fqName.shortName() && target(qualifiedExpression)?.importableFqName == fqName
}
val userTypes = file.collectDescendantsOfType<KtUserType> { userType ->
val selector = userType.getQualifiedElementSelector() as? KtNameReferenceExpression
selector?.getReferencedNameAsName() == fqName.shortName() && target(userType)?.importableFqName == fqName
}
//TODO: not deep
ShortenReferences.DEFAULT.process(qualifiedExpressions + userTypes)
}
private fun target(qualifiedElement: KtElement): DeclarationDescriptor? {
val nameExpression = qualifiedElement.getQualifiedElementSelector() as? KtNameReferenceExpression ?: return null
val receiver = nameExpression.getReceiverExpression() ?: return null
val bindingContext = qualifiedElement.analyze(BodyResolveMode.PARTIAL)
if (bindingContext[BindingContext.QUALIFIER, receiver] == null) return null
val targets = nameExpression.mainReference.resolveToDescriptors(bindingContext)
if (targets.isEmpty()) return null
if (!targets.all { it.canBeAddedToImport() }) return null
return targets.singleOrNull()
}
}