Faster replacement of get/set to synthetic extensions in converter - don't search for extension property again

This commit is contained in:
Valentin Kipyatkov
2015-08-12 15:44:15 +03:00
parent 21639c4785
commit 0d27e7a259
2 changed files with 18 additions and 10 deletions
@@ -20,7 +20,6 @@ import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper
@@ -41,17 +40,14 @@ class UsePropertyAccessSyntaxInspection : IntentionBasedInspection<JetCallExpres
class UsePropertyAccessSyntaxIntention : JetSelfTargetingOffsetIndependentIntention<JetCallExpression>(javaClass(), "Use property access syntax") {
override fun isApplicableTo(element: JetCallExpression): Boolean {
if (element.getQualifiedExpressionForSelector()?.getReceiverExpression() is JetSuperExpression) return false // cannot call extensions on "super"
return findExtensionPropertyToUse(element) != null
return detectPropertyNameToUse(element) != null
}
override fun applyTo(element: JetCallExpression, editor: Editor) {
applyTo(element)
applyTo(element, detectPropertyNameToUse(element)!!)
}
public fun applyTo(element: JetCallExpression) {
val propertyName = findExtensionPropertyToUse(element)!!.getName()
public fun applyTo(element: JetCallExpression, propertyName: Name) {
val arguments = element.getValueArguments()
when (arguments.size()) {
0 -> replaceWithPropertyGet(element, propertyName)
@@ -60,7 +56,9 @@ class UsePropertyAccessSyntaxIntention : JetSelfTargetingOffsetIndependentIntent
}
}
private fun findExtensionPropertyToUse(callExpression: JetCallExpression): PropertyDescriptor? {
public fun detectPropertyNameToUse(callExpression: JetCallExpression): Name? {
if (callExpression.getQualifiedExpressionForSelector()?.getReceiverExpression() is JetSuperExpression) return null // cannot call extensions on "super"
val callee = callExpression.getCalleeExpression() as? JetSimpleNameExpression ?: return null
val bindingContext = callExpression.analyze(BodyResolveMode.PARTIAL)
@@ -87,7 +85,7 @@ class UsePropertyAccessSyntaxIntention : JetSelfTargetingOffsetIndependentIntent
.map { it.original }
if (property !in accessibleVariables) return null // shadowed by something else
return property
return property.name
}
private fun findSyntheticProperty(function: FunctionDescriptor, resolutionScope: JetScope): SyntheticJavaPropertyDescriptor? {
@@ -45,8 +45,8 @@ object J2KPostProcessingRegistrar {
_processings.add(RemoveExplicitTypeArgumentsProcessing())
_processings.add(MoveLambdaOutsideParenthesesProcessing())
_processings.add(ConvertToStringTemplateProcessing())
_processings.add(UsePropertyAccessSyntaxProcessing())
registerIntentionBasedProcessing(UsePropertyAccessSyntaxIntention()) { applyTo(it) }
registerIntentionBasedProcessing(IfThenToSafeAccessIntention()) { applyTo(it) }
registerIntentionBasedProcessing(IfThenToElvisIntention()) { applyTo(it) }
registerIntentionBasedProcessing(IfNullToElvisIntention()) { applyTo(it) }
@@ -143,4 +143,14 @@ object J2KPostProcessingRegistrar {
}
}
}
private class UsePropertyAccessSyntaxProcessing : J2kPostProcessing {
private val intention = UsePropertyAccessSyntaxIntention()
override fun createAction(element: JetElement, diagnostics: Diagnostics): (() -> Unit)? {
if (element !is JetCallExpression) return null
val propertyName = intention.detectPropertyNameToUse(element) ?: return null
return { intention.applyTo(element, propertyName) }
}
}
}