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...)
59 lines
2.2 KiB
C#
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);
|
|
}
|
|
} |