Optimize Imports: simplify code

This commit is contained in:
Pavel V. Talanov
2014-03-05 19:04:02 +04:00
parent 809be9b069
commit 6f9b3f1bae
3 changed files with 21 additions and 27 deletions
@@ -36,16 +36,13 @@ import java.awt.datatransfer.Transferable
import com.intellij.codeInsight.CodeInsightSettings
import com.intellij.codeInsight.editorActions.CopyPastePostProcessor
import org.jetbrains.jet.plugin.references.JetReference
import org.jetbrains.jet.lang.resolve.DescriptorUtils
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import com.intellij.openapi.util.TextRange
import java.util.Collections
import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetCallExpression
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor
import org.jetbrains.jet.lang.types.ErrorUtils
import org.jetbrains.jet.lang.psi.JetImportDirective
import org.jetbrains.jet.lang.psi.JetPackageDirective
@@ -58,12 +55,10 @@ import java.awt.datatransfer.UnsupportedFlavorException
import java.io.IOException
import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
import org.jetbrains.jet.lang.psi.JetUserType
import org.jetbrains.jet.lang.psi.JetTypeReference
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
import org.jetbrains.jet.plugin.imports.*
//NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor
@@ -128,8 +123,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Refere
if (referencedDeclaration.isInCopiedArea(file, startOffsets, endOffsets)) {
return null
}
val isExpressionWithReceiver = element is JetSimpleNameExpression && element.getReceiverExpression() != null
if (isExpressionWithReceiver && !referencedDescriptor.isExtension) {
if (isInReceiverScope(element, referencedDescriptor)) {
return null
}
val fqName = referencedDescriptor.importableFqName
@@ -361,7 +355,4 @@ private fun PsiElement.isInCopiedArea(fileCopiedFrom: JetFile, startOffsets: Int
}
}
private val DeclarationDescriptor.isExtension: Boolean
get() = this is CallableDescriptor && getReceiverParameter() != null
private fun <T : Any> MutableCollection<T>.addIfNotNull(el: T?) = ContainerUtil.addIfNotNull(this, el)
@@ -22,6 +22,9 @@ import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor
import org.jetbrains.jet.lang.resolve.DescriptorUtils
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import com.intellij.psi.PsiElement
public val DeclarationDescriptor.importableFqName: FqName?
get() {
@@ -48,4 +51,13 @@ public fun DeclarationDescriptor.canBeReferencedViaImport(): Boolean {
return false
}
return this is ClassDescriptor || this is ConstructorDescriptor
}
}
public fun isInReceiverScope(referenceElement: PsiElement, referencedDescriptor: DeclarationDescriptor): Boolean {
val isExpressionWithReceiver = referenceElement is JetSimpleNameExpression && referenceElement.getReceiverExpression() != null
return isExpressionWithReceiver && !referencedDescriptor.isExtension
}
//TODO: move this utility to more appropriate place
public val DeclarationDescriptor.isExtension: Boolean
get() = this is CallableDescriptor && getReceiverParameter() != null
@@ -53,7 +53,10 @@ public class KotlinImportOptimizer() : ImportOptimizer {
continue
}
if (isUseful(importPath, usedQualifiedNames) && needImport(importPath, jetFile, directivesBeforeCurrent) && needImport(importPath, jetFile, directivesAfterCurrent)) {
if (isUseful(importPath, usedQualifiedNames)
&& needImport(importPath, jetFile, directivesBeforeCurrent)
&& needImport(importPath, jetFile, directivesAfterCurrent)
) {
directivesBeforeCurrent.add(anImport)
}
else {
@@ -76,20 +79,6 @@ public class KotlinImportOptimizer() : ImportOptimizer {
element?.acceptChildren(this)
}
override fun visitUserType(`type`: JetUserType) {
val qualifier = `type`.getQualifier()
if (qualifier == null) {
super.visitUserType(`type`)
}
else {
val argumentList = `type`.getTypeArgumentList()
if (argumentList != null) {
super.visitTypeArgumentList(argumentList)
}
visitUserType(qualifier)
}
}
override fun visitJetElement(element: JetElement) {
if (PsiTreeUtil.getParentOfType(element, javaClass<JetImportDirective>()) != null ||
PsiTreeUtil.getParentOfType(element, javaClass<JetPackageDirective>()) != null) {
@@ -98,7 +87,9 @@ public class KotlinImportOptimizer() : ImportOptimizer {
val reference = element.getReference()
if (reference is JetReference) {
val referencedDescriptors = reference.resolveToDescriptors()
val importableDescriptors = referencedDescriptors.filter { it.canBeReferencedViaImport() }
val importableDescriptors = referencedDescriptors.filter {
it.canBeReferencedViaImport() && !isInReceiverScope(element, it)
}
usedQualifiedNames.addAll(importableDescriptors.map { it.importableFqName }.filterNotNull())
}
super.visitJetElement(element)