diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceExtractUtils.kt b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceExtractUtils.kt index 64d21a63d948..2b08663b1a78 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceExtractUtils.kt +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/inplace/InplaceExtractUtils.kt @@ -97,14 +97,13 @@ object InplaceExtractUtils { if (!checkIdentifierName(editor, file, variableRange)) { return false } - val reference = PsiTreeUtil.findElementOfClassAtOffset(file, variableRange.startOffset, PsiReferenceExpression::class.java, false) - if (reference != null && reference.multiResolve(false).size != 1) { + val identifier = PsiTreeUtil.findElementOfClassAtOffset(file, variableRange.startOffset, PsiIdentifier::class.java, false) + val parent = identifier?.parent + if (parent is PsiReferenceExpression && parent.multiResolve(false).size != 1) { showErrorHint(editor, variableRange.endOffset, JavaRefactoringBundle.message("extract.method.error.method.conflict")) return false } - val member = PsiTreeUtil.findElementOfClassAtOffset(file, variableRange.startOffset, PsiMember::class.java, false) - val parentClass = member?.containingClass - if (member is PsiMethod && parentClass != null && parentClass.findMethodsBySignature(member, true).size > 1) { + if (parent is PsiMethod && parent.containingClass?.findMethodsBySignature(parent, true).orEmpty().size > 1) { showErrorHint(editor, variableRange.endOffset, JavaRefactoringBundle.message("extract.method.error.method.conflict")) return false } diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/CheckNameExtractedFromLambda.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/CheckNameExtractedFromLambda.java new file mode 100644 index 000000000000..5b8560f4a2de --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/CheckNameExtractedFromLambda.java @@ -0,0 +1,21 @@ +package org.example; + +import java.io.File; +import java.util.Collection; + +class Parent { + public boolean test(Collection files) { + return false; + } +} + +class Child extends Parent { + + @Override + public boolean test(Collection files) { + return files.stream().allMatch(file -> { + String name = file.getName(); + return name.endsWith("jar") || name.endsWith("tar"); + }); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/CheckNameExtractedFromLambda_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/CheckNameExtractedFromLambda_after.java new file mode 100644 index 000000000000..4ad7add8cddd --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/CheckNameExtractedFromLambda_after.java @@ -0,0 +1,25 @@ +package org.example; + +import java.io.File; +import java.util.Collection; + +class Parent { + public boolean test(Collection files) { + return false; + } +} + +class Child extends Parent { + + @Override + public boolean test(Collection files) { + return files.stream().allMatch(file -> { + String name = file.getName(); + return isaBoolean(name); + }); + } + + private static boolean isaBoolean(String name) { + return name.endsWith("jar") || name.endsWith("tar"); + } +} \ No newline at end of file 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 c456126f8b20..f96393e546bf 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt @@ -509,6 +509,12 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { doTest() } + fun testCheckNameExtractedFromLambda(){ + doTest { + nextTemplateVariable() + } + } + fun testRefactoringListener(){ templateTest { configureByFile("$BASE_PATH/${getTestName(false)}.java")