package jetbrains.mps.checkers;
/*Generated by MPS */
import java.util.Set;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.errors.IErrorReporter;
import org.jetbrains.mps.openapi.module.SRepository;
import org.jetbrains.mps.openapi.util.Processor;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.util.DescendantsTreeIterator;
import jetbrains.mps.util.Reference;
public class AbstractConstraintsCheckerRootCheckerAdapter implements IRootChecker {
private Set<AbstractNodeChecker> myRules;
public interface ErrorSkipCondition {
boolean skipSingleNode(SNode node);
boolean skipSubtree(SNode root);
}
private AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition mySkipCondition;
public static final AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition SKIP_CONSTRAINTS_CONDITION = new AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition() {
public boolean skipSingleNode(SNode node) {
return false;
}
public boolean skipSubtree(SNode root) {
return SNodeOperations.isInstanceOf(root, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x50ef06e32fec9043L, "jetbrains.mps.lang.core.structure.ISkipConstraintsChecking"));
}
};
public static final AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition SKIP_NOTHING_CONDITION = new AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition() {
public boolean skipSingleNode(SNode node) {
return false;
}
public boolean skipSubtree(SNode root) {
return false;
}
};
public static final AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition SUPRESS_ERRORS_CONDITION = new AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition() {
public boolean skipSingleNode(SNode node) {
return !(ErrorReportUtil.shouldReportError(node));
}
public boolean skipSubtree(SNode root) {
return false;
}
};
public AbstractConstraintsCheckerRootCheckerAdapter(@NotNull AbstractConstraintsCheckerRootCheckerAdapter.ErrorSkipCondition skipCondition, AbstractNodeChecker... rules) {
myRules = SetSequence.fromSetWithValues(new HashSet<AbstractNodeChecker>(), Sequence.fromArray(rules));
mySkipCondition = skipCondition;
}
public AbstractConstraintsCheckerRootCheckerAdapter(AbstractNodeChecker... rules) {
this(SKIP_NOTHING_CONDITION, rules);
}
@Override
public Set<IErrorReporter> getErrors(SNode rootNode, SRepository repository) {
final Set<IErrorReporter> result = SetSequence.fromSet(new HashSet<IErrorReporter>());
processErrors(rootNode, repository, new Processor<IErrorReporter>() {
public boolean process(IErrorReporter error) {
SetSequence.fromSet(result).addElement(error);
return true;
}
});
return result;
}
@Override
public void processErrors(SNode rootNode, SRepository repository, final Processor<IErrorReporter> processor) {
SModel model = SNodeOperations.getModel(rootNode);
assert model != null;
DescendantsTreeIterator fullCheckIterator = new DescendantsTreeIterator(rootNode);
final Reference<Boolean> cancelled = new Reference<Boolean>(false);
LanguageErrorsCollector errorsCollector = new LanguageErrorsCollector() {
public void addError(IErrorReporter errorReporter) {
if (mySkipCondition.skipSingleNode(errorReporter.getSNode())) {
return;
}
cancelled.set(cancelled.get() || !(processor.process(errorReporter)));
}
};
while (fullCheckIterator.hasNext() && !(cancelled.get())) {
SNode node = fullCheckIterator.next();
if (mySkipCondition.skipSubtree(node)) {
fullCheckIterator.skipChildren();
continue;
}
for (AbstractNodeChecker checker : myRules) {
checker.checkNode(node, errorsCollector, repository);
}
}
}
}