d6bdd08002
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...)
92 lines
5.1 KiB
C#
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);
|
|
}
|
|
} |