diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java b/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java index 7df0b4cc234c..cd4ba9b2c93a 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java +++ b/java/java-impl/src/com/intellij/psi/impl/JavaCodeBlockModificationListener.java @@ -20,9 +20,8 @@ import com.intellij.psi.*; import com.intellij.psi.impl.PsiTreeChangeEventImpl.PsiEventType; import com.intellij.psi.impl.source.jsp.jspXml.JspDirective; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.containers.ContainerUtil; +import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.Set; @@ -78,19 +77,19 @@ public class JavaCodeBlockModificationListener extends PsiTreeChangePreprocessor } } - private static boolean isWhiteSpaceOrComment(PsiElement e) { + private static boolean isWhiteSpaceOrComment(@NotNull PsiElement e) { return e instanceof PsiWhiteSpace || PsiTreeUtil.getParentOfType(e, PsiComment.class, false) != null; } private static Set getChangedChildren(@NotNull PsiTreeChangeEventImpl event) { PsiEventType code = event.getCode(); if (code == PsiEventType.CHILD_ADDED || code == PsiEventType.CHILD_REMOVED || code == PsiEventType.CHILD_REPLACED) { - return ContainerUtil.newHashSet(event.getOldChild(), event.getChild()); + return StreamEx.of(event.getOldChild(), event.getChild(), event.getNewChild()).nonNull().toSet(); } return Collections.emptySet(); } - private static boolean hasClassesInside(@Nullable PsiElement element) { + private static boolean hasClassesInside(@NotNull PsiElement element) { return !SyntaxTraverser.psiTraverser(element).traverse() .filter(Conditions.instanceOf(PsiClass.class, PsiLambdaExpression.class)).isEmpty(); } diff --git a/java/java-tests/testSrc/com/intellij/java/psi/PsiModificationTrackerTest.java b/java/java-tests/testSrc/com/intellij/java/psi/PsiModificationTrackerTest.java index 97221a747438..d3b532489904 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/PsiModificationTrackerTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/PsiModificationTrackerTest.java @@ -484,4 +484,16 @@ public class PsiModificationTrackerTest extends CodeInsightTestCase { assertEquals(javaCount, tracker.getJavaStructureModificationCount()); assertFalse(codeBlockCount == tracker.getOutOfCodeBlockModificationCount()); } -} + + public void testJavaStructureModCountNotAdvancedOnAddingSpace() { + configureByText(JavaFileType.INSTANCE, "class A{ }"); + + PsiModificationTracker tracker = PsiManager.getInstance(getProject()).getModificationTracker(); + long javaCount = tracker.getJavaStructureModificationCount(); + long codeBlockCount = tracker.getOutOfCodeBlockModificationCount(); + + WriteCommandAction.runWriteCommandAction(getProject(), () -> replaceSelection(" ")); + + assertEquals(javaCount, tracker.getJavaStructureModificationCount()); + assertFalse(codeBlockCount == tracker.getOutOfCodeBlockModificationCount()); + }}