Allow empty single-line bodies in property accessors

This commit is contained in:
Nikolay Krasko
2016-12-12 20:24:15 +03:00
committed by Nikolay Krasko
parent 2841931ffa
commit 2bb48fc802
18 changed files with 64 additions and 40 deletions
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtPropertyAccessor
val MODIFIERS_LIST_ENTRIES = TokenSet.orSet(TokenSet.create(ANNOTATION_ENTRY, ANNOTATION), MODIFIER_KEYWORDS) val MODIFIERS_LIST_ENTRIES = TokenSet.orSet(TokenSet.create(ANNOTATION_ENTRY, ANNOTATION), MODIFIER_KEYWORDS)
@@ -406,19 +407,33 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing
inPosition(parent = CLASS_BODY, right = RBRACE).lineBreakIfLineBreakInParent(numSpacesOtherwise = 1) inPosition(parent = CLASS_BODY, right = RBRACE).lineBreakIfLineBreakInParent(numSpacesOtherwise = 1)
inPosition(parent = BLOCK, right = RBRACE).customRule { block, left, right -> inPosition(parent = BLOCK, right = RBRACE).customRule { block, left, right ->
val funNode = block.node.treeParent.psi as? KtFunction ?: return@customRule null val psiElement = block.node.treeParent.psi
val empty = left.node.elementType == LBRACE val empty = left.node.elementType == LBRACE
if (funNode.name != null && !empty) return@customRule null
when (psiElement) {
is KtFunction -> {
if (psiElement.name != null && !empty) return@customRule null
}
is KtPropertyAccessor ->
if (!empty) return@customRule null
else ->
return@customRule null
}
val spaces = if (empty) 0 else spacesInSimpleFunction val spaces = if (empty) 0 else spacesInSimpleFunction
Spacing.createDependentLFSpacing(spaces, spaces, funNode.textRange, Spacing.createDependentLFSpacing(spaces, spaces, psiElement.textRange,
codeStyleSettings.KEEP_LINE_BREAKS, codeStyleSettings.KEEP_LINE_BREAKS,
codeStyleSettings.KEEP_BLANK_LINES_IN_CODE) codeStyleSettings.KEEP_BLANK_LINES_IN_CODE)
} }
inPosition(parent = BLOCK, left = LBRACE).customRule { parent, left, right -> inPosition(parent = BLOCK, left = LBRACE).customRule { parent, left, right ->
val funNode = parent.node.treeParent.psi as? KtFunction ?: return@customRule null val psiElement = parent.node.treeParent.psi
val funNode = psiElement as? KtFunction ?: return@customRule null
if (funNode.name != null) return@customRule null if (funNode.name != null) return@customRule null
// Empty block is covered in above rule
Spacing.createDependentLFSpacing(spacesInSimpleFunction, spacesInSimpleFunction, funNode.textRange, Spacing.createDependentLFSpacing(spacesInSimpleFunction, spacesInSimpleFunction, funNode.textRange,
codeStyleSettings.KEEP_LINE_BREAKS, codeStyleSettings.KEEP_LINE_BREAKS,
codeStyleSettings.KEEP_BLANK_LINES_IN_CODE) codeStyleSettings.KEEP_BLANK_LINES_IN_CODE)
@@ -5,8 +5,7 @@ interface I {
class A : I { class A : I {
override var someVar: String override var someVar: String
get() = <caret><selection>TODO("not implemented")</selection> //To change initializer of created properties use File | Settings | File Templates. get() = <caret><selection>TODO("not implemented")</selection> //To change initializer of created properties use File | Settings | File Templates.
set(value) { set(value) {}
}
} }
// ELEMENT_TEXT: "override var someVar: String" // ELEMENT_TEXT: "override var someVar: String"
@@ -5,8 +5,7 @@ open class B {
class A : B { class A : B {
override var someVar: String override var someVar: String
get() = <caret><selection>super.someVar</selection> get() = <caret><selection>super.someVar</selection>
set(value) { set(value) {}
}
} }
// ELEMENT_TEXT: "override var someVar: String" // ELEMENT_TEXT: "override var someVar: String"
@@ -54,6 +54,6 @@ class KotlinPropertySetterBodyFixer : SmartEnterProcessorWithFixers.Fixer<Kotlin
endOffset-- endOffset--
} }
doc.insertString(endOffset, "{}") doc.insertString(endOffset, "{\n}")
} }
} }
@@ -5,6 +5,5 @@ interface A {
class B : A { class B : A {
override var Int.foo: Double override var Int.foo: Double
get() = <selection><caret>TODO("not implemented")</selection> //To change initializer of created properties use File | Settings | File Templates. get() = <selection><caret>TODO("not implemented")</selection> //To change initializer of created properties use File | Settings | File Templates.
set(value) { set(value) {}
}
} }
+8
View File
@@ -13,3 +13,11 @@ class Hi {
var badNoType get() = 1 var badNoType get() = 1
} }
class EmptyProperties {
var newline: String
get() {
return ""
}
set(value) {}
}
+6
View File
@@ -19,3 +19,9 @@ get() = 1
var badNoType get() = 1 var badNoType get() = 1
} }
class EmptyProperties {
var newline: String
get() { return "" }
set(value) {}
}
@@ -13,5 +13,4 @@ private var A.foo: Boolean
get() { get() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
set() { set() {}
}
@@ -11,5 +11,4 @@ private var Int.foo: A<String>
get() { get() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
set() { set() {}
}
+1 -2
View File
@@ -11,8 +11,7 @@ private abstract class Base {
private class BaseImpl : Base() { private class BaseImpl : Base() {
override var x: Int override var x: Int
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
set(value) { set(value) {}
}
override fun toInt(arg: String): Int { override fun toInt(arg: String): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates. TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
@@ -10,7 +10,6 @@ class Container {
class BaseImpl : Base { class BaseImpl : Base {
override var z: Double override var z: Double
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
set(value) { set(value) {}
}
} }
} }
@@ -1111,6 +1111,19 @@ class SmartEnterTest : KotlinLightCodeInsightFixtureTestCase() {
""" """
) )
fun testSetter7() = doFileTest(
"""
var a : Int = 0
set(value){<caret>}
"""
,
"""
var a : Int = 0
set(value) {}
<caret>
"""
)
fun testSetterPrivate1() = doFileTest( fun testSetterPrivate1() = doFileTest(
""" """
var a : Int = 0 var a : Int = 0
+1 -2
View File
@@ -18,7 +18,6 @@ internal class A(// comment for field2 getter
// comment for setProperty // comment for setProperty
var property: Int var property: Int
get() = 1 get() = 1
set(value) { set(value) {} // end of getProperty
} // end of getProperty
// end of setProperty // end of setProperty
} }
+3 -6
View File
@@ -18,8 +18,7 @@ internal interface I {
internal abstract class C : I { internal abstract class C : I {
override var isSomething1: Boolean override var isSomething1: Boolean
get() = true get() = true
set(b) { set(b) {}
}
override var isSomething4: Boolean override var isSomething4: Boolean
get() = false get() = false
@@ -27,11 +26,9 @@ internal abstract class C : I {
override var isSomething5: Boolean override var isSomething5: Boolean
get get
set(value) { set(value) {}
}
override var something6: Boolean override var something6: Boolean
get get
set(value) { set(value) {}
}
} }
+4 -8
View File
@@ -26,18 +26,15 @@ internal open class B {
open var fromB2: String open var fromB2: String
get() = "" get() = ""
set(value) { set(value) {}
}
open var fromB3: String open var fromB3: String
get() = "" get() = ""
set(value) { set(value) {}
}
open var fromB4: String open var fromB4: String
get() = "" get() = ""
set(value) { set(value) {}
}
open fun setFromB5(value: String) {} open fun setFromB5(value: String) {}
} }
@@ -50,8 +47,7 @@ internal abstract class C(override val something1: Int) : B(), I {
override var something3: Int override var something3: Int
get() = 0 get() = 0
set(value) { set(value) {}
}
override var something4: Int override var something4: Int
get() = 0 get() = 0
@@ -90,7 +90,6 @@ internal class D : JavaClassDerivedFromKotlinClassWithProperties() {
override var someVar2: String override var someVar2: String
get() = super.someVar2 get() = super.someVar2
set(value) { set(value) {}
}
} }
+1 -2
View File
@@ -1,3 +1,2 @@
val t: T val t: T
get() { get() {}
}
@@ -5,7 +5,6 @@ package a
open class FooBean { open class FooBean {
fun setBarBean(barBean: BarBean) {} fun setBarBean(barBean: BarBean) {}
} }
open class BarBean open class BarBean