diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/MethodExtractor.kt b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/MethodExtractor.kt index 590e6d56e38d..8456e8142fee 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/MethodExtractor.kt +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/MethodExtractor.kt @@ -1,4 +1,4 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// 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.Nullability @@ -17,6 +17,7 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange import com.intellij.platform.ide.progress.withBackgroundProgress import com.intellij.psi.* +import com.intellij.psi.impl.source.PsiFileImpl import com.intellij.psi.util.PsiEditorUtil import com.intellij.psi.util.PsiTreeUtil import com.intellij.refactoring.JavaRefactoringSettings @@ -130,7 +131,8 @@ class MethodExtractor { val prepareStart = System.currentTimeMillis() readAction { JavaDuplicatesFinder.linkCopiedClassMembersWithOrigin(file) } - val copiedFile = readAction { file.copy() as PsiFile } + val copiedFile = readAction { file.copy() as PsiFileImpl } + copiedFile.originalFile = file val elementsInCopy = readAction { ExtractSelector().suggestElementsToExtract(copiedFile, range) } val descriptorsForAllTargetPlaces = prepareDescriptorsForAllTargetPlaces(file.project, editor, elementsInCopy) diff --git a/java/java-impl/src/com/intellij/refactoring/IntroduceVariableUtil.java b/java/java-impl/src/com/intellij/refactoring/IntroduceVariableUtil.java index b830e3f18add..afe7cec8ba89 100644 --- a/java/java-impl/src/com/intellij/refactoring/IntroduceVariableUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/IntroduceVariableUtil.java @@ -351,10 +351,14 @@ public final class IntroduceVariableUtil { final PsiType componentType = TypeConversionUtil.erasure(psiSubstitutor.substitute(psiType.getComponentType())); try { + int start = ArrayUtil.indexOf(args, startElement); + int end = ArrayUtil.indexOf(args, endElement); + if (start != parameters.length - 1 || end != args.length - 1) return null; final PsiExpression expressionFromText = elementFactory.createExpressionFromText("new " + componentType.getCanonicalText() + "[]{" + text + "}", parent); - final RangeMarker rangeMarker = - FileDocumentManager.getInstance().getDocument(containingFile.getVirtualFile()).createRangeMarker(startOffset, endOffset); + Document document = FileDocumentManager.getInstance().getDocument(containingFile.getOriginalFile().getVirtualFile()); + if (document == null) return null; + final RangeMarker rangeMarker = document.createRangeMarker(startOffset, endOffset); expressionFromText.putUserData(ElementToWorkOn.TEXT_RANGE, rangeMarker); expressionFromText.putUserData(ElementToWorkOn.PARENT, parent); return expressionFromText; diff --git a/java/java-tests/testData/refactoring/extractMethodNew/VarargsArguments.java b/java/java-tests/testData/refactoring/extractMethodNew/VarargsArguments.java new file mode 100644 index 000000000000..d5969caf7485 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodNew/VarargsArguments.java @@ -0,0 +1,8 @@ +public class VarargsArguments { + public VarargsArguments(String ... strs) {} + + public void test1(VarargsArguments o, String... foo) {} + void bar() { + test1(new VarargsArguments( "", "")); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodNew/VarargsArguments_after.java b/java/java-tests/testData/refactoring/extractMethodNew/VarargsArguments_after.java new file mode 100644 index 000000000000..4d6f5e602189 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodNew/VarargsArguments_after.java @@ -0,0 +1,14 @@ +import org.jetbrains.annotations.NotNull; + +public class VarargsArguments { + public VarargsArguments(String ... strs) {} + + public void test1(VarargsArguments o, String... foo) {} + void bar() { + test1(new VarargsArguments(newMethod())); + } + + private String @NotNull [] newMethod() { + return new String[]{"", ""}; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodNewTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodNewTest.java index a63c72f60074..747495f5394b 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodNewTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodNewTest.java @@ -201,7 +201,7 @@ public class ExtractMethodNewTest extends LightJavaCodeInsightTestCase { try { doTest(); fail("Should not work for assignment expression"); - } catch (PrepareFailedException e){ + } catch (PrepareFailedException ignored) { } } @@ -273,7 +273,7 @@ public class ExtractMethodNewTest extends LightJavaCodeInsightTestCase { try { doTest(); fail("Should not work for assignment expression"); - } catch (PrepareFailedException e){ + } catch (PrepareFailedException ignored) { } } @@ -281,7 +281,7 @@ public class ExtractMethodNewTest extends LightJavaCodeInsightTestCase { try { doTest(); fail("Should not work for assignment expression"); - } catch (PrepareFailedException e){ + } catch (PrepareFailedException ignored) { } } @@ -818,6 +818,10 @@ public class ExtractMethodNewTest extends LightJavaCodeInsightTestCase { doDuplicatesTest(); } + public void testVarargsArguments() throws Exception { + doTest(); + } + public void testParametersFromAnonymous() throws Exception { doTest(); } diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java index 5a41d9dab34b..6e28ad99a18f 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/IntroduceVariableTest.java @@ -232,7 +232,7 @@ public class IntroduceVariableTest extends LightJavaCodeInsightTestCase { public void testSubExpressionFromMagicString() { doTest("str", false, false, false, JAVA_LANG_STRING); } public void testSubExpressionFromPrimitiveWithConversion() { doTest("i", false, false, false, "int"); } public void testSubPrimitiveLiteral() { doTest("str", false, false, false, JAVA_LANG_STRING); } - public void testArrayFromVarargs() { doTest("strings", false, false, false, "java.lang.String[]"); } + public void testArrayFromVarargs() { doTestWithFailure("strings", "java.lang.String[]"); } public void testArrayFromVarargs1() { doTest("strings", false, false, false, "java.lang.String[]"); } public void testEnumArrayFromVarargs() { doTest("strings", false, false, false, "E[]"); } public void testFromFinalFieldOnAssignment() { doTest("strings", false, false, false, JAVA_LANG_STRING); }