using meowlang.parser.antlr; namespace meowlang.parser; public class DeclarationVisitorNya : MeowBaseVisitorNya { public override TopLevelConstructModel VisitTopLevelStatement(MeowParser.TopLevelStatementContext context) { var statement = new StatementVisitorNya().Visit(context); return new TopLevelStatementModel(context.GetSpan(), statement); } public override TopLevelConstructModel VisitFunction(MeowParser.FunctionContext context) { var attributes = context.attribute().Select(x => new AttributeVisitorNya().Visit(x)).ToList(); var pub = context.pub != null; var name = context.name.Text; var typeParameters = context.genericParameters()?._name.Select(x => new TypeParameterModel(x.GetSpan(), x.Text)).ToList() ?? new List(); var functionParameters = context.functionParameters().functionParameter() .Select(x => new FunctionParameterVisitorNya().Visit(x)).ToList(); var functionReturns = context.functionReturn()?.typeReference().Select(x => new TypeReferenceVisitorNya().Visit(x)) .ToList() ?? new List(); var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ?? new List(); var body = new ExpressionVisitorNya().Visit(context.body); return new FunctionModel(context.GetSpan(), attributes, pub, name, typeParameters, functionParameters, functionReturns, constraints, body); } public override ConstraintDeclarationModel VisitConstraintDeclaration( MeowParser.ConstraintDeclarationContext context) { var attributes = context.attribute().Select(x => new AttributeVisitorNya().Visit(x)).ToList(); var pub = context.pub != null; var name = context.name.Text; var typeNames = context._types.Select(x => x.Text).ToList(); var rules = context.constraintRule().Select(x => new ConstraintRuleVisitorNya().Visit(x)).ToList(); return new ConstraintDeclarationModel(context.GetSpan(), attributes, pub, name, typeNames, rules); } public override TopLevelConstructModel VisitStructDeclaration(MeowParser.StructDeclarationContext context) { var attributes = context.attribute().Select(x => new AttributeVisitorNya().Visit(x)).ToList(); var pub = context.pub != null; var name = context.name.Text; var typeParameters = context.genericParameters()?._name.Select(x => x.Text).ToList() ?? new List(); var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ?? new List(); var structModel = new TypeReferenceVisitorNya().Visit(context.structType()) as StructTypeModel; return new StructDeclarationModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, structModel!); } public override TopLevelConstructModel VisitEnumDeclaration(MeowParser.EnumDeclarationContext context) { var attributes = context.attribute().Select(x => new AttributeVisitorNya().Visit(x)).ToList(); var pub = context.pub != null; var name = context.name.Text; var typeParameters = context.genericParameters()?._name.Select(x => x.Text).ToList() ?? new List(); var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ?? new List(); var enumModel = new TypeReferenceVisitorNya().Visit(context.enumType()) as EnumTypeModel; return new EnumDeclarationModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, enumModel!); } public override TopLevelConstructModel VisitTupleDeclaration(MeowParser.TupleDeclarationContext context) { var attributes = context.attribute().Select(x => new AttributeVisitorNya().Visit(x)).ToList(); var pub = context.pub != null; var name = context.name.Text; var typeParameters = context.genericParameters()?._name.Select(x => x.Text).ToList() ?? new List(); var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ?? new List(); var tupleModel = new TypeReferenceVisitorNya().Visit(context.tupleType()) as TupleTypeModel; return new TupleDeclarationModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, tupleModel!); } public override TopLevelConstructModel VisitTypeAlias(MeowParser.TypeAliasContext context) { var attributes = context.attribute().Select(x => new AttributeVisitorNya().Visit(x)).ToList(); var pub = context.pub != null; var name = context.name.Text; var typeParameters = context.genericParameters()?._name.Select(x => x.Text).ToList() ?? new List(); var type = new TypeReferenceVisitorNya().Visit(context.typeReference()); return new TypeAliasModel(context.GetSpan(), attributes, pub, name, typeParameters, type); } }