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