101 lines
5.4 KiB
C#
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);
|
|
}
|
|
} |