Memory optimization: CanBeParameterInspection

This commit is contained in:
Mikhail Glukhikh
2018-03-28 10:33:49 +02:00
parent 491eeb3d6f
commit 7e711eaf30
@@ -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<KtParameter>(strict = true) ?: return
if (!FileModificationService.getInstance().preparePsiElementForWrite(descriptor.psiElement)) return
parameter.valOrVarKeyword?.delete()
// Delete visibility / open / final / lateinit, if any