meowlang/parser/DeclarationVisitorNya.cs
2022-02-12 18:30:04 +01:00

101 lines
5.4 KiB
C#

using Antlr4.Runtime.Tree;
using meowlang.parser.antlr;
namespace meowlang.parser;
public class DeclarationVisitorNya : MeowBaseVisitorNya<TopLevelConstructModel>
{
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<TypeParameterModel>();
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<TypeReferenceModel>();
var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ??
new List<ConstraintModel>();
var body = new ExpressionVisitorNya().Visit(context.body);
return new FunctionModel(context.GetSpan(), attributes, pub, name, typeParameters, functionParameters,
functionReturns, constraints, body);
}
public override ConstraintTopLevelConstructModel 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 ConstraintTopLevelConstructModel(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<string>();
var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ??
new List<ConstraintModel>();
var structModel = new TypeReferenceVisitorNya().Visit(context.structType()) as StructTypeModel;
return new StructTopLevelConstructModel(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<string>();
var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ??
new List<ConstraintModel>();
var enumModel = new TypeReferenceVisitorNya().Visit(context.enumType()) as EnumTypeModel;
return new EnumTopLevelConstructModel(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<string>();
var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ??
new List<ConstraintModel>();
var tupleModel = new TypeReferenceVisitorNya().Visit(context.tupleType()) as TupleTypeModel;
return new TupleTopLevelConstructModel(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<string>();
var type = new TypeReferenceVisitorNya().Visit(context.typeReference());
return new TypeAliasModel(context.GetSpan(), attributes, pub, name, typeParameters, type);
}
}
public class MeowBaseVisitorNya<T> : MeowBaseVisitor<T>
{
public T? TryVisit(IParseTree? tree)
{
return tree == null ? default : Visit(tree);
}
}