From 7e711eaf309665e891478ba71310cfb9ae97f674 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 28 Mar 2018 10:33:49 +0200 Subject: [PATCH] Memory optimization: CanBeParameterInspection --- .../inspections/CanBeParameterInspection.kt | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt index c788ee40aed..3274b683c96 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/CanBeParameterInspection.kt @@ -28,12 +28,13 @@ import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType internal val CONSTRUCTOR_VAL_VAR_MODIFIERS = listOf( - OPEN_KEYWORD, FINAL_KEYWORD, OVERRIDE_KEYWORD, - PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD, - LATEINIT_KEYWORD + OPEN_KEYWORD, FINAL_KEYWORD, OVERRIDE_KEYWORD, + PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD, + LATEINIT_KEYWORD ) class CanBeParameterInspection : AbstractKotlinInspection() { @@ -48,14 +49,17 @@ class CanBeParameterInspection : AbstractKotlinInspection() { // x += something if (parent is KtBinaryExpression && parent.left == element && - KtPsiUtil.isAssignment(parent)) return true + KtPsiUtil.isAssignment(parent) + ) return true // init / constructor / non-local property? var parameterUser: PsiElement = nameExpression do { - parameterUser = PsiTreeUtil.getParentOfType(parameterUser, KtProperty::class.java, KtPropertyAccessor::class.java, - KtClassInitializer::class.java, - KtFunction::class.java, KtObjectDeclaration::class.java, - KtSuperTypeCallEntry::class.java) ?: return true + parameterUser = PsiTreeUtil.getParentOfType( + parameterUser, KtProperty::class.java, KtPropertyAccessor::class.java, + KtClassInitializer::class.java, + KtFunction::class.java, KtObjectDeclaration::class.java, + KtSuperTypeCallEntry::class.java + ) ?: return true } while (parameterUser is KtProperty && parameterUser.isLocal) return when (parameterUser) { is KtProperty -> parameterUser.containingClassOrObject !== klass @@ -91,22 +95,21 @@ class CanBeParameterInspection : AbstractKotlinInspection() { // ZERO_OCCURRENCES: unused at all, reported elsewhere if (psiSearchHelper.isCheapEnoughToSearchConsideringOperators(name, useScope, null, null) != FEW_OCCURRENCES) return KotlinSourceFilterScope.projectSources(useScope, parameter.project) - } - else useScope + } else useScope // Find all references and check them val references = ReferencesSearch.search(parameter, restrictedScope) if (references.none()) return if (references.any { it.usedAsPropertyIn(klass) }) return holder.registerProblem( - valOrVar, - "Constructor parameter is never used as a property", - ProblemHighlightType.LIKE_UNUSED_SYMBOL, - RemoveValVarFix(parameter) + valOrVar, + "Constructor parameter is never used as a property", + ProblemHighlightType.LIKE_UNUSED_SYMBOL, + RemoveValVarFix(parameter) ) }) } - class RemoveValVarFix(val parameter: KtParameter) : LocalQuickFix { + class RemoveValVarFix(parameter: KtParameter) : LocalQuickFix { private val fix = RemoveValVarFromParameterFix(parameter) @@ -115,6 +118,7 @@ class CanBeParameterInspection : AbstractKotlinInspection() { override fun getFamilyName() = fix.familyName override fun applyFix(project: Project, descriptor: ProblemDescriptor) { + val parameter = descriptor.psiElement.getParentOfType(strict = true) ?: return if (!FileModificationService.getInstance().preparePsiElementForWrite(descriptor.psiElement)) return parameter.valOrVarKeyword?.delete() // Delete visibility / open / final / lateinit, if any