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

69 lines
1.8 KiB
C#

using meowlang.parser;
namespace meowlang.typechecker;
public class TypeIdVisitor : MeowModelVisitor<TypeId>
{
private readonly Scope _scope;
private readonly string? _name;
public TypeIdVisitor(Scope scope, string? name)
{
_scope = scope;
_name = name;
}
public override TypeId VisitTypeName(TypeNameModel m)
{
var typeParams = m.TypeParameters.Select(t => new TypeIdVisitor(_scope, null).Visit(t)).ToList();
var name = m.Name.Name;
if (m.Name.ImportName != null)
{
name = $"{m.Name.ImportName}:{name}";
}
foreach (var nested in m.Nested)
{
name = $"{name}@{nested}";
}
var guid = _scope.GetTypeGuid(name, typeParams.Count);
return new TypeId(guid, typeParams);
}
private TypeId RegisterAnonymousType(ModelBase m)
{
var type = new TypeDescriptionVisitor(_scope, _name).Visit(m);
Guid guid;
if (_name == null)
{
guid = _scope.AddAnonymousType(type);
}
else
{
guid = _scope.AddNamedType(_name, 0, type);
}
return new TypeId(guid, new List<TypeId>());
}
public override TypeId VisitStructType(StructTypeModel m)
{
return RegisterAnonymousType(m);
}
public override TypeId VisitEnumType(EnumTypeModel m)
{
return RegisterAnonymousType(m);
}
public override TypeId VisitTupleType(TupleTypeModel m)
{
return RegisterAnonymousType(m);
}
public override TypeId VisitArrayType(ArrayTypeModel m)
{
return RegisterAnonymousType(m);
}
public override TypeId VisitSliceType(SliceTypeModel m)
{
return RegisterAnonymousType(m);
}
}