/* * 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.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); } }