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