J2K: generate accessor bodies in expression form if possible
This commit is contained in:
@@ -114,7 +114,7 @@ public class ConvertToExpressionBodyIntention : JetSelfTargetingOffsetIndependen
|
||||
is JetDeclaration, is JetLoopExpression -> return null // is JetExpression but does not have value
|
||||
|
||||
else -> {
|
||||
if (statement is JetBinaryExpression && statement.getOperationToken() == JetTokens.EQ) return null // assignment does not have value
|
||||
if (statement is JetBinaryExpression && statement.operationToken in JetTokens.ALL_ASSIGNMENTS) return null // assignment does not have value
|
||||
val expressionType = statement.analyze().getType(statement) ?: return null
|
||||
if (!KotlinBuiltIns.isUnit(expressionType) && !KotlinBuiltIns.isNothing(expressionType)) return null
|
||||
return statement
|
||||
|
||||
@@ -52,6 +52,7 @@ object J2KPostProcessingRegistrar {
|
||||
_processings.add(ConvertToStringTemplateProcessing())
|
||||
_processings.add(UsePropertyAccessSyntaxProcessing())
|
||||
_processings.add(RemoveRedundantSamAdaptersProcessing())
|
||||
_processings.add(AccessorBodyToExpression())
|
||||
|
||||
registerIntentionBasedProcessing(IfThenToSafeAccessIntention()) { applyTo(it) }
|
||||
registerIntentionBasedProcessing(IfThenToElvisIntention()) { applyTo(it) }
|
||||
@@ -192,4 +193,14 @@ object J2KPostProcessingRegistrar {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class AccessorBodyToExpression : J2kPostProcessing {
|
||||
private val intention = ConvertToExpressionBodyIntention()
|
||||
|
||||
override fun createAction(element: JetElement, diagnostics: Diagnostics): (() -> Unit)? {
|
||||
if (element !is JetPropertyAccessor) return null
|
||||
if (!intention.isApplicableTo(element)) return null
|
||||
return { intention.applyTo(element, true) }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
// IS_APPLICABLE: false
|
||||
|
||||
var x = 0
|
||||
|
||||
fun <caret>foo() {
|
||||
x += 1
|
||||
}
|
||||
@@ -4027,6 +4027,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("assignPlus.kt")
|
||||
public void testAssignPlus() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToExpressionBody/assignPlus.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("assignment.kt")
|
||||
public void testAssignment() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToExpressionBody/assignment.kt");
|
||||
|
||||
@@ -347,7 +347,7 @@ class Converter private constructor(
|
||||
getter = PropertyAccessor(AccessorKind.GETTER, method.annotations, Modifiers.Empty, method.parameterList, method.body)
|
||||
getter.assignPrototype(getMethod, CommentsAndSpacesInheritance.NO_SPACES)
|
||||
}
|
||||
else if (propertyInfo.isOverride) { //TODO: expression body!
|
||||
else if (propertyInfo.isOverride) {
|
||||
val superExpression = SuperExpression(Identifier.Empty).assignNoPrototype()
|
||||
val superAccess = QualifiedExpression(superExpression, propertyInfo.identifier).assignNoPrototype()
|
||||
val returnStatement = ReturnStatement(superAccess).assignNoPrototype()
|
||||
@@ -372,7 +372,7 @@ class Converter private constructor(
|
||||
method.body)
|
||||
setter.assignPrototype(setMethod, CommentsAndSpacesInheritance.NO_SPACES)
|
||||
}
|
||||
else if (propertyInfo.isOverride) { //TODO: expression body!
|
||||
else if (propertyInfo.isOverride) {
|
||||
val superExpression = SuperExpression(Identifier.Empty).assignNoPrototype()
|
||||
val superAccess = QualifiedExpression(superExpression, propertyInfo.identifier).assignNoPrototype()
|
||||
val valueIdentifier = Identifier("value", false).assignNoPrototype()
|
||||
|
||||
@@ -3,9 +3,7 @@ internal object Library {
|
||||
}
|
||||
|
||||
val string: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
}
|
||||
|
||||
internal class User {
|
||||
|
||||
+1
-3
@@ -5,9 +5,7 @@ internal class Library {
|
||||
}
|
||||
|
||||
val string: String?
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
}
|
||||
|
||||
internal class User {
|
||||
|
||||
+1
-3
@@ -3,9 +3,7 @@ internal class Library {
|
||||
}
|
||||
|
||||
val string: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
}
|
||||
|
||||
internal class User {
|
||||
|
||||
@@ -3,7 +3,5 @@ internal class A {
|
||||
private val s: String? = null
|
||||
|
||||
val value: Any
|
||||
get() {
|
||||
return s
|
||||
}
|
||||
}
|
||||
get() = s
|
||||
}
|
||||
+13
-39
@@ -22,28 +22,20 @@ internal interface I1 : I {
|
||||
|
||||
internal open class B {
|
||||
open val fromB1: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
|
||||
open var fromB2: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
set(value: String) {
|
||||
}
|
||||
|
||||
open var fromB3: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
set(value: String) {
|
||||
}
|
||||
|
||||
open var fromB4: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
set(value: String) {
|
||||
}
|
||||
|
||||
@@ -55,29 +47,21 @@ internal abstract class C(override val something1: Int) : B(), I {
|
||||
private var mySomething6: Int = 0
|
||||
|
||||
override val something2: Int
|
||||
get() {
|
||||
return 0
|
||||
}
|
||||
get() = 0
|
||||
|
||||
override var something3: Int
|
||||
get() {
|
||||
return 0
|
||||
}
|
||||
get() = 0
|
||||
set(value: Int) {
|
||||
}
|
||||
|
||||
override var something4: Int
|
||||
get() {
|
||||
return 0
|
||||
}
|
||||
get() = 0
|
||||
set(value: Int) {
|
||||
super.something4 = value
|
||||
}
|
||||
|
||||
override var something5: Int
|
||||
get() {
|
||||
return super.something5
|
||||
}
|
||||
get() = super.something5
|
||||
set(value: Int) {
|
||||
|
||||
}
|
||||
@@ -91,38 +75,28 @@ internal abstract class C(override val something1: Int) : B(), I {
|
||||
}
|
||||
|
||||
override val fromB1: String
|
||||
get() {
|
||||
return super.fromB1
|
||||
}
|
||||
get() = super.fromB1
|
||||
|
||||
override var fromB2: String
|
||||
get() {
|
||||
return super.fromB2
|
||||
}
|
||||
get() = super.fromB2
|
||||
set(value: String) {
|
||||
super.fromB2 = value
|
||||
}
|
||||
|
||||
override var fromB3: String
|
||||
get() {
|
||||
return super.fromB3
|
||||
}
|
||||
get() = super.fromB3
|
||||
set(value: String) {
|
||||
super.fromB3 = value
|
||||
}
|
||||
|
||||
override var fromB4: String
|
||||
get() {
|
||||
return super.fromB4
|
||||
}
|
||||
get() = super.fromB4
|
||||
set(value: String) {
|
||||
super.fromB4 = value
|
||||
}
|
||||
|
||||
val fromB5: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
|
||||
override fun setFromB5(value: String) {
|
||||
super.setFromB5(value)
|
||||
|
||||
@@ -4,41 +4,31 @@ import javaApi.JavaClassDerivedFromKotlinClassWithProperties
|
||||
|
||||
internal open class A : KotlinClassWithProperties() {
|
||||
override var someVar1: String
|
||||
get() {
|
||||
return super.someVar1
|
||||
}
|
||||
get() = super.someVar1
|
||||
set(s: String) {
|
||||
super.someVar1 = s
|
||||
}
|
||||
|
||||
override var someVar2: String
|
||||
get() {
|
||||
return super.someVar2
|
||||
}
|
||||
get() = super.someVar2
|
||||
set(value: String) {
|
||||
super.someVar2 = value
|
||||
}
|
||||
|
||||
override var someVar3: String
|
||||
get() {
|
||||
return super.someVar3
|
||||
}
|
||||
get() = super.someVar3
|
||||
set(s: String) {
|
||||
super.someVar3 = s
|
||||
}
|
||||
|
||||
override var someVar4: String
|
||||
get() {
|
||||
return super.someVar4
|
||||
}
|
||||
get() = super.someVar4
|
||||
set(value: String) {
|
||||
super.someVar4 = value
|
||||
}
|
||||
|
||||
override val someVal: String
|
||||
get() {
|
||||
return super.someVal
|
||||
}
|
||||
get() = super.someVal
|
||||
|
||||
override fun getSomething1() {
|
||||
super.getSomething1()
|
||||
@@ -85,9 +75,7 @@ internal class B : JavaClassWithProperties() {
|
||||
|
||||
internal class C : A() {
|
||||
override var someVar1: String
|
||||
get() {
|
||||
return super.someVar1
|
||||
}
|
||||
get() = super.someVar1
|
||||
set(value: String) {
|
||||
super.someVar1 = value
|
||||
}
|
||||
@@ -95,17 +83,13 @@ internal class C : A() {
|
||||
|
||||
internal class D : JavaClassDerivedFromKotlinClassWithProperties() {
|
||||
override var someVar1: String
|
||||
get() {
|
||||
return "a"
|
||||
}
|
||||
get() = "a"
|
||||
set(value: String) {
|
||||
super.someVar1 = value
|
||||
}
|
||||
|
||||
override var someVar2: String
|
||||
get() {
|
||||
return super.someVar2
|
||||
}
|
||||
get() = super.someVar2
|
||||
set(value: String) {
|
||||
}
|
||||
|
||||
|
||||
+1
-3
@@ -8,8 +8,6 @@ internal class A {
|
||||
companion object {
|
||||
|
||||
val byte: Byte
|
||||
get() {
|
||||
return 0
|
||||
}
|
||||
get() = 0
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -1,4 +1,2 @@
|
||||
val string: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
@@ -1,4 +1,2 @@
|
||||
val isTrue: Boolean
|
||||
get() {
|
||||
return true
|
||||
}
|
||||
get() = true
|
||||
+1
-3
@@ -1,4 +1,2 @@
|
||||
val string: String
|
||||
get() {
|
||||
return ""
|
||||
}
|
||||
get() = ""
|
||||
@@ -7,9 +7,7 @@ internal class C {
|
||||
get() {
|
||||
foo(object : I {
|
||||
override val int: Int
|
||||
get() {
|
||||
return 0
|
||||
}
|
||||
get() = 0
|
||||
})
|
||||
return string
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user