Skip to content

Commit a3833fa

Browse files
committed
Fixes bug with missing import aliases
1 parent 7d89676 commit a3833fa

File tree

3 files changed

+51
-26
lines changed

3 files changed

+51
-26
lines changed

kotlin-eclipse-core/src/org/jetbrains/kotlin/core/references/KotlinReference.kt

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,21 @@
1616
*******************************************************************************/
1717
package org.jetbrains.kotlin.core.references
1818

19-
import com.intellij.psi.PsiElement
20-
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
21-
import org.jetbrains.kotlin.resolve.BindingContext
19+
import com.intellij.util.SmartList
2220
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
23-
import org.jetbrains.kotlin.psi.KtReferenceExpression
24-
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
25-
import org.jetbrains.kotlin.core.resolve.EclipseDescriptorUtils
26-
import org.jetbrains.kotlin.descriptors.SourceElement
27-
import org.jetbrains.kotlin.psi.KtCallExpression
21+
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
22+
import org.jetbrains.kotlin.lexer.KtTokens
23+
import org.jetbrains.kotlin.name.Name
24+
import org.jetbrains.kotlin.psi.*
25+
import org.jetbrains.kotlin.resolve.BindingContext
2826
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
2927
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
3028
import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall
31-
import org.jetbrains.kotlin.psi.Call
32-
import org.jetbrains.kotlin.psi.KtConstructorDelegationReferenceExpression
33-
import org.eclipse.jdt.core.IJavaProject
34-
import org.jetbrains.kotlin.psi.KtElement
35-
import java.util.ArrayList
36-
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
3729
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
38-
import com.intellij.util.SmartList
39-
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
30+
import org.jetbrains.kotlin.types.expressions.OperatorConventions
31+
import org.jetbrains.kotlin.util.OperatorNameConventions
4032
import org.jetbrains.kotlin.utils.addIfNotNull
41-
import org.jetbrains.kotlin.lexer.KtTokens
33+
import java.util.*
4234

