diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java index a82c18b5ebfb..d14c7a8dfac5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/DeclarationJoinLinesHandler.java @@ -24,13 +24,15 @@ import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiPrecedenceUtil; -import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.ExpressionUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.editorActions.DeclarationJoinLinesHandler"); @@ -72,7 +74,6 @@ public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { return -1; } - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(psiManager.getProject()); final PsiExpression initializerExpression = getInitializerExpression(var, assignment); if (initializerExpression == null) return -1; @@ -80,15 +81,11 @@ public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { int startOffset = decl.getTextRange().getStartOffset(); try { - PsiDeclarationStatement newDecl = factory.createVariableDeclarationStatement(var.getName(), var.getType(), initializerExpression); - PsiVariable newVar = (PsiVariable)newDecl.getDeclaredElements()[0]; - if (var.getModifierList().getText().length() > 0) { - PsiUtil.setModifierProperty(newVar, PsiModifier.FINAL, true); - } - newVar.getModifierList().replace(var.getModifierList()); - PsiVariable variable = (PsiVariable)newDecl.getDeclaredElements()[0]; - final int offsetBeforeEQ = variable.getNameIdentifier().getTextRange().getEndOffset(); - final int offsetAfterEQ = variable.getInitializer().getTextRange().getStartOffset() + 1; + PsiLocalVariable variable = copyVarWithInitializer(var, initializerExpression); + if (variable == null) return -1; + PsiDeclarationStatement newDecl = (PsiDeclarationStatement)variable.getParent(); + final int offsetBeforeEQ = Objects.requireNonNull(variable.getNameIdentifier()).getTextRange().getEndOffset(); + final int offsetAfterEQ = Objects.requireNonNull(variable.getInitializer()).getTextRange().getStartOffset() + 1; newDecl = (PsiDeclarationStatement)CodeStyleManager.getInstance(psiManager).reformatRange(newDecl, offsetBeforeEQ, offsetAfterEQ); PsiElement child = statement.getLastChild(); @@ -150,4 +147,18 @@ public class DeclarationJoinLinesHandler implements JoinLinesHandlerDelegate { initializerExpression = JavaPsiFacade.getElementFactory(project).createExpressionFromText(initializerText, assignment); return (PsiExpression)CodeStyleManager.getInstance(project).reformat(initializerExpression); } + + @Nullable + public static PsiLocalVariable copyVarWithInitializer(PsiLocalVariable origVar, PsiExpression initializer) { + // Don't normalize the original declaration: it may declare many variables + PsiElement declCopy = origVar.getParent().copy(); + PsiLocalVariable varCopy = (PsiLocalVariable)ContainerUtil.find( + declCopy.getChildren(), e -> e instanceof PsiLocalVariable && Objects.equals(origVar.getName(), ((PsiLocalVariable)e).getName())); + + if (varCopy != null) { + varCopy.setInitializer(initializer); + varCopy.normalizeDeclaration(); + } + return varCopy; + } } diff --git a/java/java-impl/src/com/intellij/codeInspection/JoinDeclarationAndAssignmentJavaInspection.java b/java/java-impl/src/com/intellij/codeInspection/JoinDeclarationAndAssignmentJavaInspection.java index 32842e3a00d5..f4c9149b21a9 100644 --- a/java/java-impl/src/com/intellij/codeInspection/JoinDeclarationAndAssignmentJavaInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/JoinDeclarationAndAssignmentJavaInspection.java @@ -11,7 +11,6 @@ import com.intellij.psi.util.PsiExpressionTrimRenderer; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.ObjectUtils; -import com.intellij.util.containers.ContainerUtil; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.ExpressionUtils; import com.siyeh.ig.psiutils.SideEffectChecker; @@ -235,14 +234,8 @@ public class JoinDeclarationAndAssignmentJavaInspection extends AbstractBaseJava PsiExpression initializer = DeclarationJoinLinesHandler.getInitializerExpression(context.myVariable, context.myAssignment); PsiElement elementToReplace = context.myAssignment.getParent(); if (initializer != null && elementToReplace != null) { - // Don't normalize the original declaration: it may declare many variables - PsiElement declCopy = context.myVariable.getParent().copy(); - PsiLocalVariable varCopy = (PsiLocalVariable)ContainerUtil.find( - declCopy.getChildren(), e -> e instanceof PsiLocalVariable && context.myName.equals(((PsiLocalVariable)e).getName())); - + PsiLocalVariable varCopy = DeclarationJoinLinesHandler.copyVarWithInitializer(context.myVariable, initializer); if (varCopy != null) { - varCopy.setInitializer(initializer); - varCopy.normalizeDeclaration(); String text = varCopy.getText(); CommentTracker tracker = new CommentTracker(); diff --git a/java/java-tests/testData/codeInsight/joinLines/LocalVarAnnotated.java b/java/java-tests/testData/codeInsight/joinLines/LocalVarAnnotated.java new file mode 100644 index 000000000000..4c089aea1ddd --- /dev/null +++ b/java/java-tests/testData/codeInsight/joinLines/LocalVarAnnotated.java @@ -0,0 +1,8 @@ +class A{ + { + @Foo int i; + i = 0; + } + + @interface Foo {} +} diff --git a/java/java-tests/testData/codeInsight/joinLines/LocalVarAnnotated_after.java b/java/java-tests/testData/codeInsight/joinLines/LocalVarAnnotated_after.java new file mode 100644 index 000000000000..f66cbf62e5ec --- /dev/null +++ b/java/java-tests/testData/codeInsight/joinLines/LocalVarAnnotated_after.java @@ -0,0 +1,7 @@ +class A{ + { + @Foo int i = 0; + } + + @interface Foo {} +} diff --git a/java/java-tests/testData/codeInsight/joinLines/LocalVarImplicit.java b/java/java-tests/testData/codeInsight/joinLines/LocalVarImplicit.java new file mode 100644 index 000000000000..2af722fda845 --- /dev/null +++ b/java/java-tests/testData/codeInsight/joinLines/LocalVarImplicit.java @@ -0,0 +1,8 @@ +class A{ + { + var i; + i = 0; + } + + @interface Foo {} +} diff --git a/java/java-tests/testData/codeInsight/joinLines/LocalVarImplicit_after.java b/java/java-tests/testData/codeInsight/joinLines/LocalVarImplicit_after.java new file mode 100644 index 000000000000..619b8cb2125b --- /dev/null +++ b/java/java-tests/testData/codeInsight/joinLines/LocalVarImplicit_after.java @@ -0,0 +1,7 @@ +class A{ + { + var i = 0; + } + + @interface Foo {} +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java index 9b45a8a860eb..f6f5074a4003 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/JoinLinesTest.java @@ -149,6 +149,8 @@ public class JoinLinesTest extends LightCodeInsightTestCase { } public void testLocalVar() { doTest(); } + public void testLocalVarAnnotated() { doTest(); } + public void testLocalVarImplicit() { doTest(); } public void testSlashComment() { doTest(); } public void testDocComment() { doTest(); }