meowlang/parser/DeclarationVisitorNya.cs
Gwendolyn d6bdd08002 loooots of stuff
the typechecker project can collect all the top level types from a file, which is pretty cool I think
(except for pointers, those aren't implemented yet...)
2022-02-13 02:41:16 +01:00

92 lines
5.1 KiB
C#

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 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<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 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<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 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<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 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<string>();
var type = new TypeReferenceVisitorNya().Visit(context.typeReference());
return new TypeAliasModel(context.GetSpan(), attributes, pub, name, typeParameters, type);
}
}