diff --git a/MeowLang.sln b/MeowLang.sln
index 1f402ef..a0159b2 100644
--- a/MeowLang.sln
+++ b/MeowLang.sln
@@ -4,6 +4,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "compiler", "compiler\compil
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "parser", "parser\parser.csproj", "{240E1F81-DB04-46CE-AB7B-60616B6D868C}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "typechecker", "typechecker\typechecker.csproj", "{C8E93E36-E566-4610-A5A9-58EAA3A0A286}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "visitorgenerator", "visitorgenerator\visitorgenerator.csproj", "{21040DD5-B347-4A5C-B40C-1C470BA9A67A}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -18,5 +22,13 @@ Global
{240E1F81-DB04-46CE-AB7B-60616B6D868C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{240E1F81-DB04-46CE-AB7B-60616B6D868C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{240E1F81-DB04-46CE-AB7B-60616B6D868C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8E93E36-E566-4610-A5A9-58EAA3A0A286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C8E93E36-E566-4610-A5A9-58EAA3A0A286}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8E93E36-E566-4610-A5A9-58EAA3A0A286}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C8E93E36-E566-4610-A5A9-58EAA3A0A286}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21040DD5-B347-4A5C-B40C-1C470BA9A67A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21040DD5-B347-4A5C-B40C-1C470BA9A67A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21040DD5-B347-4A5C-B40C-1C470BA9A67A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21040DD5-B347-4A5C-B40C-1C470BA9A67A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/README.md b/README.md
index 8dab8f4..0bdfb48 100644
--- a/README.md
+++ b/README.md
@@ -179,13 +179,18 @@ Their type is an `u8` array with length of the string in bytes.
```
###### use
```
+
+
let a: [u8] = "foo";
let b: u8 = a[1];
let d: [s32; 4] = []{1,2,3,4};
let e = [u8]{1,2,3,4};
+let f = d[1:3]; // f has type [s32] (slice) now
+
+
type Arr = [u8];
-let f = Arr[]{1,2,3};
+let g = Arr[]{1,2,3};
```
##### struct
@@ -202,6 +207,7 @@ type Point = struct {
z: s32;
}
+
type Options = struct {
api: struct {
int foo;
diff --git a/compiler/Compiler.cs b/compiler/Compiler.cs
index 2905f6a..599a3a9 100644
--- a/compiler/Compiler.cs
+++ b/compiler/Compiler.cs
@@ -1,5 +1,6 @@
using System;
using meowlang.parser;
+using meowlang.typechecker;
namespace meowlang.compiler;
@@ -9,6 +10,8 @@ static class Compiler
{
var path = "example.mew";
var model = Parser.Parse(path);
- Console.WriteLine(model.AutoToString());
+ Console.Write(model.AutoToString());
+ if (model == null) return;
+ TypeChecker.CheckAndInferTypes(model);
}
}
\ No newline at end of file
diff --git a/compiler/compiler.csproj b/compiler/compiler.csproj
index 56d2268..8e2e7ea 100644
--- a/compiler/compiler.csproj
+++ b/compiler/compiler.csproj
@@ -14,6 +14,7 @@
+
diff --git a/compiler/example.mew b/compiler/example.mew
index 84c5c4e..877de5c 100644
--- a/compiler/example.mew
+++ b/compiler/example.mew
@@ -94,9 +94,23 @@ type F = Foo>;
type X = [Y; 10];
*/
+/*
+tuple X (A,A,A);
+type X = [T; 10];
+type X = (T1, T2);
+
fn foo() {
+
+ let foo = X {a: 1, b: 2};
+ let bar = X {a: "foo" , b: "bar"};
+
+ let test = Imported:X@bar []{1,2,3};
+
+ foo.a + 1;
+ bar.a + 1;
+
meoooow let x-nyaaaa = []{1-nya, meow 2};
outer: loop let x = 1; x < 10; x += 1 {
@@ -109,4 +123,67 @@ fn foo() {
default: bar(),
}
}
-}
\ No newline at end of file
+}
+
+
+
+struct Bar {
+ y: Foo;
+}
+
+
+struct Foo {
+ x: enum {Foo, Bar};
+}
+
+struct A {
+ x: B;
+ y: s32;
+}
+
+struct B {
+ x: T;
+}
+
+struct C {
+ x: B;
+}
+
+enum E {
+ A,
+ B,
+ C
+}
+
+enum F {
+ A(u8),
+ B(B),
+ C(C)
+}
+
+fn foo(x: u32) {}
+fn foo(x: s32) {}
+fn bar(x: f32) {}
+fn bar(x: f64) {}
+
+fn test() {
+ let x = 1; // no idea what the type is
+ foo(x); // could be u32 or s32
+ bar(x); // f32 and f64 conflict with u32 and s32
+
+}
+
+
+
+type A = int*;
+
+struct B {
+ x: (int, int);
+}*/
+
+type A = [(T,int); 10];
+
+struct A {
+ x: B;
+ y: s32;
+}
diff --git a/parser/ArrayTypeModel.cs b/parser/ArrayTypeModel.cs
index 63c7465..768fc69 100644
--- a/parser/ArrayTypeModel.cs
+++ b/parser/ArrayTypeModel.cs
@@ -1,3 +1,3 @@
namespace meowlang.parser;
-public record ArrayTypeModel(Span Span, TypeReferenceModel Type, string Length) : TypeReferenceModel(Span);
\ No newline at end of file
+public record ArrayTypeModel(Span Span, TypeReferenceModel Type, uint Size) : TypeReferenceModel(Span);
\ No newline at end of file
diff --git a/parser/ConstraintTopLevelConstructModel.cs b/parser/ConstraintDeclarationModel.cs
similarity index 80%
rename from parser/ConstraintTopLevelConstructModel.cs
rename to parser/ConstraintDeclarationModel.cs
index f43f65c..43db612 100644
--- a/parser/ConstraintTopLevelConstructModel.cs
+++ b/parser/ConstraintDeclarationModel.cs
@@ -1,4 +1,4 @@
namespace meowlang.parser;
-public record ConstraintTopLevelConstructModel
+public record ConstraintDeclarationModel
(Span Span, List Attributes, bool Pub, string Name, List TypeNames, List Rules) : TopLevelConstructModel(Span);
\ No newline at end of file
diff --git a/parser/DeclarationVisitorNya.cs b/parser/DeclarationVisitorNya.cs
index 1118255..5ed2f13 100644
--- a/parser/DeclarationVisitorNya.cs
+++ b/parser/DeclarationVisitorNya.cs
@@ -1,4 +1,3 @@
-using Antlr4.Runtime.Tree;
using meowlang.parser.antlr;
namespace meowlang.parser;
@@ -33,7 +32,7 @@ public class DeclarationVisitorNya : MeowBaseVisitorNya
functionReturns, constraints, body);
}
- public override ConstraintTopLevelConstructModel VisitConstraintDeclaration(
+ public override ConstraintDeclarationModel VisitConstraintDeclaration(
MeowParser.ConstraintDeclarationContext context)
{
var attributes = context.attribute().Select(x => new AttributeVisitorNya().Visit(x)).ToList();
@@ -41,7 +40,7 @@ public class DeclarationVisitorNya : MeowBaseVisitorNya
var name = context.name.Text;
var typeNames = context._types.Select(x => x.Text).ToList();
var rules = context.constraintRule().Select(x => new ConstraintRuleVisitorNya().Visit(x)).ToList();
- return new ConstraintTopLevelConstructModel(context.GetSpan(), attributes, pub, name, typeNames, rules);
+ return new ConstraintDeclarationModel(context.GetSpan(), attributes, pub, name, typeNames, rules);
}
public override TopLevelConstructModel VisitStructDeclaration(MeowParser.StructDeclarationContext context)
@@ -53,7 +52,7 @@ public class DeclarationVisitorNya : MeowBaseVisitorNya
var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ??
new List();
var structModel = new TypeReferenceVisitorNya().Visit(context.structType()) as StructTypeModel;
- return new StructTopLevelConstructModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, structModel!);
+ return new StructDeclarationModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, structModel!);
}
public override TopLevelConstructModel VisitEnumDeclaration(MeowParser.EnumDeclarationContext context)
@@ -66,7 +65,7 @@ public class DeclarationVisitorNya : MeowBaseVisitorNya
new List();
var enumModel = new TypeReferenceVisitorNya().Visit(context.enumType()) as EnumTypeModel;
- return new EnumTopLevelConstructModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, enumModel!);
+ return new EnumDeclarationModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, enumModel!);
}
public override TopLevelConstructModel VisitTupleDeclaration(MeowParser.TupleDeclarationContext context)
@@ -78,7 +77,7 @@ public class DeclarationVisitorNya : MeowBaseVisitorNya
var constraints = context.constraint()?.Select(x => new FunctionConstraintVisitorNya().Visit(x)).ToList() ??
new List();
var tupleModel = new TypeReferenceVisitorNya().Visit(context.tupleType()) as TupleTypeModel;
- return new TupleTopLevelConstructModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, tupleModel!);
+ return new TupleDeclarationModel(context.GetSpan(), attributes, pub, name, typeParameters, constraints, tupleModel!);
}
public override TopLevelConstructModel VisitTypeAlias(MeowParser.TypeAliasContext context)
@@ -90,12 +89,4 @@ public class DeclarationVisitorNya : MeowBaseVisitorNya
var type = new TypeReferenceVisitorNya().Visit(context.typeReference());
return new TypeAliasModel(context.GetSpan(), attributes, pub, name, typeParameters, type);
}
-}
-
-public class MeowBaseVisitorNya : MeowBaseVisitor
-{
- public T? TryVisit(IParseTree? tree)
- {
- return tree == null ? default : Visit(tree);
- }
}
\ No newline at end of file
diff --git a/parser/EnumDeclarationModel.cs b/parser/EnumDeclarationModel.cs
new file mode 100644
index 0000000..34905f4
--- /dev/null
+++ b/parser/EnumDeclarationModel.cs
@@ -0,0 +1,4 @@
+namespace meowlang.parser;
+
+public record EnumDeclarationModel(Span Span, List Attributes, bool Pub, string Name, List TypeParameters,
+ List Constraints, EnumTypeModel Enum) : TopLevelConstructModel(Span);
\ No newline at end of file
diff --git a/parser/EnumTopLevelConstructModel.cs b/parser/EnumTopLevelConstructModel.cs
deleted file mode 100644
index 18acbf3..0000000
--- a/parser/EnumTopLevelConstructModel.cs
+++ /dev/null
@@ -1,4 +0,0 @@
-namespace meowlang.parser;
-
-public record EnumTopLevelConstructModel(Span Span, List Attributes, bool Pub, string Name, List TypeParameters,
- List Constraints, EnumTypeModel Enum) : TopLevelConstructModel(Span);
\ No newline at end of file
diff --git a/parser/ExpressionModel.cs b/parser/ExpressionModel.cs
index fe13677..1ec380f 100644
--- a/parser/ExpressionModel.cs
+++ b/parser/ExpressionModel.cs
@@ -1,3 +1,5 @@
namespace meowlang.parser;
-public abstract record ExpressionModel(Span Span) : ModelBase(Span);
\ No newline at end of file
+public abstract record ExpressionModel(Span Span) : ModelBase(Span)
+{
+}
\ No newline at end of file
diff --git a/parser/ExpressionVisitorNya.cs b/parser/ExpressionVisitorNya.cs
index 71d0660..3a1ea0e 100644
--- a/parser/ExpressionVisitorNya.cs
+++ b/parser/ExpressionVisitorNya.cs
@@ -160,7 +160,7 @@ public class ExpressionVisitorNya : MeowBaseVisitorNya
{
var span = new Span(expression.Span.Filename, expression.Span.From, current.name.StopIndex);
var name = current.name.Text;
- if (name.Contains('.') || !Char.IsDigit(name.TrimStart('0')[0]))
+ if (name.Contains('.') || (char.IsDigit(name[0]) && !char.IsDigit(name.TrimStart('0')[0])))
{
throw new InvalidStructAccessorException(current.name, "");
}
diff --git a/parser/IfExpressionModel.cs b/parser/IfExpressionModel.cs
index 0f7457e..07913f1 100644
--- a/parser/IfExpressionModel.cs
+++ b/parser/IfExpressionModel.cs
@@ -2,4 +2,19 @@ namespace meowlang.parser;
public record IfExpressionModel(Span Span, ExpressionModel Condition, BlockExpressionModel Block,
List<(ExpressionModel Condition, BlockExpressionModel Block)> IfElses,
- BlockExpressionModel? Else) : ExpressionModel(Span);
\ No newline at end of file
+ BlockExpressionModel? Else) : ExpressionModel(Span)
+{
+ public override IEnumerable GetChildren()
+ {
+ foreach (var modelBase in base.GetChildren())
+ {
+ yield return modelBase;
+ }
+
+ foreach (var (condition, block) in IfElses)
+ {
+ yield return condition;
+ yield return block;
+ }
+ }
+}
\ No newline at end of file
diff --git a/parser/InvalidArrayLengthException.cs b/parser/InvalidArrayLengthException.cs
new file mode 100644
index 0000000..eb775d6
--- /dev/null
+++ b/parser/InvalidArrayLengthException.cs
@@ -0,0 +1,10 @@
+using Antlr4.Runtime;
+
+namespace meowlang.parser;
+
+public class InvalidArrayLengthException : MeowVisitorException
+{
+ public InvalidArrayLengthException(IToken token) : base(token, $"invalid array size `{token.Text}`")
+ {
+ }
+}
\ No newline at end of file
diff --git a/parser/Meow.g4 b/parser/Meow.g4
index 9a336cd..7accc19 100644
--- a/parser/Meow.g4
+++ b/parser/Meow.g4
@@ -399,7 +399,7 @@ Identifier: [a-zA-Z_][a-zA-Z_0-9]*;
NumericLiteral: DecimalNumberLiteral /*| HexadecimalNumberLiteral | OctalNumberLiteral | BinaryNumberLiteral*/;
-fragment DecimalNumberLiteral: DecimalNumberPart ('.' DecimalNumberPart)? | '.' DecimalNumberPart;
+fragment DecimalNumberLiteral: '-'? DecimalNumberPart ('.' DecimalNumberPart)? | '.' DecimalNumberPart;
fragment DecimalNumberPart: [0-9] [0-9_]*;
BoolLiteral: 'true' | 'false' ;
CharacterLiteral: '\'' (CharacterEscape | ~['\\]) '\'';
diff --git a/parser/MeowBaseVisitorNya.cs b/parser/MeowBaseVisitorNya.cs
new file mode 100644
index 0000000..ebd4f3c
--- /dev/null
+++ b/parser/MeowBaseVisitorNya.cs
@@ -0,0 +1,12 @@
+using Antlr4.Runtime.Tree;
+using meowlang.parser.antlr;
+
+namespace meowlang.parser;
+
+public class MeowBaseVisitorNya : MeowBaseVisitor
+{
+ public T? TryVisit(IParseTree? tree)
+ {
+ return tree == null ? default : Visit(tree);
+ }
+}
\ No newline at end of file
diff --git a/parser/MeowModelVisitor.cs b/parser/MeowModelVisitor.cs
new file mode 100644
index 0000000..5d775b7
--- /dev/null
+++ b/parser/MeowModelVisitor.cs
@@ -0,0 +1,1303 @@
+// automatically generated
+
+// ReSharper disable MemberCanBeProtected.Global
+// ReSharper disable MemberCanBePrivate.Global
+#pragma warning disable CS8603
+#pragma warning disable CS8600
+#pragma warning disable CS8509
+
+using System.CodeDom.Compiler;
+namespace meowlang.parser;
+
+[GeneratedCode("meow-visitorgenerator", "1")]
+public class MeowModelVisitor
+{
+
+ public T? TryVisit(ModelBase? m)
+ {
+ return m == null ? default : Visit(m);
+ }
+
+ public T Visit(ModelBase m)
+ {
+ switch(m)
+ {
+
+ case ArrayAccessExpressionModel x: return VisitArrayAccessExpression(x);
+ case ArrayConstructorExpressionModel x: return VisitArrayConstructorExpression(x);
+ case ArrayTypeModel x: return VisitArrayType(x);
+ case AssignmentExpressionModel x: return VisitAssignmentExpression(x);
+ case AttributeModel x: return VisitAttribute(x);
+ case BinaryOperationExpressionModel x: return VisitBinaryOperationExpression(x);
+ case BlockExpressionModel x: return VisitBlockExpression(x);
+ case BoolLiteralModel x: return VisitBoolLiteral(x);
+ case BreakStatementModel x: return VisitBreakStatement(x);
+ case CharacterLiteralModel x: return VisitCharacterLiteral(x);
+ case ConstantDeclarationStatementModel x: return VisitConstantDeclarationStatement(x);
+ case ConstraintDeclarationModel x: return VisitConstraintDeclaration(x);
+ case ConstraintModel x: return VisitConstraint(x);
+ case ContinueStatementModel x: return VisitContinueStatement(x);
+ case EmbedConstraintRuleModel x: return VisitEmbedConstraintRule(x);
+ case EnumConstructorExpressionModel x: return VisitEnumConstructorExpression(x);
+ case EnumDeclarationModel x: return VisitEnumDeclaration(x);
+ case EnumMemberModel x: return VisitEnumMember(x);
+ case EnumTypeModel x: return VisitEnumType(x);
+ case ExpressionStatementModel x: return VisitExpressionStatement(x);
+ case ForLoopStatementModel x: return VisitForLoopStatement(x);
+ case FunctionCallExpressionModel x: return VisitFunctionCallExpression(x);
+ case FunctionConstraintRuleModel x: return VisitFunctionConstraintRule(x);
+ case FunctionModel x: return VisitFunction(x);
+ case FunctionParameterModel x: return VisitFunctionParameter(x);
+ case IdentifierAttributeValueModel x: return VisitIdentifierAttributeValue(x);
+ case IdentifierNameModel x: return VisitIdentifierName(x);
+ case IfExpressionModel x: return VisitIfExpression(x);
+ case ImportModel x: return VisitImport(x);
+ case InfiniteLoopStatementModel x: return VisitInfiniteLoopStatement(x);
+ case LiteralAttributeValueModel x: return VisitLiteralAttributeValue(x);
+ case LiteralExpressionModel x: return VisitLiteralExpression(x);
+ case Model x: return Visit(x);
+ case NameExpressionModel x: return VisitNameExpression(x);
+ case NumericLiteralModel x: return VisitNumericLiteral(x);
+ case ParenthesisExpressionModel x: return VisitParenthesisExpression(x);
+ case PatternModel x: return VisitPattern(x);
+ case PointerDereferenceExpressionModel x: return VisitPointerDereferenceExpression(x);
+ case PointerReferenceExpressionModel x: return VisitPointerReferenceExpression(x);
+ case PointerTypeReferenceModel x: return VisitPointerTypeReference(x);
+ case ReturnStatementModel x: return VisitReturnStatement(x);
+ case SliceTypeModel x: return VisitSliceType(x);
+ case StringLiteralModel x: return VisitStringLiteral(x);
+ case StructAccessExpressionModel x: return VisitStructAccessExpression(x);
+ case StructConstructorExpressionModel x: return VisitStructConstructorExpression(x);
+ case StructConstructorMemberModel x: return VisitStructConstructorMember(x);
+ case StructDeclarationModel x: return VisitStructDeclaration(x);
+ case StructMemberModel x: return VisitStructMember(x);
+ case StructTypeModel x: return VisitStructType(x);
+ case SwitchExpressionModel x: return VisitSwitchExpression(x);
+ case TopLevelStatementModel x: return VisitTopLevelStatement(x);
+ case TupleConstructorExpressionModel x: return VisitTupleConstructorExpression(x);
+ case TupleDeclarationModel x: return VisitTupleDeclaration(x);
+ case TupleTypeModel x: return VisitTupleType(x);
+ case TypeAliasModel x: return VisitTypeAlias(x);
+ case TypeNameModel x: return VisitTypeName(x);
+ case TypeParameterModel x: return VisitTypeParameter(x);
+ case UnaryOperationExpressionModel x: return VisitUnaryOperationExpression(x);
+ case VariableDeclarationStatementModel x: return VisitVariableDeclarationStatement(x);
+ case WhileLoopStatementModel x: return VisitWhileLoopStatement(x);
+ }
+ return default;
+ }
+
+ public virtual T VisitArrayAccessExpression(ArrayAccessExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitArrayConstructorExpression(ArrayConstructorExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitArrayType(ArrayTypeModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitAssignmentExpression(AssignmentExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitAttribute(AttributeModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitBinaryOperationExpression(BinaryOperationExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitBlockExpression(BlockExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitBoolLiteral(BoolLiteralModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitBreakStatement(BreakStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitCharacterLiteral(CharacterLiteralModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitConstantDeclarationStatement(ConstantDeclarationStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitConstraintDeclaration(ConstraintDeclarationModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitConstraint(ConstraintModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitContinueStatement(ContinueStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitEmbedConstraintRule(EmbedConstraintRuleModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitEnumConstructorExpression(EnumConstructorExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitEnumDeclaration(EnumDeclarationModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitEnumMember(EnumMemberModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitEnumType(EnumTypeModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitExpressionStatement(ExpressionStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitForLoopStatement(ForLoopStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitFunctionCallExpression(FunctionCallExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitFunctionConstraintRule(FunctionConstraintRuleModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitFunction(FunctionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitFunctionParameter(FunctionParameterModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitIdentifierAttributeValue(IdentifierAttributeValueModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitIdentifierName(IdentifierNameModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitIfExpression(IfExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitImport(ImportModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitInfiniteLoopStatement(InfiniteLoopStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitLiteralAttributeValue(LiteralAttributeValueModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitLiteralExpression(LiteralExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T Visit(Model m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitNameExpression(NameExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitNumericLiteral(NumericLiteralModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitParenthesisExpression(ParenthesisExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitPattern(PatternModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitPointerDereferenceExpression(PointerDereferenceExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitPointerReferenceExpression(PointerReferenceExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitPointerTypeReference(PointerTypeReferenceModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitReturnStatement(ReturnStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitSliceType(SliceTypeModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitStringLiteral(StringLiteralModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitStructAccessExpression(StructAccessExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitStructConstructorExpression(StructConstructorExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitStructConstructorMember(StructConstructorMemberModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitStructDeclaration(StructDeclarationModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitStructMember(StructMemberModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitStructType(StructTypeModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitSwitchExpression(SwitchExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitTopLevelStatement(TopLevelStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitTupleConstructorExpression(TupleConstructorExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitTupleDeclaration(TupleDeclarationModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitTupleType(TupleTypeModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitTypeAlias(TypeAliasModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitTypeName(TypeNameModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitTypeParameter(TypeParameterModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitUnaryOperationExpression(UnaryOperationExpressionModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitVariableDeclarationStatement(VariableDeclarationStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+ public virtual T VisitWhileLoopStatement(WhileLoopStatementModel m)
+ {
+ T result = default;
+ foreach (var modelBase in m.GetChildren())
+ {
+ result = Visit(modelBase);
+ }
+
+ return result;
+ }
+
+}
+
+[GeneratedCode("meow-visitorgenerator", "1")]
+public class MeowModelVisitor
+{
+ public void Visit(ModelBase m)
+ {
+ switch(m)
+ {
+
+ case ArrayAccessExpressionModel x: VisitArrayAccessExpression(x); break;
+ case ArrayConstructorExpressionModel x: VisitArrayConstructorExpression(x); break;
+ case ArrayTypeModel x: VisitArrayType(x); break;
+ case AssignmentExpressionModel x: VisitAssignmentExpression(x); break;
+ case AttributeModel x: VisitAttribute(x); break;
+ case BinaryOperationExpressionModel x: VisitBinaryOperationExpression(x); break;
+ case BlockExpressionModel x: VisitBlockExpression(x); break;
+ case BoolLiteralModel x: VisitBoolLiteral(x); break;
+ case BreakStatementModel x: VisitBreakStatement(x); break;
+ case CharacterLiteralModel x: VisitCharacterLiteral(x); break;
+ case ConstantDeclarationStatementModel x: VisitConstantDeclarationStatement(x); break;
+ case ConstraintDeclarationModel x: VisitConstraintDeclaration(x); break;
+ case ConstraintModel x: VisitConstraint(x); break;
+ case ContinueStatementModel x: VisitContinueStatement(x); break;
+ case EmbedConstraintRuleModel x: VisitEmbedConstraintRule(x); break;
+ case EnumConstructorExpressionModel x: VisitEnumConstructorExpression(x); break;
+ case EnumDeclarationModel x: VisitEnumDeclaration(x); break;
+ case EnumMemberModel x: VisitEnumMember(x); break;
+ case EnumTypeModel x: VisitEnumType(x); break;
+ case ExpressionStatementModel x: VisitExpressionStatement(x); break;
+ case ForLoopStatementModel x: VisitForLoopStatement(x); break;
+ case FunctionCallExpressionModel x: VisitFunctionCallExpression(x); break;
+ case FunctionConstraintRuleModel x: VisitFunctionConstraintRule(x); break;
+ case FunctionModel x: VisitFunction(x); break;
+ case FunctionParameterModel x: VisitFunctionParameter(x); break;
+ case IdentifierAttributeValueModel x: VisitIdentifierAttributeValue(x); break;
+ case IdentifierNameModel x: VisitIdentifierName(x); break;
+ case IfExpressionModel x: VisitIfExpression(x); break;
+ case ImportModel x: VisitImport(x); break;
+ case InfiniteLoopStatementModel x: VisitInfiniteLoopStatement(x); break;
+ case LiteralAttributeValueModel x: VisitLiteralAttributeValue(x); break;
+ case LiteralExpressionModel x: VisitLiteralExpression(x); break;
+ case Model x: Visit(x); break;
+ case NameExpressionModel x: VisitNameExpression(x); break;
+ case NumericLiteralModel x: VisitNumericLiteral(x); break;
+ case ParenthesisExpressionModel x: VisitParenthesisExpression(x); break;
+ case PatternModel x: VisitPattern(x); break;
+ case PointerDereferenceExpressionModel x: VisitPointerDereferenceExpression(x); break;
+ case PointerReferenceExpressionModel x: VisitPointerReferenceExpression(x); break;
+ case PointerTypeReferenceModel x: VisitPointerTypeReference(x); break;
+ case ReturnStatementModel x: VisitReturnStatement(x); break;
+ case SliceTypeModel x: VisitSliceType(x); break;
+ case StringLiteralModel x: VisitStringLiteral(x); break;
+ case StructAccessExpressionModel x: VisitStructAccessExpression(x); break;
+ case StructConstructorExpressionModel x: VisitStructConstructorExpression(x); break;
+ case StructConstructorMemberModel x: VisitStructConstructorMember(x); break;
+ case StructDeclarationModel x: VisitStructDeclaration(x); break;
+ case StructMemberModel x: VisitStructMember(x); break;
+ case StructTypeModel x: VisitStructType(x); break;
+ case SwitchExpressionModel x: VisitSwitchExpression(x); break;
+ case TopLevelStatementModel x: VisitTopLevelStatement(x); break;
+ case TupleConstructorExpressionModel x: VisitTupleConstructorExpression(x); break;
+ case TupleDeclarationModel x: VisitTupleDeclaration(x); break;
+ case TupleTypeModel x: VisitTupleType(x); break;
+ case TypeAliasModel x: VisitTypeAlias(x); break;
+ case TypeNameModel x: VisitTypeName(x); break;
+ case TypeParameterModel x: VisitTypeParameter(x); break;
+ case UnaryOperationExpressionModel x: VisitUnaryOperationExpression(x); break;
+ case VariableDeclarationStatementModel x: VisitVariableDeclarationStatement(x); break;
+ case WhileLoopStatementModel x: VisitWhileLoopStatement(x); break;
+ }
+ }
+
+ public virtual void VisitArrayAccessExpression(ArrayAccessExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitArrayConstructorExpression(ArrayConstructorExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitArrayType(ArrayTypeModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitAssignmentExpression(AssignmentExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitAttribute(AttributeModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitBinaryOperationExpression(BinaryOperationExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitBlockExpression(BlockExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitBoolLiteral(BoolLiteralModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitBreakStatement(BreakStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitCharacterLiteral(CharacterLiteralModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitConstantDeclarationStatement(ConstantDeclarationStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitConstraintDeclaration(ConstraintDeclarationModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitConstraint(ConstraintModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitContinueStatement(ContinueStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitEmbedConstraintRule(EmbedConstraintRuleModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitEnumConstructorExpression(EnumConstructorExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitEnumDeclaration(EnumDeclarationModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitEnumMember(EnumMemberModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitEnumType(EnumTypeModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitExpressionStatement(ExpressionStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitForLoopStatement(ForLoopStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitFunctionCallExpression(FunctionCallExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitFunctionConstraintRule(FunctionConstraintRuleModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitFunction(FunctionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitFunctionParameter(FunctionParameterModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitIdentifierAttributeValue(IdentifierAttributeValueModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitIdentifierName(IdentifierNameModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitIfExpression(IfExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitImport(ImportModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitInfiniteLoopStatement(InfiniteLoopStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitLiteralAttributeValue(LiteralAttributeValueModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitLiteralExpression(LiteralExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void Visit(Model m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitNameExpression(NameExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitNumericLiteral(NumericLiteralModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitParenthesisExpression(ParenthesisExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitPattern(PatternModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitPointerDereferenceExpression(PointerDereferenceExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitPointerReferenceExpression(PointerReferenceExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitPointerTypeReference(PointerTypeReferenceModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitReturnStatement(ReturnStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitSliceType(SliceTypeModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitStringLiteral(StringLiteralModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitStructAccessExpression(StructAccessExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitStructConstructorExpression(StructConstructorExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitStructConstructorMember(StructConstructorMemberModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitStructDeclaration(StructDeclarationModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitStructMember(StructMemberModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitStructType(StructTypeModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitSwitchExpression(SwitchExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitTopLevelStatement(TopLevelStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitTupleConstructorExpression(TupleConstructorExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitTupleDeclaration(TupleDeclarationModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitTupleType(TupleTypeModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitTypeAlias(TypeAliasModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitTypeName(TypeNameModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitTypeParameter(TypeParameterModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitUnaryOperationExpression(UnaryOperationExpressionModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitVariableDeclarationStatement(VariableDeclarationStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+ public virtual void VisitWhileLoopStatement(WhileLoopStatementModel m)
+ {
+ foreach (var modelBase in m.GetChildren())
+ {
+ Visit(modelBase);
+ }
+ }
+
+}
diff --git a/parser/ModelBase.cs b/parser/ModelBase.cs
index 2cb10a8..75f59f5 100644
--- a/parser/ModelBase.cs
+++ b/parser/ModelBase.cs
@@ -1,3 +1,30 @@
+using System.Collections;
+
namespace meowlang.parser;
-public record ModelBase([property:Ignore] Span Span);
\ No newline at end of file
+public abstract record ModelBase([property: Ignore] Span Span)
+{
+ public Dictionary Metadata { get; } = new();
+
+ public virtual IEnumerable GetChildren()
+ {
+ var properties = GetType().GetProperties();
+ foreach (var propertyInfo in properties)
+ {
+ if (propertyInfo.PropertyType.IsAssignableTo(typeof(ModelBase)))
+ {
+ if (propertyInfo.GetValue(this) is ModelBase value) yield return value;
+ }
+ else if (propertyInfo.PropertyType.IsAssignableTo(typeof(IEnumerable)))
+ {
+ if (propertyInfo.GetValue(this) is IEnumerable values)
+ {
+ foreach (var value in values)
+ {
+ yield return value;
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/parser/StructDeclarationModel.cs b/parser/StructDeclarationModel.cs
new file mode 100644
index 0000000..f868a57
--- /dev/null
+++ b/parser/StructDeclarationModel.cs
@@ -0,0 +1,4 @@
+namespace meowlang.parser;
+
+public record StructDeclarationModel(Span Span, List Attributes, bool Pub, string Name, List TypeParameters,
+ List Constraints, StructTypeModel Struct) : TopLevelConstructModel(Span);
\ No newline at end of file
diff --git a/parser/StructTopLevelConstructModel.cs b/parser/StructTopLevelConstructModel.cs
deleted file mode 100644
index 9aa92da..0000000
--- a/parser/StructTopLevelConstructModel.cs
+++ /dev/null
@@ -1,4 +0,0 @@
-namespace meowlang.parser;
-
-public record StructTopLevelConstructModel(Span Span, List Attributes, bool Pub, string Name, List TypeParameters,
- List Constraints, StructTypeModel Struct) : TopLevelConstructModel(Span);
\ No newline at end of file
diff --git a/parser/SwitchExpressionModel.cs b/parser/SwitchExpressionModel.cs
index 2c87a19..8751a35 100644
--- a/parser/SwitchExpressionModel.cs
+++ b/parser/SwitchExpressionModel.cs
@@ -1,4 +1,19 @@
namespace meowlang.parser;
public record SwitchExpressionModel(Span Span, ExpressionModel Expression,
- List<(LiteralModel Value, ExpressionModel? Body)> Cases, ExpressionModel? Default) : ExpressionModel(Span);
\ No newline at end of file
+ List<(LiteralModel Value, ExpressionModel? Body)> Cases, ExpressionModel? Default) : ExpressionModel(Span)
+{
+ public override IEnumerable GetChildren()
+ {
+ foreach (var modelBase in base.GetChildren())
+ {
+ yield return modelBase;
+ }
+
+ foreach (var (condition, block) in Cases)
+ {
+ yield return condition;
+ if (block != null) yield return block;
+ }
+ }
+}
\ No newline at end of file
diff --git a/parser/TupleDeclarationModel.cs b/parser/TupleDeclarationModel.cs
new file mode 100644
index 0000000..0093a5d
--- /dev/null
+++ b/parser/TupleDeclarationModel.cs
@@ -0,0 +1,4 @@
+namespace meowlang.parser;
+
+public record TupleDeclarationModel(Span Span, List Attributes, bool Pub, string Name, List TypeParameters,
+ List Constraints, TupleTypeModel Tuple) : TopLevelConstructModel(Span);
\ No newline at end of file
diff --git a/parser/TupleTopLevelConstructModel.cs b/parser/TupleTopLevelConstructModel.cs
deleted file mode 100644
index b093318..0000000
--- a/parser/TupleTopLevelConstructModel.cs
+++ /dev/null
@@ -1,4 +0,0 @@
-namespace meowlang.parser;
-
-public record TupleTopLevelConstructModel(Span Span, List Attributes, bool Pub, string Name, List TypeParameters,
- List Constraints, TupleTypeModel Tuple) : TopLevelConstructModel(Span);
\ No newline at end of file
diff --git a/parser/TypeReferenceVisitorNya.cs b/parser/TypeReferenceVisitorNya.cs
index 788d250..4253f43 100644
--- a/parser/TypeReferenceVisitorNya.cs
+++ b/parser/TypeReferenceVisitorNya.cs
@@ -31,7 +31,14 @@ public class TypeReferenceVisitorNya : MeowBaseVisitorNya
return new SliceTypeModel(context.GetSpan(), type);
}
- return new ArrayTypeModel(context.GetSpan(), type, context.length.Text);
+ if (context.length.Text.Contains('.') || context.length.Text.Contains('-'))
+ {
+ throw new InvalidArrayLengthException(context.length);
+ }
+
+ var size = uint.Parse(context.length.Text.Replace("_", ""));
+
+ return new ArrayTypeModel(context.GetSpan(), type, size);
}
public override TypeReferenceModel VisitTupleType(MeowParser.TupleTypeContext context)
diff --git a/parser/Utils.cs b/parser/Utils.cs
index 8a9e933..4bfe3c2 100644
--- a/parser/Utils.cs
+++ b/parser/Utils.cs
@@ -40,6 +40,12 @@ public static class ObjectExtensions
return $"\"{val}\"";
}
+ if (type.IsAssignableTo(typeof(Guid)))
+ {
+ var val = o.ToString();
+ return $"\"{val}\"";
+ }
+
string json;
if (o is ITuple t)
@@ -48,7 +54,25 @@ public static class ObjectExtensions
return values.AutoToString();
}
- if (type.IsAssignableTo(typeof(IEnumerable)))
+ if (type.IsAssignableTo(typeof(IDictionary)))
+ {
+ var dictionary = (o as IDictionary);
+ var sb = new StringBuilder();
+
+ sb.Append('{');
+
+ var first = true;
+ foreach (DictionaryEntry entry in dictionary!)
+ {
+ if (!first) sb.Append(',');
+ first = false;
+ sb.Append($"\"{entry.Key.ToString()}\": {entry.Value.AutoToString()}");
+ }
+
+ sb.Append('}');
+ json = sb.ToString();
+ }
+ else if (type.IsAssignableTo(typeof(IEnumerable)))
{
var enumerable = (o as IEnumerable)!.Cast