blob: 2f7249f9d22d5b84760d5e5d53f6b145476f59bf [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.codeStyle.arrangement.match;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.codeStyle.arrangement.ArrangementUtil;
import com.intellij.psi.codeStyle.arrangement.model.ArrangementAtomMatchCondition;
import com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchCondition;
import com.intellij.psi.codeStyle.arrangement.std.ArrangementSettingsToken;
import com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Section.END_SECTION;
import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Section.START_SECTION;
/**
* @author Svetlana.Zemlyanskaya
*/
public class ArrangementSectionRule implements Cloneable {
@Nullable private final String myStartComment;
@Nullable private final String myEndComment;
private final List<StdArrangementMatchRule> myMatchRules;
private ArrangementSectionRule(@Nullable String start, @Nullable String end, @NotNull List<StdArrangementMatchRule> rules) {
myStartComment = start;
myEndComment = end;
myMatchRules = rules;
}
public List<StdArrangementMatchRule> getMatchRules() {
return myMatchRules;
}
public static ArrangementSectionRule create(@NotNull StdArrangementMatchRule... rules) {
return create(null, null, rules);
}
public static ArrangementSectionRule create(@Nullable String start, @Nullable String end, @NotNull StdArrangementMatchRule... rules) {
return create(start, end, rules.length == 0 ? ContainerUtil.<StdArrangementMatchRule>emptyList() : ContainerUtil.newArrayList(rules));
}
public static ArrangementSectionRule create(@Nullable String start, @Nullable String end, @NotNull List<StdArrangementMatchRule> rules) {
final List<StdArrangementMatchRule> matchRules = ContainerUtil.newArrayList();
if (StringUtil.isNotEmpty(start)) {
matchRules.add(createSectionRule(start, START_SECTION));
}
matchRules.addAll(rules);
if (StringUtil.isNotEmpty(end)) {
matchRules.add(createSectionRule(end, END_SECTION));
}
return new ArrangementSectionRule(start, end, matchRules);
}
@NotNull
private static StdArrangementMatchRule createSectionRule(@NotNull String comment, @NotNull ArrangementSettingsToken token) {
final ArrangementAtomMatchCondition text = new ArrangementAtomMatchCondition(StdArrangementTokens.Regexp.TEXT, comment);
final ArrangementMatchCondition condition = ArrangementUtil.combine(new ArrangementAtomMatchCondition(token), text);
return new StdArrangementMatchRule(new StdArrangementEntryMatcher(condition));
}
@Nullable
public String getStartComment() {
return myStartComment;
}
@Nullable
public String getEndComment() {
return myEndComment;
}
@Override
public int hashCode() {
int factor = 31;
int hash = StringUtil.notNullize(myStartComment).hashCode() + factor * StringUtil.notNullize(myEndComment).hashCode();
for (StdArrangementMatchRule rule : myMatchRules) {
factor *= factor;
hash += rule.hashCode() * factor;
}
return hash;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final ArrangementSectionRule section = (ArrangementSectionRule)o;
if (!StringUtil.equals(myStartComment, section.myStartComment) ||
!StringUtil.equals(myEndComment, section.myEndComment) ||
myMatchRules.size() != section.getMatchRules().size()) {
return false;
}
final List<StdArrangementMatchRule> matchRules = section.getMatchRules();
for (int i = 0; i < myMatchRules.size(); i++) {
final StdArrangementMatchRule rule1 = myMatchRules.get(i);
final StdArrangementMatchRule rule2 = matchRules.get(i);
if (!rule1.equals(rule2)) {
return false;
}
}
return true;
}
@Override
public String toString() {
if (StringUtil.isEmpty(myStartComment)) {
return "Section: [" + StringUtil.join(myMatchRules, ",") + "]";
}
return "Section " + "(" + myStartComment + (StringUtil.isEmpty(myEndComment) ? "" : ", " + myEndComment) + ")";
}
@Override
public ArrangementSectionRule clone() {
final List<StdArrangementMatchRule> rules = ContainerUtil.newArrayList();
for (StdArrangementMatchRule myMatchRule : myMatchRules) {
rules.add(myMatchRule.clone());
}
return new ArrangementSectionRule(myStartComment, myEndComment, rules);
}
}