using meowlang.parser; namespace meowlang.typechecker; public class CollectTypesVisitor : MeowModelVisitor { private readonly Scope _scope; public CollectTypesVisitor(Scope scope) { _scope = scope; } public override void VisitStructDeclaration(StructDeclarationModel m) { TypeDescription structDescription; var arity = m.TypeParameters.Count; if (arity > 0) { structDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m); } else { structDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m); } _scope.AddNamedType(m.Name, arity, structDescription); } public override void VisitEnumDeclaration(EnumDeclarationModel m) { TypeDescription enumDescription; var arity = m.TypeParameters.Count; if (arity > 0) { enumDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m); } else { enumDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m); } _scope.AddNamedType(m.Name, arity, enumDescription); } public override void VisitTupleDeclaration(TupleDeclarationModel m) { TypeDescription tupleDescription; var arity = m.TypeParameters.Count; if (arity > 0) { tupleDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m); } else { tupleDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m); } _scope.AddNamedType(m.Name, arity, tupleDescription); } public override void VisitTypeAlias(TypeAliasModel m) { TypeDescription typeDescription; var arity = m.TypeParameters.Count; if (arity > 0) { typeDescription = new GenericTypeDescriptionVisitor(_scope, m.TypeParameters, m.Name).Visit(m); } else { typeDescription = new TypeDescriptionVisitor(_scope, m.Name).Visit(m); } _scope.AddNamedType(m.Name, arity, typeDescription); } }