From 84f30699147e88982d53de9c2c3c6540b034d0bf Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 25 May 2018 13:33:04 +0200 Subject: [PATCH] SSR: fix replacing array initializer removes semicolon (IDEA-192548) --- .../JavaStructuralSearchProfile.java | 18 +++++++++--------- .../StructuralReplaceTest.java | 9 +++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java index da18847d5798..f74c9607815e 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaStructuralSearchProfile.java @@ -803,17 +803,17 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile { private static int removeExtraSemicolon(ParameterInfo info, int offset, StringBuilder result, MatchResult match) { if (info.isStatementContext()) { final int index = offset + info.getStartIndex(); - if (result.charAt(index)==';' && - ( match == null || + final PsiElement matchElement = (match == null) ? null : match.getMatch(); + if (result.charAt(index) == ';' && + ( matchElement == null || ( result.charAt(index-1)=='}' && - !(match.getMatch() instanceof PsiDeclarationStatement) && // array init in dcl - !(match.getMatch() instanceof PsiNewExpression) // array initializer + !(matchElement instanceof PsiDeclarationStatement) && // array init in dcl + !(matchElement instanceof PsiNewExpression) && // array initializer + !(matchElement instanceof PsiArrayInitializerExpression) ) || - ( !match.isMultipleMatch() && // ; in comment - match.getMatch() instanceof PsiComment - ) || - ( match.isMultipleMatch() && // ; in comment - match.getChildren().get( match.getChildren().size() - 1 ).getMatch() instanceof PsiComment + ( match.isMultipleMatch() // ; in comment + ? match.getChildren().get(match.getChildren().size() - 1).getMatch() instanceof PsiComment + : matchElement instanceof PsiComment ) ) ) { diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java index 26449e88d880..c8a890f179ff 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java @@ -2460,5 +2460,14 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase { "}", replace(in, "'_ReturnType '_Method('_ParameterType '_Parameter*);", "$ReturnType$ $Method$ ($ParameterType$ $Parameter$);", true)); + + String in2 = "class X {" + + " public final X[] EMPTY_ARRAY = {};" + + "}"; + assertEquals("shouldn't delete semicolon", + "class X {" + + " public final X[] EMPTY_ARRAY = {};" + + "}", + replace(in2, "'_FieldType 'Field = '_Init?;", "$FieldType$ $Field$ = $Init$;", true)); } } \ No newline at end of file