diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java index da4d40567535..701d400122e9 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/inline/InlineParameterExpressionProcessor.java @@ -73,7 +73,6 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor return InlineParameterHandler.getRefactoringName(); } - @NotNull @Override protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo @NotNull [] usages) { @@ -82,7 +81,6 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor @Override protected UsageInfo @NotNull [] findUsages() { - int parameterIndex = myMethod.getParameterList().getParameterIndex(myParameter); final Map localToParamRef = new HashMap<>(); final PsiExpression[] arguments = myMethodCall.getArgumentList().getExpressions(); @@ -141,7 +139,6 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor } } - final PsiParameter[] parameters = myMethod.getParameterList().getParameters(); final List psiParameters = new ArrayList<>(); int paramIdx = 0; @@ -337,26 +334,29 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor final PsiElement element = expression.resolve(); if (element instanceof PsiMember member && !member.hasModifierProperty(PsiModifier.STATIC)) { if (myMethod.hasModifierProperty(PsiModifier.STATIC)) { - myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.dependency.unavailable.in.static.method", + myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.dependency.unavailable.in.parameter.method", RefactoringUIUtil.getDescription(element, false))); } } if (element instanceof PsiMethod || element instanceof PsiField) { if (!mySameClass && !((PsiModifierListOwner)element).hasModifierProperty(PsiModifier.STATIC)) { - myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.depends.on.non.static")); + myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.depends.on.non.static", + RefactoringUIUtil.getDescription(element, true))); } else if (!PsiUtil.isAccessible((PsiMember)element, myMethod, null)) { - myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.depends.on.unavailable.value")); + myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.dependency.unavailable.in.parameter.method", + RefactoringUIUtil.getDescription(element, true))); } } else if (element instanceof PsiParameter param && PsiTreeUtil.isAncestor(param.getDeclarationScope(), myInitializer, true)) { boolean bound = false; for (PsiParameter parameter : myMethod.getParameterList().getParameters()) { - if (parameter.getType().equals(((PsiParameter)element).getType()) && parameter.getName().equals(((PsiParameter)element).getName())) { + if (parameter.getType().equals(param.getType()) && parameter.getName().equals(param.getName())) { bound = true; break; } } if (!bound) { - myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.depends.on.caller.parameter")); + myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.depends.on.caller.parameter", + RefactoringUIUtil.getDescription(element, false))); } } } @@ -374,10 +374,9 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor } final PsiClass methodContainingClass = myMethod.getContainingClass(); LOG.assertTrue(methodContainingClass != null); - if (!PsiTreeUtil.isAncestor(containingClass, methodContainingClass, false)) { - myConflicts.putValue(thisExpression, JavaRefactoringBundle.message("inline.parameter.depends.on.unavailable.element.inside.method", "this")); - } else if (myMethod.hasModifierProperty(PsiModifier.STATIC)) { - myConflicts.putValue(thisExpression, JavaRefactoringBundle.message("inline.parameter.depends.on.this.inside.static.method")); + if (!PsiTreeUtil.isAncestor(containingClass, methodContainingClass, false) || myMethod.hasModifierProperty(PsiModifier.STATIC)) { + myConflicts.putValue(thisExpression, JavaRefactoringBundle.message("inline.parameter.dependency.unavailable.in.parameter.method", + "this")); } } @@ -386,9 +385,9 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor super.visitReferenceElement(reference); if (myMethod.hasModifierProperty(PsiModifier.STATIC)) { final PsiElement resolved = reference.resolve(); - if (resolved instanceof PsiClass cls && - (PsiUtil.isInnerClass(cls) || PsiUtil.isLocalClass(cls))) { - myConflicts.putValue(reference, JavaRefactoringBundle.message("inline.parameter.depends.on.non.static.class")); + if (resolved instanceof PsiClass cls && (PsiUtil.isInnerClass(cls) || PsiUtil.isLocalClass(cls))) { + myConflicts.putValue(reference, JavaRefactoringBundle.message("inline.parameter.depends.on.non.static.class", + RefactoringUIUtil.getDescription(resolved, true))); } } } @@ -397,25 +396,24 @@ public class InlineParameterExpressionProcessor extends BaseRefactoringProcessor public void visitNewExpression(@NotNull PsiNewExpression expression) { super.visitNewExpression(expression); final PsiJavaCodeReferenceElement reference = expression.getClassOrAnonymousClassReference(); - if (reference != null && reference.resolve() instanceof PsiClass refClass) { - final String classUnavailableMessage = - JavaRefactoringBundle.message("inline.parameter.depends.on.unavailable.element.inside.method", - RefactoringUIUtil.getDescription(refClass, true)); - if (!PsiUtil.isAccessible(refClass, myMethod, null)) { - myConflicts.putValue(expression, classUnavailableMessage); + if (reference != null && reference.resolve() instanceof PsiClass aClass) { + if (!PsiUtil.isAccessible(aClass, myMethod, null)) { + myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.dependency.unavailable.in.parameter.method", + RefactoringUIUtil.getDescription(aClass, true))); } else { final PsiClass methodContainingClass = myMethod.getContainingClass(); LOG.assertTrue(methodContainingClass != null); - if (!PsiTreeUtil.isAncestor(myMethod, refClass, false)) { - PsiElement parent = refClass; - while ((parent = parent.getParent()) instanceof PsiClass) { - if (!PsiUtil.isAccessible((PsiClass)parent, myMethod, null)) { + if (!PsiTreeUtil.isAncestor(myMethod, aClass, false)) { + PsiElement parent = aClass; + while ((parent = parent.getParent()) instanceof PsiClass parentClass) { + if (!PsiUtil.isAccessible(parentClass, myMethod, null)) { break; } } if (!(parent instanceof PsiFile)) { - myConflicts.putValue(expression, classUnavailableMessage); + myConflicts.putValue(expression, JavaRefactoringBundle.message("inline.parameter.dependency.unavailable.in.parameter.method", + RefactoringUIUtil.getDescription(aClass, true))); } } } diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java index dd17c8e017c2..8aebbe721044 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/inline/InlineParameterTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.java.refactoring.inline; import com.intellij.JavaTestUtil; @@ -12,8 +12,6 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; - - public class InlineParameterTest extends LightRefactoringTestCase { @NotNull @Override @@ -90,7 +88,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on this which is not available inside the method and cannot be inlined", e.getMessage()); + assertEquals("Parameter initializer depends on this which is not accessible inside the parameter's method", e.getMessage()); } } @@ -135,7 +133,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on class User.Local which is not available inside the method and cannot be inlined", e.getMessage()); + assertEquals("Parameter initializer depends on class User.Local which is not accessible inside the parameter's method", e.getMessage()); } } @@ -168,7 +166,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (CommonRefactoringUtil.RefactoringErrorHintException e) { - assertEquals("Inline parameter which has write usages is not supported", e.getMessage()); + assertEquals("Inlining parameter with write usages is not supported", e.getMessage()); } } @@ -177,7 +175,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on local class Local which is not available inside the method and cannot be inlined", e.getMessage()); + assertEquals("Parameter initializer depends on local class Local which is not accessible inside the parameter's method", e.getMessage()); } } @@ -198,7 +196,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on local class Local which is not available inside the method and cannot be inlined", e.getMessage()); + assertEquals("Parameter initializer depends on local class Local which is not accessible inside the parameter's method", e.getMessage()); } } @@ -207,7 +205,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on value which is not available inside method and cannot be inlined", e.getMessage()); + assertEquals("Write access to parameter initializer cannot be inlined", e.getMessage()); } } @@ -216,7 +214,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on callers parameter", e.getMessage()); + assertEquals("Parameter initializer depends on caller's parameter objct", e.getMessage()); } } @@ -239,7 +237,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on method provideObject() which is not available inside the static method", e.getMessage()); + assertEquals("Parameter initializer depends on method provideObject() which is not accessible inside the parameter's method", e.getMessage()); } } @@ -248,7 +246,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on non static class which is not available inside static method", e.getMessage()); + assertEquals("Parameter initializer depends on non-static class ExpData.DD which is not accessible inside the parameter's method", e.getMessage()); } } @@ -257,7 +255,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on this which is not available inside the static method", e.getMessage()); + assertEquals("Parameter initializer depends on this which is not accessible inside the parameter's method", e.getMessage()); } } @@ -266,7 +264,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on value which is not available inside method", e.getMessage()); + assertEquals("Parameter initializer depends on method VisibilityPinline.provideObject() which is not accessible inside the parameter's method", e.getMessage()); } } @@ -275,7 +273,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on value which is not available inside method and cannot be inlined", e.getMessage()); + assertEquals("Write access to parameter initializer cannot be inlined", e.getMessage()); } } @@ -284,7 +282,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { - assertEquals("Parameter initializer depends on callers parameter", e.getMessage()); + assertEquals("Parameter initializer depends on caller's parameter b", e.getMessage()); } } @@ -302,9 +300,7 @@ public class InlineParameterTest extends LightRefactoringTestCase { } catch (CommonRefactoringUtil.RefactoringErrorHintException e) { assertEquals("Cannot find constant initializer for parameter", e.getMessage()); - return; } - fail("Initializer shoul not be found"); } public void testParameterDefWithWriteAccess() { @@ -319,7 +315,6 @@ public class InlineParameterTest extends LightRefactoringTestCase { public void testSameSignatureExistConflict() { try { doTest(false); - fail(); } catch (BaseRefactoringProcessor.ConflictsInTestsException e) { assertEquals("Method doTest() is already defined in the class Test", e.getMessage()); @@ -330,19 +325,17 @@ public class InlineParameterTest extends LightRefactoringTestCase { doTest(false); } - private void doTest(final boolean createLocal) { + private void doTest(boolean createLocal) { getProject().putUserData(InlineParameterExpressionProcessor.CREATE_LOCAL_FOR_TESTS, createLocal); - String name = getTestName(false); - @NonNls String fileName = "/refactoring/inlineParameter/" + name + ".java"; + @NonNls String fileName = "/refactoring/inlineParameter/" + getTestName(false) + ".java"; configureByFile(fileName); performAction(); checkResultByFile(null, fileName + ".after", true); } private void performAction() { - final PsiElement element = TargetElementUtil.findTargetElement(getEditor(), TargetElementUtil - .REFERENCED_ELEMENT_ACCEPTED | + final PsiElement element = TargetElementUtil.findTargetElement(getEditor(), TargetElementUtil.REFERENCED_ELEMENT_ACCEPTED | TargetElementUtil.ELEMENT_NAME_ACCEPTED); new InlineParameterHandler().inlineElement(getProject(), getEditor(), element); } diff --git a/java/openapi/resources/messages/JavaRefactoringBundle.properties b/java/openapi/resources/messages/JavaRefactoringBundle.properties index efa7e53c37f6..494d01684911 100644 --- a/java/openapi/resources/messages/JavaRefactoringBundle.properties +++ b/java/openapi/resources/messages/JavaRefactoringBundle.properties @@ -330,20 +330,17 @@ inline.parameter.confirmation=Inline parameter ''{0}'' with initializer ''{1}''? inline.parameter.error.hierarchy=Inline parameter is not supported when method is a part of inheritance hierarchy inline.parameter.error.non.project.method=Inline is not supported for non-project methods inline.parameter.error.varargs=Inline for varargs parameters is not supported -inline.parameter.dependency.unavailable.in.static.method=Parameter initializer depends on {0} which is not available inside the static method -inline.parameter.depends.on.caller.parameter=Parameter initializer depends on callers parameter -inline.parameter.depends.on.non.static=Parameter initializer depends on non static member from some other class -inline.parameter.depends.on.non.static.class=Parameter initializer depends on non static class which is not available inside static method -inline.parameter.depends.on.this.inside.static.method=Parameter initializer depends on this which is not available inside the static method -inline.parameter.depends.on.unavailable.element.inside.method=Parameter initializer depends on {0} which is not available inside the method and cannot be inlined -inline.parameter.depends.on.unavailable.value=Parameter initializer depends on value which is not available inside method -inline.parameter.initializer.depends.on.inaccessible.value=Parameter initializer depends on value which is not available inside method and cannot be inlined +inline.parameter.dependency.unavailable.in.parameter.method=Parameter initializer depends on {0} which is not accessible inside the parameter''s method +inline.parameter.depends.on.caller.parameter=Parameter initializer depends on caller''s {0} +inline.parameter.depends.on.non.static=Parameter initializer depends on non-static {0} and an instance is not available inside the parameter''s method +inline.parameter.depends.on.non.static.class=Parameter initializer depends on non-static {0} which is not accessible inside the parameter''s method +inline.parameter.initializer.depends.on.inaccessible.value=Write access to parameter initializer cannot be inlined inline.parameter.method.usages.progress=Searching for method usages inline.parameter.no.usages.warning.message=Method has no usages inline.parameter.not.accessible.warning.message=Constant initializer is not accessible in method body inline.parameter.refactoring=Inline Parameter inline.parameter.replace.with.local.checkbox=R&eplace with local variable -inline.parameter.write.usages.warning.message=Inline parameter which has write usages is not supported +inline.parameter.write.usages.warning.message=Inlining parameter with write usages is not supported inline.pattern.variable.title=Inline Pattern Variable inline.super.class=Inline Super Class inline.super.class.action.name=Inline Super Class\u2026