J2K: generate accessor bodies in expression form if possible

This commit is contained in:
Valentin Kipyatkov
2015-09-23 15:11:22 +03:00
parent ee5a853faa
commit c05232bbb7
16 changed files with 58 additions and 94 deletions
@@ -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 {
@@ -5,9 +5,7 @@ internal class Library {
}
val string: String?
get() {
return ""
}
get() = ""
}
internal class User {
@@ -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
View File
@@ -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
View File
@@ -8,8 +8,6 @@ internal class A {
companion object {
val byte: Byte
get() {
return 0
}
get() = 0
}
}
+1 -3
View File
@@ -1,4 +1,2 @@
val string: String
get() {
return ""
}
get() = ""
@@ -1,4 +1,2 @@
val isTrue: Boolean
get() {
return true
}
get() = true
+1 -3
View File
@@ -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
}