using meowlang.parser; namespace meowlang.typechecker; public class TypeIdVisitor : MeowModelVisitor { 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()); } 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); } }