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);
}
}
}