use of com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchConditionVisitor in project intellij-community by JetBrains.
the class ArrangementUtil method buildMatcher.
@Nullable
public static ArrangementEntryMatcher buildMatcher(@NotNull ArrangementMatchCondition condition) {
final Ref<ArrangementEntryMatcher> result = new Ref<>();
final Stack<CompositeArrangementEntryMatcher> composites = new Stack<>();
ArrangementMatchConditionVisitor visitor = new ArrangementMatchConditionVisitor() {
@Override
public void visit(@NotNull ArrangementAtomMatchCondition condition) {
ArrangementEntryMatcher matcher = buildMatcher(condition);
if (matcher == null) {
return;
}
if (composites.isEmpty()) {
result.set(matcher);
} else {
composites.peek().addMatcher(matcher);
}
}
@Override
public void visit(@NotNull ArrangementCompositeMatchCondition condition) {
composites.push(new CompositeArrangementEntryMatcher());
try {
for (ArrangementMatchCondition operand : condition.getOperands()) {
operand.invite(this);
}
} finally {
CompositeArrangementEntryMatcher matcher = composites.pop();
if (composites.isEmpty()) {
result.set(matcher);
}
}
}
};
condition.invite(visitor);
return result.get();
}
use of com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchConditionVisitor in project intellij-community by JetBrains.
the class ArrangementUtil method extractTokens.
@NotNull
public static Map<ArrangementSettingsToken, Object> extractTokens(@NotNull ArrangementMatchCondition condition) {
final Map<ArrangementSettingsToken, Object> result = ContainerUtilRt.newHashMap();
condition.invite(new ArrangementMatchConditionVisitor() {
@Override
public void visit(@NotNull ArrangementAtomMatchCondition condition) {
ArrangementSettingsToken type = condition.getType();
Object value = condition.getValue();
result.put(condition.getType(), type.equals(value) ? null : value);
if (type instanceof CompositeArrangementToken) {
Set<ArrangementSettingsToken> tokens = ((CompositeArrangementToken) type).getAdditionalTokens();
for (ArrangementSettingsToken token : tokens) {
result.put(token, null);
}
}
}
@Override
public void visit(@NotNull ArrangementCompositeMatchCondition condition) {
for (ArrangementMatchCondition operand : condition.getOperands()) {
operand.invite(this);
}
}
});
return result;
}
use of com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchConditionVisitor in project intellij-community by JetBrains.
the class ArrangementUtil method parseType.
//endregion
@Nullable
public static ArrangementSettingsToken parseType(@NotNull ArrangementMatchCondition condition) throws IllegalArgumentException {
final Ref<ArrangementSettingsToken> result = new Ref<>();
condition.invite(new ArrangementMatchConditionVisitor() {
@Override
public void visit(@NotNull ArrangementAtomMatchCondition condition) {
ArrangementSettingsToken type = condition.getType();
if (StdArrangementTokenType.ENTRY_TYPE.is(condition.getType()) || MODIFIER_AS_TYPE.contains(type)) {
result.set(condition.getType());
}
}
@Override
public void visit(@NotNull ArrangementCompositeMatchCondition condition) {
for (ArrangementMatchCondition c : condition.getOperands()) {
c.invite(this);
if (result.get() != null) {
return;
}
}
}
});
return result.get();
}
use of com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchConditionVisitor in project intellij-community by JetBrains.
the class ArrangementMatchNodeComponentFactory method getComponent.
/**
* Allows to build UI component for the given model.
*
* @param rendererTarget target model element for which UI component should be built
* @param rule rule which contains given 'renderer target' condition and serves as
* a data entry for the target list model
* @param allowModification flag which indicates whether given model can be changed at future
* @return renderer for the given model
*/
@NotNull
public ArrangementUiComponent getComponent(@NotNull final ArrangementMatchCondition rendererTarget, @NotNull final StdArrangementMatchRule rule, final boolean allowModification) {
final Ref<ArrangementUiComponent> ref = new Ref<>();
rendererTarget.invite(new ArrangementMatchConditionVisitor() {
@Override
public void visit(@NotNull ArrangementAtomMatchCondition condition) {
RemoveAtomConditionCallback callback = allowModification ? new RemoveAtomConditionCallback(rule) : null;
ArrangementUiComponent component = new ArrangementAtomMatchConditionComponent(mySettingsManager, myColorsProvider, condition, callback);
ref.set(component);
}
@Override
public void visit(@NotNull ArrangementCompositeMatchCondition condition) {
ref.set(new ArrangementAndMatchConditionComponent(rule, condition, ArrangementMatchNodeComponentFactory.this, mySettingsManager, allowModification));
}
});
return ref.get();
}
use of com.intellij.psi.codeStyle.arrangement.model.ArrangementMatchConditionVisitor in project intellij-community by JetBrains.
the class ArrangementUtil method combine.
//endregion
@NotNull
public static ArrangementMatchCondition combine(@NotNull ArrangementMatchCondition... nodes) {
final ArrangementCompositeMatchCondition result = new ArrangementCompositeMatchCondition();
final ArrangementMatchConditionVisitor visitor = new ArrangementMatchConditionVisitor() {
@Override
public void visit(@NotNull ArrangementAtomMatchCondition node) {
result.addOperand(node);
}
@Override
public void visit(@NotNull ArrangementCompositeMatchCondition node) {
for (ArrangementMatchCondition operand : node.getOperands()) {
operand.invite(this);
}
}
};
for (ArrangementMatchCondition node : nodes) {
node.invite(visitor);
}
return result.getOperands().size() == 1 ? result.getOperands().iterator().next() : result;
}
Aggregations