diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt index 5d2afb37e162..c238a80bacbe 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractMethodAnalyzer.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.refactoring.extractMethod.newImpl import com.intellij.codeInsight.AnnotationUtil @@ -33,6 +33,7 @@ fun findExtractOptions(elements: List, inferNullity: Boolean = true) require(elements.isNotEmpty()) val analyzer = CodeFragmentAnalyzer(elements) + if (analyzer.hasObservableThrowExit()) throw ExtractException(JavaRefactoringBundle.message("extract.method.error.exception"), elements.first()) val flowOutput = findFlowOutput(analyzer) ?: throw ExtractException(JavaRefactoringBundle.message("extract.method.error.many.exits"), elements.first()) @@ -128,7 +129,6 @@ private fun normalizeType(type: PsiType): PsiType { } private fun findFlowOutput(analyzer: CodeFragmentAnalyzer): FlowOutput? { - if (analyzer.hasObservableThrowExit()) return null val (exitStatements, numberOfExits, isNormalExit) = analyzer.findExitDescription() return when (numberOfExits) { 1 -> if (exitStatements.isNotEmpty()) UnconditionalFlow(exitStatements, isNormalExit) else EmptyFlow diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt index 22262695a126..01371bca87c5 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt @@ -145,13 +145,15 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { } fun testRuntimeCatchMayChangeSemantic1(){ - assertThrows(RefactoringErrorHintException::class.java, JavaRefactoringBundle.message("extract.method.error.many.exits")) { + assertThrows(RefactoringErrorHintException::class.java, + JavaRefactoringBundle.message("extract.method.error.exception")) { doTest() } } fun testRuntimeCatchMayChangeSemantic2(){ - assertThrows(RefactoringErrorHintException::class.java, JavaRefactoringBundle.message("extract.method.error.many.exits")) { + assertThrows(RefactoringErrorHintException::class.java, + JavaRefactoringBundle.message("extract.method.error.exception")) { doTest() } } @@ -189,7 +191,8 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { } fun testDisabledOnSwitchRules(){ - assertThrows(RefactoringErrorHintException::class.java, RefactoringBundle.message("selected.block.should.represent.a.set.of.statements.or.an.expression")) { + assertThrows(RefactoringErrorHintException::class.java, + RefactoringBundle.message("selected.block.should.represent.a.set.of.statements.or.an.expression")) { doTest() } } @@ -634,7 +637,7 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { } ApplicationManager.getApplication().replaceService(HintManager::class.java, manager, testRootDisposable) block.invoke() - if (message != null) throw throw RefactoringErrorHintException(message) + if (message != null) throw RefactoringErrorHintException(message) } private fun startRefactoring(editor: Editor): TemplateState { diff --git a/java/openapi/resources/messages/JavaRefactoringBundle.properties b/java/openapi/resources/messages/JavaRefactoringBundle.properties index b25ac0c5903d..60adb7413087 100644 --- a/java/openapi/resources/messages/JavaRefactoringBundle.properties +++ b/java/openapi/resources/messages/JavaRefactoringBundle.properties @@ -236,6 +236,7 @@ extract.method.error.wrap.many.outputs=There are several output variables in the extract.method.error.wrap.many.outputs.class=a single object extract.method.error.wrap.many.outputs.record=a new record extract.method.error.many.exits=There are multiple exit points. +extract.method.error.exception=It would behave differently when an exception is thrown. extract.method.error.many.finals=There is an assignment to the final field. extract.method.error.variable.in.expression=There is a variable to return inside of the selected expression. extract.method.error.class.not.found=Selected block should be a part of java class.