4335
inline private fun <reified T> ArrayList<KotlinReference>.register(e: KtElement, action: (T) -> KotlinReference) {
4436
if (e is T) this.add(action(e))
@@ -74,13 +66,42 @@ public interface KotlinReference {
7466
val expression: KtReferenceExpression
7567

7668
fun getTargetDescriptors(context: BindingContext): Collection<DeclarationDescriptor>
69+
70+
val resolvesByNames: Collection<Name>
7771
}
7872

7973
open class KotlinSimpleNameReference(override val expression: KtSimpleNameExpression) : KotlinReference {
8074
override fun getTargetDescriptors(context: BindingContext) = expression.getReferenceTargets(context)
75+
76+
override val resolvesByNames: Collection<Name>
77+
get() {
78+
val element = expression
79+
80+
if (element is KtOperationReferenceExpression) {
81+
val tokenType = element.operationSignTokenType
82+
if (tokenType != null) {
83+
val name = OperatorConventions.getNameForOperationSymbol(
84+
tokenType, element.parent is KtUnaryExpression, element.parent is KtBinaryExpression
85+
) ?: return emptyList()
86+
val counterpart = OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS[tokenType]
87+
return if (counterpart != null) {
88+
val counterpartName = OperatorConventions.getNameForOperationSymbol(counterpart, false, true)!!
89+
listOf(name, counterpartName)
90+
}
91+
else {
92+
listOf(name)
93+
}
94+
}
95+
}
96+
97+
return listOf(element.getReferencedNameAsName())
98+
}
8199
}
82100

83101
public class KotlinInvokeFunctionReference(override val expression: KtCallExpression) : KotlinReference {
102+
override val resolvesByNames: Collection<Name>
103+
get() = listOf(OperatorNameConventions.INVOKE)
104+
84105
override fun getTargetDescriptors(context: BindingContext): Collection<DeclarationDescriptor> {
85106
val call = expression.getCall(context)
86107
val resolvedCall = call.getResolvedCall(context)
@@ -110,13 +131,19 @@ sealed class KotlinSyntheticPropertyAccessorReference(override val expression: K
110131
}
111132
return result
112133
}
134+
135+
override val resolvesByNames: Collection<Name>
136+
get() = listOf(expression.getReferencedNameAsName())
113137

114138
class Getter(expression: KtNameReferenceExpression) : KotlinSyntheticPropertyAccessorReference(expression, true)
115139
class Setter(expression: KtNameReferenceExpression) : KotlinSyntheticPropertyAccessorReference(expression, false)
116140
}
117141

118142
public class KotlinConstructorDelegationReference(override val expression: KtConstructorDelegationReferenceExpression) : KotlinReference {
119143
override fun getTargetDescriptors(context: BindingContext) = expression.getReferenceTargets(context)
144+
145+
override val resolvesByNames: Collection<Name>
146+
get() = emptyList()
120147
}
121148

122149
fun KtReferenceExpression.getReferenceTargets(context: BindingContext): Collection<DeclarationDescriptor> {

kotlin-eclipse-ui/src/org/jetbrains/kotlin/ui/editors/organizeImports/KotlinOrganizeImportsAction.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,16 @@ import org.jetbrains.kotlin.core.model.KotlinEnvironment
3737
import org.jetbrains.kotlin.core.preferences.languageVersionSettings
3838
import org.jetbrains.kotlin.core.resolve.KotlinAnalyzer
3939
import org.jetbrains.kotlin.core.resolve.KotlinResolutionFacade
40-
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
41-
import org.jetbrains.kotlin.diagnostics.Errors
4240
import org.jetbrains.kotlin.eclipse.ui.utils.getBindingContext
4341
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings
4442
import org.jetbrains.kotlin.idea.formatter.kotlinCustomSettings
4543
import org.jetbrains.kotlin.idea.imports.OptimizedImportsBuilder
46-
import org.jetbrains.kotlin.psi.KtElement
4744
import org.jetbrains.kotlin.psi.KtFile
48-
import org.jetbrains.kotlin.resolve.BindingContext
4945
import org.jetbrains.kotlin.resolve.ImportPath
5046
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
51-
import org.jetbrains.kotlin.types.expressions.KotlinTypeInfo
5247
import org.jetbrains.kotlin.ui.editors.KotlinCommonEditor
5348
import org.jetbrains.kotlin.ui.editors.quickfix.placeImports
5449
import org.jetbrains.kotlin.ui.editors.quickfix.replaceImports
55-
import org.jetbrains.kotlin.util.slicedMap.WritableSlice
56-
import org.jetbrains.kotlin.core.imports.FIXABLE_DIAGNOSTICS
5750

5851

5952
class KotlinOrganizeImportsAction(private val editor: KotlinCommonEditor) : SelectionDispatchAction(editor.site) {

kotlin-eclipse-ui/src/org/jetbrains/kotlin/ui/editors/organizeImports/importsCollector.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.resolve.scopes.HierarchicalScope
3333
import org.jetbrains.kotlin.resolve.scopes.utils.*
3434
import org.jetbrains.kotlin.ui.editors.codeassist.getResolutionScope
3535
import java.util.HashSet
36+
import kotlin.collections.ArrayList
3637
import kotlin.collections.LinkedHashMap
3738
import kotlin.collections.LinkedHashSet
3839

@@ -69,6 +70,9 @@ private class CollectUsedDescriptorsVisitor(val file: KtFile) : KtVisitorVoid()
6970
override fun visitReferenceExpression(expression: KtReferenceExpression) {
7071
val references = createReferences(expression)
7172
for (reference in references) {
73+
74+
val names = reference.resolvesByNames
75+
7276
val targets = bindingContext[BindingContext.SHORT_REFERENCE_TO_COMPANION_OBJECT, expression]
7377
?.let { listOf(it) }
7478
?: reference.getTargetDescriptors(bindingContext)
@@ -89,8 +93,9 @@ private class CollectUsedDescriptorsVisitor(val file: KtFile) : KtVisitorVoid()
8993

9094
if (isAccessibleAsMember(importableDescriptor, expression, bindingContext)) continue
9195

92-
descriptorsToImport.add(importableDescriptor)
93-
namesToImport.getOrPut(importableFqName) { HashSet() } += importableFqName.shortName()
96+
val descriptorNames = (aliases[importableFqName].orEmpty() + importableFqName.shortName()).intersect(names)
97+
namesToImport.getOrPut(importableFqName) { LinkedHashSet() } += descriptorNames
98+
descriptorsToImport += importableDescriptor
9499
}
95100
}
96101

0 commit comments

Comments
 (0)