diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingsAtomNode.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingsAtomNode.java
index 0dcb683fe0c5..fd5c4a7515bc 100644
--- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingsAtomNode.java
+++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/model/ArrangementSettingsAtomNode.java
@@ -27,6 +27,8 @@ public class ArrangementSettingsAtomNode implements ArrangementSettingsNode {
@NotNull private final ArrangementSettingType myType;
@NotNull private final Object myValue;
+
+ private boolean myInverted;
public ArrangementSettingsAtomNode(@NotNull ArrangementSettingType type, @NotNull Object value) {
myType = type;
@@ -48,8 +50,48 @@ public class ArrangementSettingsAtomNode implements ArrangementSettingsNode {
visitor.visit(this);
}
+ public boolean isInverted() {
+ return myInverted;
+ }
+
+ public void setInverted(boolean inverted) {
+ myInverted = inverted;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = myType.hashCode();
+ result = 31 * result + myValue.hashCode();
+ result = 31 * result + (myInverted ? 1 : 0);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ ArrangementSettingsAtomNode node = (ArrangementSettingsAtomNode)o;
+
+ if (myInverted != node.myInverted) {
+ return false;
+ }
+ if (myType != node.myType) {
+ return false;
+ }
+ if (!myValue.equals(node.myValue)) {
+ return false;
+ }
+
+ return true;
+ }
+
@Override
public String toString() {
- return myType + ": " + myValue;
+ return String.format("%s: %s%s", myType.toString().toLowerCase(), myInverted ? "not " : "", myValue.toString().toLowerCase());
}
}
diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementMatcherSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementMatcherSettings.java
index 76ae26ceb07f..7b961b80883e 100644
--- a/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementMatcherSettings.java
+++ b/platform/lang-api/src/com/intellij/psi/codeStyle/arrangement/settings/ArrangementMatcherSettings.java
@@ -15,17 +15,19 @@
*/
package com.intellij.psi.codeStyle.arrangement.settings;
-import com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryMatcher;
-import com.intellij.psi.codeStyle.arrangement.match.ArrangementEntryType;
-import com.intellij.psi.codeStyle.arrangement.match.ArrangementModifier;
+import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingsAtomNode;
+import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingsCompositeNode;
+import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingsNode;
+import com.intellij.psi.codeStyle.arrangement.model.ArrangementSettingsNodeVisitor;
+import com.intellij.util.containers.HashSet;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import java.util.EnumSet;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
/**
- * Encapsulates information about {@link ArrangementEntryMatcher standard arrangement match rule settings}.
+ * Encapsulates information about {@link ArrangementSettingsNode standard arrangement match rule settings}.
*
* Not thread-safe.
*
@@ -34,37 +36,57 @@ import java.util.Set;
*/
public class ArrangementMatcherSettings implements Cloneable {
- @NotNull private final Set myModifiers = EnumSet.noneOf(ArrangementModifier.class);
-
- @Nullable private ArrangementEntryType myType;
-
- @Nullable
- public ArrangementEntryType getType() {
- return myType;
- }
-
- public void setType(@Nullable ArrangementEntryType type) {
- myType = type;
- }
+ @NotNull private final List myConditions = new ArrayList();
+ @NotNull private final Set