using meowlang.parser; namespace meowlang.typechecker; class GenericTypeDescriptionVisitor : MeowModelVisitor { private readonly Scope _scope; private readonly List _typeParams; private readonly string? _name; public GenericTypeDescriptionVisitor(Scope scope, List 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); } }