meowlang/typechecker/visitor/CollectTypesVisitor.cs

77 lines
2.2 KiB
C#
Raw Normal View History

using meowlang.parser;
namespace meowlang.typechecker;
public class CollectTypesVisitor : MeowModelVisitor
{
private readonly Scope _scope;
public CollectTypesVisitor(Scope scope)
{
_scope = scope;
}
public override void VisitStructDeclaration(StructDeclarationModel m)
{
TypeDescription structDescription;
var arity = m.TypeParameters.Count;
if (arity > 0)
{
structDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m);
}
else
{
structDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m);
}
_scope.AddNamedType(m.Name, arity, structDescription);
}
public override void VisitEnumDeclaration(EnumDeclarationModel m)
{
TypeDescription enumDescription;
var arity = m.TypeParameters.Count;
if (arity > 0)
{
enumDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m);
}
else
{
enumDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m);
}
_scope.AddNamedType(m.Name, arity, enumDescription);
}
public override void VisitTupleDeclaration(TupleDeclarationModel m)
{
TypeDescription tupleDescription;
var arity = m.TypeParameters.Count;
if (arity > 0)
{
tupleDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m);
}
else
{
tupleDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m);
}
_scope.AddNamedType(m.Name, arity, tupleDescription);
}
public override void VisitTypeAlias(TypeAliasModel m)
{
TypeDescription typeDescription;
var arity = m.TypeParameters.Count;
if (arity > 0)
{
typeDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m);
}
else
{
typeDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m);
}
_scope.AddNamedType(m.Name, arity, typeDescription);
}
}