From 0cc52e2ff8cc4eb054d04e5b8277747fade6d5c0 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 1 Dec 2016 19:23:18 +0300 Subject: [PATCH] KT-12100 convert try / finally to use: safe close() is allowed in finally + correct new lines --- .../ConvertTryFinallyToUseCallIntention.kt | 8 ++++---- .../convertTryFinallyToUseCall/example.kt.after | 4 +++- .../implicitReceiver.kt.after | 4 +++- .../convertTryFinallyToUseCall/parameter.kt.after | 4 +++- .../convertTryFinallyToUseCall/safeCall.kt | 4 +++- .../convertTryFinallyToUseCall/safeCall.kt.after | 12 ++++++++++++ .../convertTryFinallyToUseCall/simple.kt.after | 4 +++- .../convertTryFinallyToUseCall/this.kt.after | 4 +++- .../convertTryFinallyToUseCall/thisLabeled.kt.after | 4 +++- 9 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt index 9dafe551cad..e54f2050936 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.contentRange import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall -import org.jetbrains.kotlin.resolve.calls.callUtil.isSafeCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver @@ -40,7 +39,7 @@ class ConvertTryFinallyToUseCallIntention : SelfTargetingOffsetIndependentIntent override fun applyTo(element: KtTryExpression, editor: Editor?) { val finallySection = element.finallyBlock!! val finallyExpression = finallySection.finalExpression.statements.single() - val finallyExpressionReceiver = (finallyExpression as? KtDotQualifiedExpression)?.receiverExpression + val finallyExpressionReceiver = (finallyExpression as? KtQualifiedExpression)?.receiverExpression val resourceReference = finallyExpressionReceiver as? KtNameReferenceExpression val resourceName = resourceReference?.getReferencedNameAsName() @@ -61,9 +60,10 @@ class ConvertTryFinallyToUseCallIntention : SelfTargetingOffsetIndependentIntent appendName(resourceName) appendFixedText("->") } + appendFixedText("\n") appendChildRange(element.tryBlock.contentRange()) - appendFixedText("}") + appendFixedText("\n}") } element.replace(useCallExpression) @@ -77,8 +77,8 @@ class ConvertTryFinallyToUseCallIntention : SelfTargetingOffsetIndependentIntent val context = element.analyze() val resolvedCall = finallyExpression.getResolvedCall(context) ?: return false - if (resolvedCall.call.isSafeCall()) return false if (resolvedCall.candidateDescriptor.name.asString() != "close") return false + if (resolvedCall.extensionReceiver != null) return false val receiver = resolvedCall.dispatchReceiver ?: return false if (receiver.type.supertypes().all { it.constructor.declarationDescriptor?.fqNameSafe?.asString().let { diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/example.kt.after b/idea/testData/intentions/convertTryFinallyToUseCall/example.kt.after index 9c8f7810260..e5ee135c732 100644 --- a/idea/testData/intentions/convertTryFinallyToUseCall/example.kt.after +++ b/idea/testData/intentions/convertTryFinallyToUseCall/example.kt.after @@ -3,5 +3,7 @@ import java.io.File fun main(args: Array) { val reader = File("hello-world.txt").bufferedReader() - reader.use { reader -> // do stuff with reader } + reader.use { reader -> + // do stuff with reader + } } \ No newline at end of file diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/implicitReceiver.kt.after b/idea/testData/intentions/convertTryFinallyToUseCall/implicitReceiver.kt.after index cc1c75470fc..cc562bbd48d 100644 --- a/idea/testData/intentions/convertTryFinallyToUseCall/implicitReceiver.kt.after +++ b/idea/testData/intentions/convertTryFinallyToUseCall/implicitReceiver.kt.after @@ -3,5 +3,7 @@ import java.io.File import java.io.BufferedReader fun BufferedReader.foo() { - use { readLine() } + use { + readLine() + } } \ No newline at end of file diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/parameter.kt.after b/idea/testData/intentions/convertTryFinallyToUseCall/parameter.kt.after index 0f0d8d2c1dd..1d7015e0923 100644 --- a/idea/testData/intentions/convertTryFinallyToUseCall/parameter.kt.after +++ b/idea/testData/intentions/convertTryFinallyToUseCall/parameter.kt.after @@ -3,5 +3,7 @@ import java.io.File import java.io.BufferedReader fun foo(reader: BufferedReader) { - reader.use { reader -> reader.readLine() } + reader.use { reader -> + reader.readLine() + } } \ No newline at end of file diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt b/idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt index dd7664e5953..8602183c8a8 100644 --- a/idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt +++ b/idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt @@ -1,11 +1,13 @@ -// IS_APPLICABLE: false // WITH_RUNTIME import java.io.File import java.io.BufferedReader +fun bar() {} + fun foo(reader: BufferedReader?) { try { reader?.readLine() + bar() } finally { reader?.close() diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt.after b/idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt.after new file mode 100644 index 00000000000..4d7acfa4f15 --- /dev/null +++ b/idea/testData/intentions/convertTryFinallyToUseCall/safeCall.kt.after @@ -0,0 +1,12 @@ +// WITH_RUNTIME +import java.io.File +import java.io.BufferedReader + +fun bar() {} + +fun foo(reader: BufferedReader?) { + reader.use { reader -> + reader?.readLine() + bar() + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/simple.kt.after b/idea/testData/intentions/convertTryFinallyToUseCall/simple.kt.after index 8d61c32a3a1..4e179e5fd76 100644 --- a/idea/testData/intentions/convertTryFinallyToUseCall/simple.kt.after +++ b/idea/testData/intentions/convertTryFinallyToUseCall/simple.kt.after @@ -3,5 +3,7 @@ import java.io.File fun main(args: Array) { val reader = File("hello-world.txt").bufferedReader() - reader.use { reader -> reader.readLine() } + reader.use { reader -> + reader.readLine() + } } \ No newline at end of file diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/this.kt.after b/idea/testData/intentions/convertTryFinallyToUseCall/this.kt.after index 56320e46a86..c0858205716 100644 --- a/idea/testData/intentions/convertTryFinallyToUseCall/this.kt.after +++ b/idea/testData/intentions/convertTryFinallyToUseCall/this.kt.after @@ -3,5 +3,7 @@ import java.io.File import java.io.BufferedReader fun BufferedReader.foo() { - this.use { this.readLine() } + this.use { + this.readLine() + } } \ No newline at end of file diff --git a/idea/testData/intentions/convertTryFinallyToUseCall/thisLabeled.kt.after b/idea/testData/intentions/convertTryFinallyToUseCall/thisLabeled.kt.after index 3823587152b..9c9beb06127 100644 --- a/idea/testData/intentions/convertTryFinallyToUseCall/thisLabeled.kt.after +++ b/idea/testData/intentions/convertTryFinallyToUseCall/thisLabeled.kt.after @@ -8,6 +8,8 @@ class MyCloseable : Closeable { fun process(x: Int) = x fun Int.foo() { - this@MyCloseable.use { this@MyCloseable.process(this) } + this@MyCloseable.use { + this@MyCloseable.process(this) + } } } \ No newline at end of file