LinterSyntaxErrorListener.java

package org.thewonderlemming.c4plantuml.linter;

import java.util.HashSet;
import java.util.Set;

import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import org.thewonderlemming.c4plantuml.linter.rules.AbstractLintingRule;

/**
 * An observer pattern to enable {@link AbstractLintingRule} to be notified on syntax errors.
 *
 * @author thewonderlemming
 *
 */
public class LinterSyntaxErrorListener extends BaseErrorListener {

    private final Set<AbstractLintingRule> rules = new HashSet<>();


    /**
     * registers an {@link AbstractLintingRule} so that it can be notified of syntax errors.
     *
     * @param rule the rule to register.
     */
    public void registerRule(final AbstractLintingRule rule) {
        this.rules.add(rule);
    }

    /**
     * Reports a parsing syntax error to the registered rules.
     */
    @Override
    public void syntaxError(final Recognizer<?, ?> recognizer, final Object offendingSymbol, final int line,
        final int charPositionInLine, final String msg, final RecognitionException e) {

        final SyntaxError error = new SyntaxError(recognizer, offendingSymbol, line, charPositionInLine, msg, e);
        this.rules.forEach(rule -> rule.reportSyntaxError(error));
    }

    /**
     * Unregister a {@link AbstractLintingRule} so that it won't be notified of syntax errors anymore.
     *
     * @param rule the rule to unregister.
     */
    public void unregisterRule(final AbstractLintingRule rule) {
        this.rules.remove(rule);
    }
}