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...)
54 lines
1.6 KiB
C#
54 lines
1.6 KiB
C#
using meowlang.parser;
|
|
|
|
namespace meowlang.typechecker;
|
|
|
|
public class GenericTypeIdVisitor : MeowModelVisitor<GenericTypeId>
|
|
{
|
|
private readonly Scope _scope;
|
|
private readonly List<string> _genericParameters;
|
|
private readonly string? _name;
|
|
|
|
public GenericTypeIdVisitor(Scope scope, List<string> genericParameters, string? name)
|
|
{
|
|
_scope = scope;
|
|
_genericParameters = genericParameters;
|
|
_name = name;
|
|
}
|
|
|
|
public override GenericTypeId VisitTypeName(TypeNameModel m)
|
|
{
|
|
var typeParams = m.TypeParameters
|
|
.Select(t => new GenericTypeIdVisitor(_scope, _genericParameters, 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}";
|
|
}
|
|
|
|
PossiblyGenericTypeRef genericKey;
|
|
|
|
if (_genericParameters.Contains(name))
|
|
{
|
|
genericKey = new PossiblyGenericTypeRef(name);
|
|
}
|
|
else
|
|
{
|
|
genericKey = new PossiblyGenericTypeRef(_scope.GetTypeGuid(name, typeParams.Count));
|
|
}
|
|
|
|
return new GenericTypeId(genericKey, typeParams);
|
|
}
|
|
|
|
public override GenericTypeId VisitStructType(StructTypeModel m)
|
|
{
|
|
var type = new GenericTypeDescriptionVisitor(_scope, _genericParameters, _name).Visit(m);
|
|
var guid = _scope.AddAnonymousType(type);
|
|
return new GenericTypeId(new PossiblyGenericTypeRef(guid), new List<GenericTypeId>());
|
|
}
|
|
} |