From c05232bbb7605f6bbb4af2eeb8b11429ca931c8b Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 23 Sep 2015 15:11:22 +0300 Subject: [PATCH] J2K: generate accessor bodies in expression form if possible --- .../ConvertToExpressionBodyIntention.kt | 2 +- .../kotlin/idea/j2k/J2kPostProcessings.kt | 11 ++++ .../convertToExpressionBody/assignPlus.kt | 7 +++ .../intentions/IntentionTestGenerated.java | 6 +++ j2k/src/org/jetbrains/kotlin/j2k/Converter.kt | 4 +- .../callChainExpression/libraryMethodCall.kt | 4 +- .../libraryMethodCallFromInstance-settings.kt | 4 +- .../libraryMethodCallFromInstance.kt | 4 +- .../dropAccessors/GetterTypeNotMatch.kt | 6 +-- .../fileOrElement/dropAccessors/Overrides.kt | 52 +++++-------------- .../dropAccessors/OverridesOfExternalCode.kt | 32 +++--------- .../fileOrElement/field/conversion.kt | 4 +- j2k/testData/fileOrElement/function/final.kt | 4 +- .../function/methodWithReturnStatement.kt | 4 +- j2k/testData/fileOrElement/function/open.kt | 4 +- .../returnStatement/currentMethodBug.kt | 4 +- 16 files changed, 58 insertions(+), 94 deletions(-) create mode 100644 idea/testData/intentions/convertToExpressionBody/assignPlus.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt index 4f22b42f7df..949f1e107ce 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToExpressionBodyIntention.kt @@ -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 diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt index fc59840067c..a29f89f57c8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt @@ -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) } + } + } } \ No newline at end of file diff --git a/idea/testData/intentions/convertToExpressionBody/assignPlus.kt b/idea/testData/intentions/convertToExpressionBody/assignPlus.kt new file mode 100644 index 00000000000..1a835b6433e --- /dev/null +++ b/idea/testData/intentions/convertToExpressionBody/assignPlus.kt @@ -0,0 +1,7 @@ +// IS_APPLICABLE: false + +var x = 0 + +fun foo() { + x += 1 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 1986ba4f345..1b4283b0ead 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -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"); diff --git a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt b/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt index 67d5c7f350d..d2959b43145 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/Converter.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() diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt index 7a22d376b62..ef5bbcdc05c 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCall.kt @@ -3,9 +3,7 @@ internal object Library { } val string: String - get() { - return "" - } + get() = "" } internal class User { diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt index 3e1a523f2b2..5e1c3388c67 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance-settings.kt @@ -5,9 +5,7 @@ internal class Library { } val string: String? - get() { - return "" - } + get() = "" } internal class User { diff --git a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt index 2030c23e08e..4f5ecd203cb 100644 --- a/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt +++ b/j2k/testData/fileOrElement/callChainExpression/libraryMethodCallFromInstance.kt @@ -3,9 +3,7 @@ internal class Library { } val string: String - get() { - return "" - } + get() = "" } internal class User { diff --git a/j2k/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt b/j2k/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt index 9dc7fee2233..db7ba239de3 100644 --- a/j2k/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt +++ b/j2k/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt @@ -3,7 +3,5 @@ internal class A { private val s: String? = null val value: Any - get() { - return s - } -} + get() = s +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/dropAccessors/Overrides.kt b/j2k/testData/fileOrElement/dropAccessors/Overrides.kt index 6c8395865c3..4740da522dc 100644 --- a/j2k/testData/fileOrElement/dropAccessors/Overrides.kt +++ b/j2k/testData/fileOrElement/dropAccessors/Overrides.kt @@ -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) diff --git a/j2k/testData/fileOrElement/dropAccessors/OverridesOfExternalCode.kt b/j2k/testData/fileOrElement/dropAccessors/OverridesOfExternalCode.kt index a840b7d7eff..96fc5059d9e 100644 --- a/j2k/testData/fileOrElement/dropAccessors/OverridesOfExternalCode.kt +++ b/j2k/testData/fileOrElement/dropAccessors/OverridesOfExternalCode.kt @@ -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) { } diff --git a/j2k/testData/fileOrElement/field/conversion.kt b/j2k/testData/fileOrElement/field/conversion.kt index db8229e4308..a11f5af0154 100644 --- a/j2k/testData/fileOrElement/field/conversion.kt +++ b/j2k/testData/fileOrElement/field/conversion.kt @@ -8,8 +8,6 @@ internal class A { companion object { val byte: Byte - get() { - return 0 - } + get() = 0 } } \ No newline at end of file diff --git a/j2k/testData/fileOrElement/function/final.kt b/j2k/testData/fileOrElement/function/final.kt index d1c25ac9d65..b365c5d78e8 100644 --- a/j2k/testData/fileOrElement/function/final.kt +++ b/j2k/testData/fileOrElement/function/final.kt @@ -1,4 +1,2 @@ val string: String - get() { - return "" - } \ No newline at end of file + get() = "" \ No newline at end of file diff --git a/j2k/testData/fileOrElement/function/methodWithReturnStatement.kt b/j2k/testData/fileOrElement/function/methodWithReturnStatement.kt index b707a1331a3..32795d79ad8 100644 --- a/j2k/testData/fileOrElement/function/methodWithReturnStatement.kt +++ b/j2k/testData/fileOrElement/function/methodWithReturnStatement.kt @@ -1,4 +1,2 @@ val isTrue: Boolean - get() { - return true - } \ No newline at end of file + get() = true \ No newline at end of file diff --git a/j2k/testData/fileOrElement/function/open.kt b/j2k/testData/fileOrElement/function/open.kt index d1c25ac9d65..b365c5d78e8 100644 --- a/j2k/testData/fileOrElement/function/open.kt +++ b/j2k/testData/fileOrElement/function/open.kt @@ -1,4 +1,2 @@ val string: String - get() { - return "" - } \ No newline at end of file + get() = "" \ No newline at end of file diff --git a/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt b/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt index 22bf7e09a9b..a75bd8d1c0a 100644 --- a/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt +++ b/j2k/testData/fileOrElement/returnStatement/currentMethodBug.kt @@ -7,9 +7,7 @@ internal class C { get() { foo(object : I { override val int: Int - get() { - return 0 - } + get() = 0 }) return string }