meowlang/typechecker/visitor/GenericTypeDescriptionVisitor.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

59 lines
2.2 KiB
C#

using meowlang.parser;
namespace meowlang.typechecker;
class GenericTypeDescriptionVisitor : MeowModelVisitor<GenericTypeDescription>
{
private readonly Scope _scope;
private readonly List<string> _typeParams;
private readonly string? _name;
public GenericTypeDescriptionVisitor(Scope scope, List<string> typeParams, string? name)
{
_scope = scope;
_typeParams = typeParams;
_name = name;
}
public override GenericTypeDescription VisitStructType(StructTypeModel m)
{
var members = new List<(string, GenericTypeId)>();
foreach (var (_, typeReferenceModel, name) in m.Members)
{
var fullName = _name == null ? null : $"{_name}@{name}";
members.Add((name, new GenericTypeIdVisitor(_scope, _typeParams, fullName).Visit(typeReferenceModel)));
}
return new GenericStructTypeDescription(_typeParams, members);
}
public override GenericTypeDescription VisitEnumType(EnumTypeModel m)
{
var members = new List<(string, GenericTypeId?)>();
foreach (var (_, name, typeReferenceModel) in m.Members)
{
var fullName = _name == null ? null : $"{_name}@{name}";
members.Add((name, new GenericTypeIdVisitor(_scope, _typeParams, fullName).TryVisit(typeReferenceModel)));
}
return new GenericEnumTypeDescription(_typeParams, members);
}
public override GenericTypeDescription VisitTupleType(TupleTypeModel m)
{
var members = m.Types.Select((t, i) => new GenericTypeIdVisitor(_scope, _typeParams, $"{_name}@{i}").Visit(t)).ToList();
return new GenericTupleTypeDescription(_typeParams, members);
}
public override GenericTypeDescription VisitArrayType(ArrayTypeModel m)
{
var elementType = new GenericTypeIdVisitor(_scope, _typeParams, $"{_name}@inner").Visit(m.Type);
return new GenericArrayTypeDescription(_typeParams, elementType, m.Size);
}
public override GenericTypeDescription VisitSliceType(SliceTypeModel m)
{
var elementType = new GenericTypeIdVisitor(_scope, _typeParams, $"{_name}@inner").Visit(m.Type);
return new GenericSliceTypeDescription(_typeParams, elementType);
}
}