Memory optimization: CanBeParameterInspection
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user