sleekbyte/tailor

View on GitHub
src/main/java/com/sleekbyte/tailor/listeners/lengths/MinLengthListener.java

Summary

Maintainability
A
1 hr
Test Coverage
package com.sleekbyte.tailor.listeners.lengths;

import com.sleekbyte.tailor.antlr.SwiftParser;
import com.sleekbyte.tailor.antlr.SwiftParser.ClassNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.ElementNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.EnumNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.FunctionNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.IdentifierContext;
import com.sleekbyte.tailor.antlr.SwiftParser.LabelNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.ProtocolNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.RawValueStyleEnumCaseContext;
import com.sleekbyte.tailor.antlr.SwiftParser.SetterNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.StructNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.TypeNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.TypealiasNameContext;
import com.sleekbyte.tailor.antlr.SwiftParser.UnionStyleEnumCaseContext;
import com.sleekbyte.tailor.antlr.SwiftParser.VariableNameContext;
import com.sleekbyte.tailor.common.ConstructLengths;
import com.sleekbyte.tailor.common.Messages;
import com.sleekbyte.tailor.common.Rules;
import com.sleekbyte.tailor.listeners.DeclarationListener;
import com.sleekbyte.tailor.output.Printer;
import com.sleekbyte.tailor.utils.SourceFileUtil;
import org.antlr.v4.runtime.ParserRuleContext;

import java.util.List;
import java.util.Set;

/**
 * Parse tree listener for verifying minimum lengths of Swift constructs.
 */
public final class MinLengthListener extends LengthListener {

    /**
     * Listener that verifies min name and construct lengths.
     *
     * @param printer Printer object
     * @param constructLengths ConstructLengths object
     * @param enabledRules Set of enabled rules
     */
    public MinLengthListener(Printer printer, ConstructLengths constructLengths, Set<Rules> enabledRules) {
        this.constructLengths = constructLengths;
        this.printer = printer;
        this.enabledRules = enabledRules;
    }

    @Override
    public void enterTopLevel(SwiftParser.TopLevelContext topLevelCtx) {
        List<IdentifierContext> constants = DeclarationListener.getConstantNames(topLevelCtx);
        constants.forEach(ctx ->
            verifyNameLength(Messages.CONSTANT + Messages.NAME, constructLengths.minNameLength, ctx));

        List<IdentifierContext> variables = DeclarationListener.getVariableNames(topLevelCtx);
        variables.forEach(ctx ->
            verifyNameLength(Messages.VARIABLE + Messages.NAME, constructLengths.minNameLength, ctx));
    }

    @Override
    public void enterClassName(ClassNameContext ctx) {
        verifyNameLength(Messages.CLASS + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterEnumName(EnumNameContext ctx) {
        verifyNameLength(Messages.ENUM + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterStructName(StructNameContext ctx) {
        verifyNameLength(Messages.STRUCT + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterProtocolName(ProtocolNameContext ctx) {
        verifyNameLength(Messages.PROTOCOL + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterElementName(ElementNameContext ctx) {
        verifyNameLength(Messages.ELEMENT + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterFunctionName(FunctionNameContext ctx) {
        verifyNameLength(Messages.FUNCTION + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterLabelName(LabelNameContext ctx) {
        verifyNameLength(Messages.LABEL + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterSetterName(SetterNameContext ctx) {
        verifyNameLength(Messages.SETTER + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterTypeName(TypeNameContext ctx) {
        verifyNameLength(Messages.TYPE + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterTypealiasName(TypealiasNameContext ctx) {
        verifyNameLength(Messages.TYPEALIAS + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterVariableName(VariableNameContext ctx) {
        verifyNameLength(Messages.VARIABLE + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterRawValueStyleEnumCase(RawValueStyleEnumCaseContext ctx) {
        verifyNameLength(Messages.ENUM_CASE + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    public void enterUnionStyleEnumCase(UnionStyleEnumCaseContext ctx) {
        verifyNameLength(Messages.ENUM_CASE + Messages.NAME, constructLengths.minNameLength, ctx);
    }

    @Override
    protected void verifyNameLength(String constructType, int length, ParserRuleContext ctx) {
        if (enabledRules.contains(Rules.MIN_NAME_LENGTH) && SourceFileUtil.nameTooShort(ctx, length)) {
            createErrorMessage(Rules.MIN_NAME_LENGTH, ctx.getText().length(), ctx, constructType, length,
                Messages.VIOLATES_MINIMUM_CHARACTER_LIMIT);
        }
    }

}