Do not suggest destructuring in function literal in 1.0 compatibility mode #KT-15134 Fixed

This commit is contained in:
Mikhail Glukhikh
2017-01-27 15:55:37 +03:00
committed by mglukhikh
parent 3cd4d7cbfe
commit 67e207acb0
@@ -23,12 +23,14 @@ import com.intellij.psi.PsiReference
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.util.Processor import com.intellij.util.Processor
import com.intellij.util.Query import com.intellij.util.Query
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.*
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -45,7 +47,7 @@ import java.util.*
class DestructureInspection : IntentionBasedInspection<KtDeclaration>( class DestructureInspection : IntentionBasedInspection<KtDeclaration>(
DestructureIntention::class, DestructureIntention::class,
{ element, inspection -> { element, _ ->
if (element is KtParameter) true if (element is KtParameter) true
else { else {
val usagesToRemove = DestructureIntention.collectUsagesToRemove(element)?.data val usagesToRemove = DestructureIntention.collectUsagesToRemove(element)?.data
@@ -127,18 +129,21 @@ class DestructureIntention : SelfTargetingRangeIntention<KtDeclaration>(
internal fun KtDeclaration.isSuitableDeclaration() = getUsageScopeElement() != null internal fun KtDeclaration.isSuitableDeclaration() = getUsageScopeElement() != null
private fun KtDeclaration.getUsageScopeElement() = when (this) { private fun KtDeclaration.getUsageScopeElement(): PsiElement? {
is KtParameter -> { val lambdaSupported = languageVersionSettings.supportsFeature(LanguageFeature.DestructuringLambdaParameters)
val parent = parent return when (this) {
when { is KtParameter -> {
parent is KtForExpression -> parent val parent = parent
parent?.parent is KtFunctionLiteral -> parent.parent when {
else -> null parent is KtForExpression -> parent
parent.parent is KtFunctionLiteral -> if (lambdaSupported) parent.parent else null
else -> null
}
} }
is KtVariableDeclaration -> parent
is KtFunctionLiteral -> if (!hasParameterSpecification() && lambdaSupported) this else null
else -> null
} }
is KtVariableDeclaration -> parent
is KtFunctionLiteral -> if (!hasParameterSpecification()) this else null
else -> null
} }
internal data class UsagesToRemove(val data: List<UsageData>, val removeSelectorInLoopRange: Boolean) internal data class UsagesToRemove(val data: List<UsageData>, val removeSelectorInLoopRange: Boolean)