diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtTryExpression.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtTryExpression.java index 8d82d7d4b5d..dc08c4b91ee 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtTryExpression.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtTryExpression.java @@ -17,9 +17,11 @@ package org.jetbrains.kotlin.psi; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.KtNodeTypes; +import org.jetbrains.kotlin.lexer.KtTokens; import java.util.List; @@ -48,4 +50,8 @@ public class KtTryExpression extends KtExpressionImpl { return (KtFinallySection) findChildByType(KtNodeTypes.FINALLY); } + @Nullable + public PsiElement getTryKeyword() { + return findChildByType(KtTokens.TRY_KEYWORD); + } } diff --git a/idea/resources/inspectionDescriptions/ConvertTryFinallyToUseCall.html b/idea/resources/inspectionDescriptions/ConvertTryFinallyToUseCall.html new file mode 100644 index 00000000000..ccce7ce9af1 --- /dev/null +++ b/idea/resources/inspectionDescriptions/ConvertTryFinallyToUseCall.html @@ -0,0 +1,5 @@ + + +This inspection reports a try-finally block with resource.close() in finally which can be converted into the resource.use() call + + \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 6e9f7959332..c2cf48a6e7d 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -1957,6 +1957,14 @@ language="kotlin" /> + + diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt index ec4891ac224..f383821a6cd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertTryFinallyToUseCallIntention.kt @@ -17,10 +17,13 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiElement import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.psi.psiUtil.contentRange @@ -29,6 +32,10 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.types.typeUtil.supertypes +class ConvertTryFinallyToUseCallInspection : IntentionBasedInspection(ConvertTryFinallyToUseCallIntention::class) { + override fun inspectionTarget(element: KtTryExpression) = element.tryKeyword ?: element.tryBlock +} + class ConvertTryFinallyToUseCallIntention : SelfTargetingOffsetIndependentIntention( KtTryExpression::class.java, "Convert try-finally to .use()" ) {