Reformat and cleanup
This commit is contained in:
@@ -1,17 +1,6 @@
|
||||
/*
|
||||
* Copyright 2010-2016 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.core
|
||||
@@ -25,7 +14,6 @@ import com.intellij.psi.util.PsiTreeUtil
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.idea.analysis.analyzeAsReplacement
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||
import org.jetbrains.kotlin.idea.core.ShortenReferences.Options
|
||||
import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport
|
||||
import org.jetbrains.kotlin.idea.imports.getImportableTargets
|
||||
import org.jetbrains.kotlin.idea.util.ImportDescriptorResult
|
||||
@@ -56,10 +44,10 @@ import java.util.*
|
||||
|
||||
class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT }) {
|
||||
data class Options(
|
||||
val removeThisLabels: Boolean = false,
|
||||
val removeThis: Boolean = false,
|
||||
// TODO: remove this option and all related stuff (RETAIN_COMPANION etc.) after KT-13934 fixed
|
||||
val removeExplicitCompanion: Boolean = true
|
||||
val removeThisLabels: Boolean = false,
|
||||
val removeThis: Boolean = false,
|
||||
// TODO: remove this option and all related stuff (RETAIN_COMPANION etc.) after KT-13934 fixed
|
||||
val removeExplicitCompanion: Boolean = true
|
||||
) {
|
||||
companion object {
|
||||
val DEFAULT = Options()
|
||||
@@ -73,18 +61,18 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
|
||||
val RETAIN_COMPANION = ShortenReferences { Options(removeExplicitCompanion = false) }
|
||||
|
||||
private fun DeclarationDescriptor.asString()
|
||||
= DescriptorRenderer.FQ_NAMES_IN_TYPES.render(this)
|
||||
private fun DeclarationDescriptor.asString() = DescriptorRenderer.FQ_NAMES_IN_TYPES.render(this)
|
||||
|
||||
private fun KtReferenceExpression.targets(context: BindingContext) = getImportableTargets(context)
|
||||
|
||||
private fun mayImport(descriptor: DeclarationDescriptor, file: KtFile): Boolean {
|
||||
return descriptor.canBeReferencedViaImport()
|
||||
&& ImportInsertHelper.getInstance(file.project).mayImportOnShortenReferences(descriptor)
|
||||
&& ImportInsertHelper.getInstance(file.project).mayImportOnShortenReferences(descriptor)
|
||||
}
|
||||
}
|
||||
|
||||
@JvmOverloads fun process(element: KtElement, elementFilter: (PsiElement) -> FilterResult = { FilterResult.PROCESS }): KtElement {
|
||||
@JvmOverloads
|
||||
fun process(element: KtElement, elementFilter: (PsiElement) -> FilterResult = { FilterResult.PROCESS }): KtElement {
|
||||
return process(listOf(element), elementFilter).single()
|
||||
}
|
||||
|
||||
@@ -110,26 +98,23 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
range.intersects(elementRange) -> {
|
||||
// for qualified call expression allow to shorten only the part without parenthesis
|
||||
val calleeExpression = ((element as? KtDotQualifiedExpression)
|
||||
?.selectorExpression as? KtCallExpression)
|
||||
?.calleeExpression
|
||||
?.selectorExpression as? KtCallExpression)
|
||||
?.calleeExpression
|
||||
if (calleeExpression != null) {
|
||||
val rangeWithoutParenthesis = TextRange(elementRange.startOffset, calleeExpression.textRange!!.endOffset)
|
||||
if (range.contains(rangeWithoutParenthesis)) FilterResult.PROCESS else FilterResult.GO_INSIDE
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
FilterResult.GO_INSIDE
|
||||
}
|
||||
}
|
||||
|
||||
else -> FilterResult.SKIP
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
FilterResult.SKIP
|
||||
}
|
||||
})
|
||||
}
|
||||
finally {
|
||||
} finally {
|
||||
rangeMarker.dispose()
|
||||
}
|
||||
}
|
||||
@@ -140,15 +125,19 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
PROCESS
|
||||
}
|
||||
|
||||
@JvmOverloads fun process(elements: Iterable<KtElement>, elementFilter: (PsiElement) -> FilterResult = { FilterResult.PROCESS }): Collection<KtElement> {
|
||||
@JvmOverloads
|
||||
fun process(
|
||||
elements: Iterable<KtElement>,
|
||||
elementFilter: (PsiElement) -> FilterResult = { FilterResult.PROCESS }
|
||||
): Collection<KtElement> {
|
||||
return elements.groupBy(KtElement::getContainingKtFile)
|
||||
.flatMap { shortenReferencesInFile(it.key, it.value, elementFilter) }
|
||||
.flatMap { shortenReferencesInFile(it.key, it.value, elementFilter) }
|
||||
}
|
||||
|
||||
private fun shortenReferencesInFile(
|
||||
file: KtFile,
|
||||
elements: List<KtElement>,
|
||||
elementFilter: (PsiElement) -> FilterResult
|
||||
file: KtFile,
|
||||
elements: List<KtElement>,
|
||||
elementFilter: (PsiElement) -> FilterResult
|
||||
): Collection<KtElement> {
|
||||
//TODO: that's not correct since we have options!
|
||||
val elementsToUse = dropNestedElements(elements)
|
||||
@@ -160,8 +149,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
val companionElementFilter = { element: PsiElement ->
|
||||
if (element is KtElement && !options(element).removeExplicitCompanion) {
|
||||
FilterResult.SKIP
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
elementFilter(element)
|
||||
}
|
||||
}
|
||||
@@ -170,10 +158,10 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
// Processors order is important here so that enclosing elements are not shortened before their children are, e.g.
|
||||
// test.foo(this@A) -> foo(this)
|
||||
val processors: List<ShorteningProcessor<*>> = listOf(
|
||||
ShortenTypesProcessor(file, elementFilter, failedToImportDescriptors),
|
||||
ShortenThisExpressionsProcessor(file, elementFilter, failedToImportDescriptors),
|
||||
ShortenQualifiedExpressionsProcessor(file, elementFilter, failedToImportDescriptors),
|
||||
RemoveExplicitCompanionObjectReferenceProcessor(file, companionElementFilter, failedToImportDescriptors)
|
||||
ShortenTypesProcessor(file, elementFilter, failedToImportDescriptors),
|
||||
ShortenThisExpressionsProcessor(file, elementFilter, failedToImportDescriptors),
|
||||
ShortenQualifiedExpressionsProcessor(file, elementFilter, failedToImportDescriptors),
|
||||
RemoveExplicitCompanionObjectReferenceProcessor(file, companionElementFilter, failedToImportDescriptors)
|
||||
)
|
||||
|
||||
// step 1: collect qualified elements to analyze (no resolve at this step)
|
||||
@@ -215,7 +203,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
|
||||
private fun dropNestedElements(elements: List<KtElement>): LinkedHashSet<KtElement> {
|
||||
val elementSet = elements.toSet()
|
||||
return elementSet.filterTo(LinkedHashSet<KtElement>(elementSet.size)) { element ->
|
||||
return elementSet.filterTo(LinkedHashSet(elementSet.size)) { element ->
|
||||
element.parents.none { it in elementSet }
|
||||
}
|
||||
}
|
||||
@@ -223,7 +211,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
private data class ElementToAnalyze<TElement>(val element: TElement, val level: Int)
|
||||
|
||||
private abstract class CollectElementsVisitor<TElement : KtElement>(
|
||||
protected val elementFilter: (PsiElement) -> FilterResult
|
||||
protected val elementFilter: (PsiElement) -> FilterResult
|
||||
) : KtVisitorVoid() {
|
||||
|
||||
var options: Options = Options.DEFAULT
|
||||
@@ -258,8 +246,8 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
|
||||
private abstract class ShorteningProcessor<TElement : KtElement>(
|
||||
protected val file: KtFile,
|
||||
protected val failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
protected val file: KtFile,
|
||||
protected val failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
) {
|
||||
protected val resolutionFacade = file.getResolutionFacade()
|
||||
private val elementsToShorten = ArrayList<SmartPsiElementPointer<TElement>>()
|
||||
@@ -278,25 +266,24 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
|
||||
val toBeShortened: Boolean
|
||||
when (result) {
|
||||
is AnalyzeQualifiedElementResult.ShortenNow -> {
|
||||
AnalyzeQualifiedElementResult.ShortenNow -> {
|
||||
elementsToShorten.add(element.createSmartPointer())
|
||||
toBeShortened = true
|
||||
}
|
||||
|
||||
is AnalyzeQualifiedElementResult.ImportDescriptors -> {
|
||||
val tryImport = result.descriptors.isNotEmpty()
|
||||
&& result.descriptors.none { it in failedToImportDescriptors }
|
||||
&& result.descriptors.all { mayImport(it, file) }
|
||||
&& result.descriptors.none { it in failedToImportDescriptors }
|
||||
&& result.descriptors.all { mayImport(it, file) }
|
||||
toBeShortened = if (tryImport) {
|
||||
descriptorsToImport.addAll(result.descriptors)
|
||||
true
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
is AnalyzeQualifiedElementResult.Skip -> {
|
||||
AnalyzeQualifiedElementResult.Skip -> {
|
||||
toBeShortened = false
|
||||
}
|
||||
}
|
||||
@@ -347,36 +334,36 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
|
||||
private class ShortenTypesProcessor(
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
) : ShorteningProcessor<KtUserType>(file, failedToImportDescriptors) {
|
||||
|
||||
override val collectElementsVisitor: CollectElementsVisitor<KtUserType> =
|
||||
object : CollectElementsVisitor<KtUserType>(elementFilter) {
|
||||
override fun visitUserType(userType: KtUserType) {
|
||||
val filterResult = elementFilter(userType)
|
||||
if (filterResult == FilterResult.SKIP) return
|
||||
object : CollectElementsVisitor<KtUserType>(elementFilter) {
|
||||
override fun visitUserType(userType: KtUserType) {
|
||||
val filterResult = elementFilter(userType)
|
||||
if (filterResult == FilterResult.SKIP) return
|
||||
|
||||
userType.typeArgumentList?.accept(this)
|
||||
userType.typeArgumentList?.accept(this)
|
||||
|
||||
if (filterResult == FilterResult.PROCESS) {
|
||||
addQualifiedElementToAnalyze(userType)
|
||||
}
|
||||
|
||||
// elements in qualifier must be under
|
||||
nextLevel()
|
||||
userType.qualifier?.accept(this)
|
||||
prevLevel()
|
||||
if (filterResult == FilterResult.PROCESS) {
|
||||
addQualifiedElementToAnalyze(userType)
|
||||
}
|
||||
|
||||
// elements in qualifier must be under
|
||||
nextLevel()
|
||||
userType.qualifier?.accept(this)
|
||||
prevLevel()
|
||||
}
|
||||
}
|
||||
|
||||
override fun analyzeQualifiedElement(element: KtUserType, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
||||
if (element.qualifier == null) return AnalyzeQualifiedElementResult.Skip
|
||||
val referenceExpression = element.referenceExpression ?: return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
val target = referenceExpression.targets(bindingContext).singleOrNull()
|
||||
?: return AnalyzeQualifiedElementResult.Skip
|
||||
?: return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
val scope = element.getResolutionScope(bindingContext, resolutionFacade)
|
||||
val name = target.name
|
||||
@@ -386,7 +373,9 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
scope.findPackage(name)
|
||||
|
||||
val canShortenNow = targetByName?.asString() == target.asString()
|
||||
return if (canShortenNow) AnalyzeQualifiedElementResult.ShortenNow else AnalyzeQualifiedElementResult.ImportDescriptors(listOfNotNull(target))
|
||||
return if (canShortenNow) AnalyzeQualifiedElementResult.ShortenNow else AnalyzeQualifiedElementResult.ImportDescriptors(
|
||||
listOfNotNull(target)
|
||||
)
|
||||
}
|
||||
|
||||
override fun shortenElement(element: KtUserType): KtElement {
|
||||
@@ -396,12 +385,13 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
|
||||
private abstract class QualifiedExpressionShorteningProcessor(
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
) : ShorteningProcessor<KtDotQualifiedExpression>(file, failedToImportDescriptors) {
|
||||
|
||||
protected open class MyVisitor(elementFilter: (PsiElement) -> FilterResult) : CollectElementsVisitor<KtDotQualifiedExpression>(elementFilter) {
|
||||
protected open class MyVisitor(elementFilter: (PsiElement) -> FilterResult) :
|
||||
CollectElementsVisitor<KtDotQualifiedExpression>(elementFilter) {
|
||||
override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) {
|
||||
val filterResult = elementFilter(expression)
|
||||
if (filterResult == FilterResult.SKIP) return
|
||||
@@ -423,9 +413,9 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
|
||||
private class ShortenQualifiedExpressionsProcessor(
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
) : QualifiedExpressionShorteningProcessor(file, elementFilter, failedToImportDescriptors) {
|
||||
|
||||
override val collectElementsVisitor = object : MyVisitor(elementFilter) {
|
||||
@@ -435,13 +425,17 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
}
|
||||
|
||||
override fun analyzeQualifiedElement(element: KtDotQualifiedExpression, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
||||
override fun analyzeQualifiedElement(
|
||||
element: KtDotQualifiedExpression,
|
||||
bindingContext: BindingContext
|
||||
): AnalyzeQualifiedElementResult {
|
||||
val receiver = element.receiverExpression
|
||||
if (receiver !is KtThisExpression && bindingContext[BindingContext.QUALIFIER, receiver] == null) return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
if (PsiTreeUtil.getParentOfType(
|
||||
element,
|
||||
KtImportDirective::class.java, KtPackageDirective::class.java) != null) return AnalyzeQualifiedElementResult.Skip
|
||||
KtImportDirective::class.java, KtPackageDirective::class.java
|
||||
) != null) return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
val selector = element.selectorExpression ?: return AnalyzeQualifiedElementResult.Skip
|
||||
val callee = selector.getCalleeExpressionIfAny() as? KtReferenceExpression ?: return AnalyzeQualifiedElementResult.Skip
|
||||
@@ -459,9 +453,9 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
|
||||
val resolvedCallWhenShort = newCallee.getResolvedCall(newContext)
|
||||
val targetsMatch = targetsMatch(targets, targetsWhenShort) &&
|
||||
(resolvedCall !is VariableAsFunctionResolvedCall || (
|
||||
resolvedCallWhenShort is VariableAsFunctionResolvedCall? &&
|
||||
resolvedCallsMatch(resolvedCall, resolvedCallWhenShort)))
|
||||
(resolvedCall !is VariableAsFunctionResolvedCall || (
|
||||
resolvedCallWhenShort is VariableAsFunctionResolvedCall? &&
|
||||
resolvedCallsMatch(resolvedCall, resolvedCallWhenShort)))
|
||||
|
||||
|
||||
// If before and after shorten call can be resolved unambiguously, then preform comparing of such calls,
|
||||
@@ -474,16 +468,17 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
// TODO: Add possibility to check if descriptor from completion can't be resolved after shorten and not preform shorten than
|
||||
val resolvedCallsMatch = if (resolvedCall != null && resolvedCallWhenShort != null) {
|
||||
resolvedCall.resultingDescriptor.original == resolvedCallWhenShort.resultingDescriptor.original
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
val resolvedCalls = selector.getCall(bindingContext)?.resolveCandidates(bindingContext, resolutionFacade) ?: emptyList()
|
||||
val callWhenShort = selectorAfterShortening.getCall(newContext)
|
||||
val resolvedCallsWhenShort = selectorAfterShortening.getCall(newContext)?.resolveCandidates(newContext, resolutionFacade) ?: emptyList()
|
||||
val resolvedCallsWhenShort =
|
||||
selectorAfterShortening.getCall(newContext)?.resolveCandidates(newContext, resolutionFacade) ?: emptyList()
|
||||
|
||||
val descriptorsOfResolvedCallsWhenShort = resolvedCallsWhenShort.map { it.resultingDescriptor.original }
|
||||
val descriptorsOfResolvedCalls = resolvedCalls.mapTo(mutableSetOf()) { it.resultingDescriptor.original }
|
||||
|
||||
val filter = ShadowedDeclarationsFilter(newContext, resolutionFacade, newCallee, callWhenShort?.explicitReceiver as? ReceiverValue)
|
||||
val filter =
|
||||
ShadowedDeclarationsFilter(newContext, resolutionFacade, newCallee, callWhenShort?.explicitReceiver as? ReceiverValue)
|
||||
val availableDescriptorsWhenShort = filter.filter(descriptorsOfResolvedCallsWhenShort)
|
||||
|
||||
availableDescriptorsWhenShort.any { it in descriptorsOfResolvedCalls }
|
||||
@@ -496,10 +491,10 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
val newCall = selectorAfterShortening.getResolvedCall(newContext) ?: return AnalyzeQualifiedElementResult.Skip
|
||||
val receiverKind = originalCall.explicitReceiverKind
|
||||
val newReceiver = when (receiverKind) {
|
||||
ExplicitReceiverKind.BOTH_RECEIVERS, ExplicitReceiverKind.EXTENSION_RECEIVER -> newCall.extensionReceiver
|
||||
ExplicitReceiverKind.DISPATCH_RECEIVER -> newCall.dispatchReceiver
|
||||
else -> return AnalyzeQualifiedElementResult.Skip
|
||||
} as? ImplicitReceiver ?: return AnalyzeQualifiedElementResult.Skip
|
||||
ExplicitReceiverKind.BOTH_RECEIVERS, ExplicitReceiverKind.EXTENSION_RECEIVER -> newCall.extensionReceiver
|
||||
ExplicitReceiverKind.DISPATCH_RECEIVER -> newCall.dispatchReceiver
|
||||
else -> return AnalyzeQualifiedElementResult.Skip
|
||||
} as? ImplicitReceiver ?: return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
val thisTarget = receiver.instanceReference.targets(bindingContext).singleOrNull()
|
||||
if (newReceiver.declarationDescriptor.asString() != thisTarget?.asString()) return AnalyzeQualifiedElementResult.Skip
|
||||
@@ -516,7 +511,10 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
}
|
||||
|
||||
private fun copyShortenAndAnalyze(element: KtDotQualifiedExpression, bindingContext: BindingContext): Pair<BindingContext, KtExpression> {
|
||||
private fun copyShortenAndAnalyze(
|
||||
element: KtDotQualifiedExpression,
|
||||
bindingContext: BindingContext
|
||||
): Pair<BindingContext, KtExpression> {
|
||||
val selector = element.selectorExpression!!
|
||||
|
||||
// selector V V selector V V
|
||||
@@ -529,7 +527,8 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
if (doubleColonExpression != null && doubleColonExpression.receiverExpression == element) {
|
||||
val doubleColonExpressionCopy = doubleColonExpression.copied()
|
||||
doubleColonExpressionCopy.receiverExpression!!.replace(selector)
|
||||
val newBindingContext = doubleColonExpressionCopy.analyzeAsReplacement(doubleColonExpression, bindingContext, resolutionFacade)
|
||||
val newBindingContext =
|
||||
doubleColonExpressionCopy.analyzeAsReplacement(doubleColonExpression, bindingContext, resolutionFacade)
|
||||
return newBindingContext to doubleColonExpressionCopy.receiverExpression!!
|
||||
}
|
||||
|
||||
@@ -550,15 +549,14 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
if (targets1.size != targets2.size) return false
|
||||
return if (targets1.size == 1) {
|
||||
targets1.single().asString() == targets2.single().asString()
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
targets1.map { it.asString() }.toSet() == targets2.map { it.asString() }.toSet()
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolvedCallsMatch(rc1: VariableAsFunctionResolvedCall?, rc2: VariableAsFunctionResolvedCall?): Boolean {
|
||||
return rc1?.variableCall?.candidateDescriptor?.asString() == rc2?.variableCall?.candidateDescriptor?.asString() &&
|
||||
rc1?.functionCall?.candidateDescriptor?.asString() == rc2?.functionCall?.candidateDescriptor?.asString()
|
||||
rc1?.functionCall?.candidateDescriptor?.asString() == rc2?.functionCall?.candidateDescriptor?.asString()
|
||||
}
|
||||
|
||||
override fun shortenElement(element: KtDotQualifiedExpression): KtElement {
|
||||
@@ -571,21 +569,21 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
|
||||
private class ShortenThisExpressionsProcessor(
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
) : ShorteningProcessor<KtThisExpression>(file, failedToImportDescriptors) {
|
||||
|
||||
private val simpleThis = KtPsiFactory(file).createExpression("this") as KtThisExpression
|
||||
|
||||
override val collectElementsVisitor: CollectElementsVisitor<KtThisExpression> =
|
||||
object : CollectElementsVisitor<KtThisExpression>(elementFilter) {
|
||||
override fun visitThisExpression(expression: KtThisExpression) {
|
||||
if (options.removeThisLabels && elementFilter(expression) == FilterResult.PROCESS && expression.getTargetLabel() != null) {
|
||||
addQualifiedElementToAnalyze(expression)
|
||||
}
|
||||
object : CollectElementsVisitor<KtThisExpression>(elementFilter) {
|
||||
override fun visitThisExpression(expression: KtThisExpression) {
|
||||
if (options.removeThisLabels && elementFilter(expression) == FilterResult.PROCESS && expression.getTargetLabel() != null) {
|
||||
addQualifiedElementToAnalyze(expression)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun analyzeQualifiedElement(element: KtThisExpression, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
||||
val targetBefore = element.instanceReference.targets(bindingContext).singleOrNull() ?: return AnalyzeQualifiedElementResult.Skip
|
||||
@@ -600,16 +598,19 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
}
|
||||
|
||||
private class RemoveExplicitCompanionObjectReferenceProcessor(
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
file: KtFile,
|
||||
elementFilter: (PsiElement) -> FilterResult,
|
||||
failedToImportDescriptors: Set<DeclarationDescriptor>
|
||||
) : QualifiedExpressionShorteningProcessor(file, elementFilter, failedToImportDescriptors) {
|
||||
|
||||
private fun KtExpression.singleTarget(context: BindingContext): DeclarationDescriptor? {
|
||||
return (getCalleeExpressionIfAny() as? KtReferenceExpression)?.targets(context)?.singleOrNull()
|
||||
}
|
||||
|
||||
override fun analyzeQualifiedElement(element: KtDotQualifiedExpression, bindingContext: BindingContext): AnalyzeQualifiedElementResult {
|
||||
override fun analyzeQualifiedElement(
|
||||
element: KtDotQualifiedExpression,
|
||||
bindingContext: BindingContext
|
||||
): AnalyzeQualifiedElementResult {
|
||||
val parent = element.parent
|
||||
// TODO: Delete this code when KT-13934 is fixed
|
||||
if (parent is KtCallableReferenceExpression && parent.receiverExpression == element) return AnalyzeQualifiedElementResult.Skip
|
||||
@@ -618,7 +619,8 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
|
||||
if (PsiTreeUtil.getParentOfType(
|
||||
element,
|
||||
KtImportDirective::class.java, KtPackageDirective::class.java) != null) return AnalyzeQualifiedElementResult.Skip
|
||||
KtImportDirective::class.java, KtPackageDirective::class.java
|
||||
) != null) return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
val receiverTarget = receiver.singleTarget(bindingContext) as? ClassDescriptor ?: return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
@@ -628,14 +630,17 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
||||
if (receiverTarget.companionObjectDescriptor != selectorTarget) return AnalyzeQualifiedElementResult.Skip
|
||||
|
||||
val selectorsSelector = (parent as? KtDotQualifiedExpression)?.selectorExpression
|
||||
?: return AnalyzeQualifiedElementResult.ShortenNow
|
||||
?: return AnalyzeQualifiedElementResult.ShortenNow
|
||||
|
||||
val selectorsSelectorTarget = selectorsSelector.singleTarget(bindingContext) ?: return AnalyzeQualifiedElementResult.Skip
|
||||
if (selectorsSelectorTarget is ClassDescriptor) return AnalyzeQualifiedElementResult.Skip
|
||||
// TODO: More generic solution may be possible
|
||||
if (selectorsSelectorTarget is PropertyDescriptor) {
|
||||
val source = selectorsSelectorTarget.source.getPsi() as? KtProperty
|
||||
if (source != null && isEnumCompanionPropertyWithEntryConflict(source, source.name ?: "")) return AnalyzeQualifiedElementResult.Skip
|
||||
if (source != null && isEnumCompanionPropertyWithEntryConflict(
|
||||
source,
|
||||
source.name ?: ""
|
||||
)) return AnalyzeQualifiedElementResult.Skip
|
||||
}
|
||||
|
||||
return AnalyzeQualifiedElementResult.ShortenNow
|
||||
|
||||
Reference in New Issue
Block a user