Assign backing field: don't add empty line

#KT-28694 Fixed
This commit is contained in:
Toshiaki Kameyama
2018-12-10 14:47:35 +09:00
committed by Mikhail Glukhikh
parent 79537a5fdb
commit 07ffac72cf
6 changed files with 28 additions and 6 deletions
@@ -8,12 +8,14 @@ package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeInspection.* import com.intellij.codeInspection.*
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.siblings
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
@@ -69,7 +71,7 @@ private val assignmentOperators = listOf(KtTokens.EQ, KtTokens.PLUSEQ, KtTokens.
private val incrementAndDecrementOperators = listOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS) private val incrementAndDecrementOperators = listOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS)
private class AssignBackingFieldFix : LocalQuickFix { private class AssignBackingFieldFix : LocalQuickFix {
override fun getName() = "Assign backing filed" override fun getName() = "Assign backing field"
override fun getFamilyName() = name override fun getFamilyName() = name
@@ -77,10 +79,11 @@ private class AssignBackingFieldFix : LocalQuickFix {
val setter = descriptor.psiElement as? KtPropertyAccessor ?: return val setter = descriptor.psiElement as? KtPropertyAccessor ?: return
val parameter = setter.valueParameters.firstOrNull() ?: return val parameter = setter.valueParameters.firstOrNull() ?: return
val bodyExpression = setter.bodyBlockExpression ?: return val bodyExpression = setter.bodyBlockExpression ?: return
setter.hasBlockBody() bodyExpression.lBrace
bodyExpression.addBefore( ?.siblings(withItself = false)
KtPsiFactory(setter).createExpression("field = ${parameter.text}"), ?.takeWhile { it != bodyExpression.rBrace }
bodyExpression.rBrace ?.singleOrNull { it is PsiWhiteSpace }
) ?.also { it.delete() }
bodyExpression.addBefore(KtPsiFactory(setter).createExpression("field = ${parameter.text}"), bodyExpression.rBrace)
} }
} }
@@ -1,3 +1,4 @@
// FIX: Assign backing field
class Test { class Test {
var foo: Int = 1 var foo: Int = 1
<caret>set(value) { <caret>set(value) {
@@ -1,3 +1,4 @@
// FIX: Assign backing field
class Test { class Test {
var foo: Int = 1 var foo: Int = 1
set(value) { set(value) {
@@ -0,0 +1,6 @@
class Test {
var foo: Int = 1
<caret>set(value) {
}
}
@@ -0,0 +1,6 @@
class Test {
var foo: Int = 1
set(value) {
field = value
}
}
@@ -6354,6 +6354,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/setterBackingFieldAssignment/noAssignment2.kt"); runTest("idea/testData/inspectionsLocal/setterBackingFieldAssignment/noAssignment2.kt");
} }
@TestMetadata("noAssignment3.kt")
public void testNoAssignment3() throws Exception {
runTest("idea/testData/inspectionsLocal/setterBackingFieldAssignment/noAssignment3.kt");
}
@TestMetadata("noBackingField.kt") @TestMetadata("noBackingField.kt")
public void testNoBackingField() throws Exception { public void testNoBackingField() throws Exception {
runTest("idea/testData/inspectionsLocal/setterBackingFieldAssignment/noBackingField.kt"); runTest("idea/testData/inspectionsLocal/setterBackingFieldAssignment/noBackingField.kt");