diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java index 58c06baaa67c..b4326d6dd936 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/AlignmentProvider.java @@ -23,6 +23,7 @@ import com.intellij.util.containers.hash.HashSet; import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -41,24 +42,45 @@ class AlignmentProvider { final Set set1 = myTree.get(e1); final Set set2 = myTree.get(e2); - LOG.assertTrue(!(set1 != null && set2 != null)); + LOG.assertTrue(set1 == null || set2 == null || !myAlignments.containsKey(set1) || !myAlignments.containsKey(set2)); - if (set1 != null) { - set1.add(e2); - myTree.put(e2, set1); + if (set1 != null && set2 != null) { + if (myAlignments.containsKey(set2)) { + for (Iterator iterator = set1.iterator(); iterator.hasNext(); ) { + PsiElement element = iterator.next(); + iterator.remove(); + + addInternal(set2, element); + } + } + else { + set1.addAll(set2); + for (Iterator iterator = set2.iterator(); iterator.hasNext(); ) { + PsiElement element = iterator.next(); + iterator.remove(); + + addInternal(set1, element); + } + } + } + else if (set1 != null) { + addInternal(set1, e2); } else if (set2 != null) { - set2.add(e1); - myTree.put(e1, set2); + addInternal(set2, e1); } else { final HashSet set = createHashSet(); - - myTree.put(e1, set); - myTree.put(e2, set); + addInternal(set, e1); + addInternal(set, e2); } } + private void addInternal(Set set, PsiElement element) { + myTree.put(element, set); + set.add(element); + } + private static HashSet createHashSet() { return new HashSet() { private final int myhash = new Object().hashCode(); @@ -97,11 +119,6 @@ class AlignmentProvider { return alignment; } - @Nullable - public Alignment getAlignment(ASTNode node) { - return getAlignment(node.getPsi()); - } - public Aligner createAligner(PsiElement expression) { return new Aligner(expression); } @@ -119,7 +136,8 @@ class AlignmentProvider { class Aligner { private PsiElement myRef = null; - private Aligner(){} + private Aligner() { + } private Aligner(PsiElement initial) { myRef = initial; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java index 9ed0e9a3a0d5..d49a367b02dc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlock.java @@ -56,7 +56,7 @@ import java.util.List; */ public class GroovyBlock implements Block, GroovyElementTypes, ASTBlock { final protected ASTNode myNode; - protected Alignment myAlignment; + protected Alignment myAlignment = null; final protected Indent myIndent; final protected Wrap myWrap; final protected CommonCodeStyleSettings mySettings; @@ -78,8 +78,6 @@ public class GroovyBlock implements Block, GroovyElementTypes, ASTBlock { mySettings = settings; myGroovySettings = groovySettings; myAlignmentProvider = alignmentProvider; - - myAlignment = myAlignmentProvider.getAlignment(node.getPsi()); } @NotNull @@ -126,6 +124,10 @@ public class GroovyBlock implements Block, GroovyElementTypes, ASTBlock { @Nullable public Alignment getAlignment() { + if (myAlignment == null) { + myAlignment = myAlignmentProvider.getAlignment(myNode.getPsi()); + } + return myAlignment; }