make exceptions cooler and fix example code
This commit is contained in:
parent
d6bdd08002
commit
18d35a5f1e
|
@ -2,18 +2,18 @@ import "std:strings";
|
||||||
import "foo" as bar;
|
import "foo" as bar;
|
||||||
import "./foobar";
|
import "./foobar";
|
||||||
|
|
||||||
/*
|
|
||||||
fn foo() {}
|
fn foo() {}
|
||||||
|
|
||||||
pub fn bar(int x) -> int {}
|
pub fn bar(x: int): int {}
|
||||||
|
|
||||||
pub fn multiret() -> int, int {}
|
pub fn multiret(): int, int {}
|
||||||
|
|
||||||
[c_export] pub fn add(int a, int b) -> int {}
|
[c_export] pub fn add(a: int, b: int): int {}
|
||||||
|
|
||||||
[c_export("add_floats")] pub fn add(float a, float b) -> float {}
|
[c_export("add_floats")] pub fn add(a: float,b: float): float {}
|
||||||
|
|
||||||
fn sub<T>(T a, T b) -> T
|
fn sub<T>(a: T, b: T): T
|
||||||
where SUBTRACT T
|
where SUBTRACT T
|
||||||
{
|
{
|
||||||
// do something
|
// do something
|
||||||
|
@ -21,19 +21,19 @@ fn sub<T>(T a, T b) -> T
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fn ret_arr() -> [int; 10] {}
|
fn ret_arr(): [int; 10] {}
|
||||||
fn ret_slice() -> [int] {}
|
fn ret_slice(): [int] {}
|
||||||
fn ret_multislice() -> [[int]] {}
|
fn ret_multislice(): [[int]] {}
|
||||||
fn ret_ptr() -> int* {}
|
fn ret_ptr(): int* {}
|
||||||
fn ret_ptrslice() -> [int*] {}
|
fn ret_ptrslice(): [int*] {}
|
||||||
fn ret_arrayptr() -> [int; 5]* {}
|
fn ret_arrayptr(): [int; 5]* {}
|
||||||
fn ret_tuple() -> (int, int) {}
|
fn ret_tuple(): (int, int) {}
|
||||||
|
|
||||||
fn ret_imported() -> strings:StringBuilder {}
|
fn ret_imported(): strings:StringBuilder {}
|
||||||
|
|
||||||
fn ret_nested() -> foo@bar {}
|
fn ret_nested(): foo@bar {}
|
||||||
|
|
||||||
fn ret_imported_nested() -> foo:bar@some@nested@shit {}
|
fn ret_imported_nested(): foo:bar@some@nested@shit {}
|
||||||
|
|
||||||
|
|
||||||
constraint Foo A {
|
constraint Foo A {
|
||||||
|
@ -47,10 +47,7 @@ constraint Bar B {
|
||||||
constraint Foo SomeType<B>;
|
constraint Foo SomeType<B>;
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
struct Foo {
|
struct Foo {
|
||||||
something: int;
|
something: int;
|
||||||
bar: struct {
|
bar: struct {
|
||||||
|
@ -65,13 +62,13 @@ enum X {
|
||||||
C
|
C
|
||||||
}
|
}
|
||||||
|
|
||||||
enum X<T1, T2, T3> {
|
enum X1<T1, T2, T3> {
|
||||||
A(T1),
|
A(T1),
|
||||||
B(T2),
|
B(T2),
|
||||||
C(T3),
|
C(T3),
|
||||||
}
|
}
|
||||||
|
|
||||||
enum X<T1, T2, T3> where Constraint T1 T2 where Constraint T2 T3 {
|
enum X2<T1, T2, T3> where Constraint T1 T2 where Constraint T2 T3 {
|
||||||
A(T1),
|
A(T1),
|
||||||
B(T2),
|
B(T2),
|
||||||
C(T3),
|
C(T3),
|
||||||
|
@ -91,14 +88,12 @@ type F<X> = Foo<Bar<X>>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type X = [Y; 10];
|
type Xa = [Y; 10];
|
||||||
|
|
||||||
*/
|
tuple Xa<A> (A,A,A);
|
||||||
/*
|
|
||||||
tuple X<A> (A,A,A);
|
|
||||||
|
|
||||||
|
|
||||||
type X<T> = [T; 10];
|
type Xaa<T> = [T; 10];
|
||||||
type X<T1, T2> = (T1, T2);
|
type X<T1, T2> = (T1, T2);
|
||||||
|
|
||||||
fn foo() {
|
fn foo() {
|
||||||
|
@ -132,7 +127,7 @@ struct Bar {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct Foo {
|
struct Fooo {
|
||||||
x: enum {Foo, Bar};
|
x: enum {Foo, Bar};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,15 +170,13 @@ fn test() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
type A = int*;
|
type Aaaaa = int*;
|
||||||
|
|
||||||
struct B {
|
struct B {
|
||||||
x: (int, int);
|
x: (int, int);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
type A<T> = [(T,int); 10];
|
struct Aaaaa<T> {
|
||||||
|
|
||||||
struct A<T> {
|
|
||||||
x: B<T>;
|
x: B<T>;
|
||||||
y: s32;
|
y: s32;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ public class ExpressionVisitorNya : MeowBaseVisitorNya<ExpressionModel>
|
||||||
if (expressions.Count == 1) return expressions[0];
|
if (expressions.Count == 1) return expressions[0];
|
||||||
var left = MakeBinOpTree(expressions.Take(expressions.Count - 1).ToList(), op);
|
var left = MakeBinOpTree(expressions.Take(expressions.Count - 1).ToList(), op);
|
||||||
var right = expressions[^1];
|
var right = expressions[^1];
|
||||||
var span = new Span(left.Span.Filename, left.Span.From, right.Span.To);
|
var span = new Span(left.Span.Filename, left.Span.From, right.Span.To, left.Span.Line);
|
||||||
return new BinaryOperationExpressionModel(span, left, op, right);
|
return new BinaryOperationExpressionModel(span, left, op, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ public class ExpressionVisitorNya : MeowBaseVisitorNya<ExpressionModel>
|
||||||
var remainingExpressions = expressions.Take(expressions.Count - 1).ToList();
|
var remainingExpressions = expressions.Take(expressions.Count - 1).ToList();
|
||||||
var remainingOps = ops.Take(ops.Count - 1).ToList();
|
var remainingOps = ops.Take(ops.Count - 1).ToList();
|
||||||
var left = MakeBinOpTree(remainingExpressions, remainingOps);
|
var left = MakeBinOpTree(remainingExpressions, remainingOps);
|
||||||
var span = new Span(left.Span.Filename, left.Span.From, right.Span.To);
|
var span = new Span(left.Span.Filename, left.Span.From, right.Span.To, left.Span.Line);
|
||||||
return new BinaryOperationExpressionModel(span, left, op, right);
|
return new BinaryOperationExpressionModel(span, left, op, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ public class ExpressionVisitorNya : MeowBaseVisitorNya<ExpressionModel>
|
||||||
var expression = Visit(context.pointerDereferenceExpression());
|
var expression = Visit(context.pointerDereferenceExpression());
|
||||||
foreach (var unaryOperator in context._op.Reverse())
|
foreach (var unaryOperator in context._op.Reverse())
|
||||||
{
|
{
|
||||||
var span = new Span(expression.Span.Filename, unaryOperator.StartIndex, expression.Span.To);
|
var span = new Span(expression.Span.Filename, unaryOperator.StartIndex, expression.Span.To, expression.Span.Line);
|
||||||
if (unaryOperator.Text == "&")
|
if (unaryOperator.Text == "&")
|
||||||
{
|
{
|
||||||
expression = new PointerReferenceExpressionModel(span, expression);
|
expression = new PointerReferenceExpressionModel(span, expression);
|
||||||
|
@ -137,7 +137,7 @@ public class ExpressionVisitorNya : MeowBaseVisitorNya<ExpressionModel>
|
||||||
var expression = Visit(context.accessExpression());
|
var expression = Visit(context.accessExpression());
|
||||||
foreach (var op in context._op.Reverse())
|
foreach (var op in context._op.Reverse())
|
||||||
{
|
{
|
||||||
var span = new Span(expression.Span.Filename, op.StartIndex, expression.Span.To);
|
var span = new Span(expression.Span.Filename, op.StartIndex, expression.Span.To, expression.Span.Line);
|
||||||
expression = new PointerDereferenceExpressionModel(span, expression);
|
expression = new PointerDereferenceExpressionModel(span, expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,13 +152,13 @@ public class ExpressionVisitorNya : MeowBaseVisitorNya<ExpressionModel>
|
||||||
{
|
{
|
||||||
if (current.subscript != null) // array access
|
if (current.subscript != null) // array access
|
||||||
{
|
{
|
||||||
var span = new Span(expression.Span.Filename, expression.Span.From, current.end.StopIndex);
|
var span = new Span(expression.Span.Filename, expression.Span.From, current.end.StopIndex, expression.Span.Line);
|
||||||
var indexer = Visit(current.subscript);
|
var indexer = Visit(current.subscript);
|
||||||
expression = new ArrayAccessExpressionModel(span, expression, indexer);
|
expression = new ArrayAccessExpressionModel(span, expression, indexer);
|
||||||
}
|
}
|
||||||
else // struct access
|
else // struct access
|
||||||
{
|
{
|
||||||
var span = new Span(expression.Span.Filename, expression.Span.From, current.name.StopIndex);
|
var span = new Span(expression.Span.Filename, expression.Span.From, current.name.StopIndex, expression.Span.Line);
|
||||||
var name = current.name.Text;
|
var name = current.name.Text;
|
||||||
if (name.Contains('.') || (char.IsDigit(name[0]) && !char.IsDigit(name.TrimStart('0')[0])))
|
if (name.Contains('.') || (char.IsDigit(name[0]) && !char.IsDigit(name.TrimStart('0')[0])))
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,69 +20,75 @@ public class MeowModelVisitor<T>
|
||||||
|
|
||||||
public T Visit(ModelBase m)
|
public T Visit(ModelBase m)
|
||||||
{
|
{
|
||||||
switch(m)
|
try {
|
||||||
{
|
switch(m)
|
||||||
|
{
|
||||||
|
|
||||||
case ArrayAccessExpressionModel x: return VisitArrayAccessExpression(x);
|
case ArrayAccessExpressionModel x: return VisitArrayAccessExpression(x);
|
||||||
case ArrayConstructorExpressionModel x: return VisitArrayConstructorExpression(x);
|
case ArrayConstructorExpressionModel x: return VisitArrayConstructorExpression(x);
|
||||||
case ArrayTypeModel x: return VisitArrayType(x);
|
case ArrayTypeModel x: return VisitArrayType(x);
|
||||||
case AssignmentExpressionModel x: return VisitAssignmentExpression(x);
|
case AssignmentExpressionModel x: return VisitAssignmentExpression(x);
|
||||||
case AttributeModel x: return VisitAttribute(x);
|
case AttributeModel x: return VisitAttribute(x);
|
||||||
case BinaryOperationExpressionModel x: return VisitBinaryOperationExpression(x);
|
case BinaryOperationExpressionModel x: return VisitBinaryOperationExpression(x);
|
||||||
case BlockExpressionModel x: return VisitBlockExpression(x);
|
case BlockExpressionModel x: return VisitBlockExpression(x);
|
||||||
case BoolLiteralModel x: return VisitBoolLiteral(x);
|
case BoolLiteralModel x: return VisitBoolLiteral(x);
|
||||||
case BreakStatementModel x: return VisitBreakStatement(x);
|
case BreakStatementModel x: return VisitBreakStatement(x);
|
||||||
case CharacterLiteralModel x: return VisitCharacterLiteral(x);
|
case CharacterLiteralModel x: return VisitCharacterLiteral(x);
|
||||||
case ConstantDeclarationStatementModel x: return VisitConstantDeclarationStatement(x);
|
case ConstantDeclarationStatementModel x: return VisitConstantDeclarationStatement(x);
|
||||||
case ConstraintDeclarationModel x: return VisitConstraintDeclaration(x);
|
case ConstraintDeclarationModel x: return VisitConstraintDeclaration(x);
|
||||||
case ConstraintModel x: return VisitConstraint(x);
|
case ConstraintModel x: return VisitConstraint(x);
|
||||||
case ContinueStatementModel x: return VisitContinueStatement(x);
|
case ContinueStatementModel x: return VisitContinueStatement(x);
|
||||||
case EmbedConstraintRuleModel x: return VisitEmbedConstraintRule(x);
|
case EmbedConstraintRuleModel x: return VisitEmbedConstraintRule(x);
|
||||||
case EnumConstructorExpressionModel x: return VisitEnumConstructorExpression(x);
|
case EnumConstructorExpressionModel x: return VisitEnumConstructorExpression(x);
|
||||||
case EnumDeclarationModel x: return VisitEnumDeclaration(x);
|
case EnumDeclarationModel x: return VisitEnumDeclaration(x);
|
||||||
case EnumMemberModel x: return VisitEnumMember(x);
|
case EnumMemberModel x: return VisitEnumMember(x);
|
||||||
case EnumTypeModel x: return VisitEnumType(x);
|
case EnumTypeModel x: return VisitEnumType(x);
|
||||||
case ExpressionStatementModel x: return VisitExpressionStatement(x);
|
case ExpressionStatementModel x: return VisitExpressionStatement(x);
|
||||||
case ForLoopStatementModel x: return VisitForLoopStatement(x);
|
case ForLoopStatementModel x: return VisitForLoopStatement(x);
|
||||||
case FunctionCallExpressionModel x: return VisitFunctionCallExpression(x);
|
case FunctionCallExpressionModel x: return VisitFunctionCallExpression(x);
|
||||||
case FunctionConstraintRuleModel x: return VisitFunctionConstraintRule(x);
|
case FunctionConstraintRuleModel x: return VisitFunctionConstraintRule(x);
|
||||||
case FunctionModel x: return VisitFunction(x);
|
case FunctionModel x: return VisitFunction(x);
|
||||||
case FunctionParameterModel x: return VisitFunctionParameter(x);
|
case FunctionParameterModel x: return VisitFunctionParameter(x);
|
||||||
case IdentifierAttributeValueModel x: return VisitIdentifierAttributeValue(x);
|
case IdentifierAttributeValueModel x: return VisitIdentifierAttributeValue(x);
|
||||||
case IdentifierNameModel x: return VisitIdentifierName(x);
|
case IdentifierNameModel x: return VisitIdentifierName(x);
|
||||||
case IfExpressionModel x: return VisitIfExpression(x);
|
case IfExpressionModel x: return VisitIfExpression(x);
|
||||||
case ImportModel x: return VisitImport(x);
|
case ImportModel x: return VisitImport(x);
|
||||||
case InfiniteLoopStatementModel x: return VisitInfiniteLoopStatement(x);
|
case InfiniteLoopStatementModel x: return VisitInfiniteLoopStatement(x);
|
||||||
case LiteralAttributeValueModel x: return VisitLiteralAttributeValue(x);
|
case LiteralAttributeValueModel x: return VisitLiteralAttributeValue(x);
|
||||||
case LiteralExpressionModel x: return VisitLiteralExpression(x);
|
case LiteralExpressionModel x: return VisitLiteralExpression(x);
|
||||||
case Model x: return Visit(x);
|
case Model x: return Visit(x);
|
||||||
case NameExpressionModel x: return VisitNameExpression(x);
|
case NameExpressionModel x: return VisitNameExpression(x);
|
||||||
case NumericLiteralModel x: return VisitNumericLiteral(x);
|
case NumericLiteralModel x: return VisitNumericLiteral(x);
|
||||||
case ParenthesisExpressionModel x: return VisitParenthesisExpression(x);
|
case ParenthesisExpressionModel x: return VisitParenthesisExpression(x);
|
||||||
case PatternModel x: return VisitPattern(x);
|
case PatternModel x: return VisitPattern(x);
|
||||||
case PointerDereferenceExpressionModel x: return VisitPointerDereferenceExpression(x);
|
case PointerDereferenceExpressionModel x: return VisitPointerDereferenceExpression(x);
|
||||||
case PointerReferenceExpressionModel x: return VisitPointerReferenceExpression(x);
|
case PointerReferenceExpressionModel x: return VisitPointerReferenceExpression(x);
|
||||||
case PointerTypeReferenceModel x: return VisitPointerTypeReference(x);
|
case PointerTypeReferenceModel x: return VisitPointerTypeReference(x);
|
||||||
case ReturnStatementModel x: return VisitReturnStatement(x);
|
case ReturnStatementModel x: return VisitReturnStatement(x);
|
||||||
case SliceTypeModel x: return VisitSliceType(x);
|
case SliceTypeModel x: return VisitSliceType(x);
|
||||||
case StringLiteralModel x: return VisitStringLiteral(x);
|
case StringLiteralModel x: return VisitStringLiteral(x);
|
||||||
case StructAccessExpressionModel x: return VisitStructAccessExpression(x);
|
case StructAccessExpressionModel x: return VisitStructAccessExpression(x);
|
||||||
case StructConstructorExpressionModel x: return VisitStructConstructorExpression(x);
|
case StructConstructorExpressionModel x: return VisitStructConstructorExpression(x);
|
||||||
case StructConstructorMemberModel x: return VisitStructConstructorMember(x);
|
case StructConstructorMemberModel x: return VisitStructConstructorMember(x);
|
||||||
case StructDeclarationModel x: return VisitStructDeclaration(x);
|
case StructDeclarationModel x: return VisitStructDeclaration(x);
|
||||||
case StructMemberModel x: return VisitStructMember(x);
|
case StructMemberModel x: return VisitStructMember(x);
|
||||||
case StructTypeModel x: return VisitStructType(x);
|
case StructTypeModel x: return VisitStructType(x);
|
||||||
case SwitchExpressionModel x: return VisitSwitchExpression(x);
|
case SwitchExpressionModel x: return VisitSwitchExpression(x);
|
||||||
case TopLevelStatementModel x: return VisitTopLevelStatement(x);
|
case TopLevelStatementModel x: return VisitTopLevelStatement(x);
|
||||||
case TupleConstructorExpressionModel x: return VisitTupleConstructorExpression(x);
|
case TupleConstructorExpressionModel x: return VisitTupleConstructorExpression(x);
|
||||||
case TupleDeclarationModel x: return VisitTupleDeclaration(x);
|
case TupleDeclarationModel x: return VisitTupleDeclaration(x);
|
||||||
case TupleTypeModel x: return VisitTupleType(x);
|
case TupleTypeModel x: return VisitTupleType(x);
|
||||||
case TypeAliasModel x: return VisitTypeAlias(x);
|
case TypeAliasModel x: return VisitTypeAlias(x);
|
||||||
case TypeNameModel x: return VisitTypeName(x);
|
case TypeNameModel x: return VisitTypeName(x);
|
||||||
case TypeParameterModel x: return VisitTypeParameter(x);
|
case TypeParameterModel x: return VisitTypeParameter(x);
|
||||||
case UnaryOperationExpressionModel x: return VisitUnaryOperationExpression(x);
|
case UnaryOperationExpressionModel x: return VisitUnaryOperationExpression(x);
|
||||||
case VariableDeclarationStatementModel x: return VisitVariableDeclarationStatement(x);
|
case VariableDeclarationStatementModel x: return VisitVariableDeclarationStatement(x);
|
||||||
case WhileLoopStatementModel x: return VisitWhileLoopStatement(x);
|
case WhileLoopStatementModel x: return VisitWhileLoopStatement(x);
|
||||||
|
}
|
||||||
|
} catch(Exception e)
|
||||||
|
{
|
||||||
|
if (e is MeowModelVisitorException) throw;
|
||||||
|
throw new MeowModelVisitorException(m, e);
|
||||||
}
|
}
|
||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
@ -754,69 +760,73 @@ public class MeowModelVisitor
|
||||||
{
|
{
|
||||||
public void Visit(ModelBase m)
|
public void Visit(ModelBase m)
|
||||||
{
|
{
|
||||||
switch(m)
|
try {
|
||||||
{
|
switch(m)
|
||||||
|
{
|
||||||
|
|
||||||
case ArrayAccessExpressionModel x: VisitArrayAccessExpression(x); break;
|
case ArrayAccessExpressionModel x: VisitArrayAccessExpression(x); break;
|
||||||
case ArrayConstructorExpressionModel x: VisitArrayConstructorExpression(x); break;
|
case ArrayConstructorExpressionModel x: VisitArrayConstructorExpression(x); break;
|
||||||
case ArrayTypeModel x: VisitArrayType(x); break;
|
case ArrayTypeModel x: VisitArrayType(x); break;
|
||||||
case AssignmentExpressionModel x: VisitAssignmentExpression(x); break;
|
case AssignmentExpressionModel x: VisitAssignmentExpression(x); break;
|
||||||
case AttributeModel x: VisitAttribute(x); break;
|
case AttributeModel x: VisitAttribute(x); break;
|
||||||
case BinaryOperationExpressionModel x: VisitBinaryOperationExpression(x); break;
|
case BinaryOperationExpressionModel x: VisitBinaryOperationExpression(x); break;
|
||||||
case BlockExpressionModel x: VisitBlockExpression(x); break;
|
case BlockExpressionModel x: VisitBlockExpression(x); break;
|
||||||
case BoolLiteralModel x: VisitBoolLiteral(x); break;
|
case BoolLiteralModel x: VisitBoolLiteral(x); break;
|
||||||
case BreakStatementModel x: VisitBreakStatement(x); break;
|
case BreakStatementModel x: VisitBreakStatement(x); break;
|
||||||
case CharacterLiteralModel x: VisitCharacterLiteral(x); break;
|
case CharacterLiteralModel x: VisitCharacterLiteral(x); break;
|
||||||
case ConstantDeclarationStatementModel x: VisitConstantDeclarationStatement(x); break;
|
case ConstantDeclarationStatementModel x: VisitConstantDeclarationStatement(x); break;
|
||||||
case ConstraintDeclarationModel x: VisitConstraintDeclaration(x); break;
|
case ConstraintDeclarationModel x: VisitConstraintDeclaration(x); break;
|
||||||
case ConstraintModel x: VisitConstraint(x); break;
|
case ConstraintModel x: VisitConstraint(x); break;
|
||||||
case ContinueStatementModel x: VisitContinueStatement(x); break;
|
case ContinueStatementModel x: VisitContinueStatement(x); break;
|
||||||
case EmbedConstraintRuleModel x: VisitEmbedConstraintRule(x); break;
|
case EmbedConstraintRuleModel x: VisitEmbedConstraintRule(x); break;
|
||||||
case EnumConstructorExpressionModel x: VisitEnumConstructorExpression(x); break;
|
case EnumConstructorExpressionModel x: VisitEnumConstructorExpression(x); break;
|
||||||
case EnumDeclarationModel x: VisitEnumDeclaration(x); break;
|
case EnumDeclarationModel x: VisitEnumDeclaration(x); break;
|
||||||
case EnumMemberModel x: VisitEnumMember(x); break;
|
case EnumMemberModel x: VisitEnumMember(x); break;
|
||||||
case EnumTypeModel x: VisitEnumType(x); break;
|
case EnumTypeModel x: VisitEnumType(x); break;
|
||||||
case ExpressionStatementModel x: VisitExpressionStatement(x); break;
|
case ExpressionStatementModel x: VisitExpressionStatement(x); break;
|
||||||
case ForLoopStatementModel x: VisitForLoopStatement(x); break;
|
case ForLoopStatementModel x: VisitForLoopStatement(x); break;
|
||||||
case FunctionCallExpressionModel x: VisitFunctionCallExpression(x); break;
|
case FunctionCallExpressionModel x: VisitFunctionCallExpression(x); break;
|
||||||
case FunctionConstraintRuleModel x: VisitFunctionConstraintRule(x); break;
|
case FunctionConstraintRuleModel x: VisitFunctionConstraintRule(x); break;
|
||||||
case FunctionModel x: VisitFunction(x); break;
|
case FunctionModel x: VisitFunction(x); break;
|
||||||
case FunctionParameterModel x: VisitFunctionParameter(x); break;
|
case FunctionParameterModel x: VisitFunctionParameter(x); break;
|
||||||
case IdentifierAttributeValueModel x: VisitIdentifierAttributeValue(x); break;
|
case IdentifierAttributeValueModel x: VisitIdentifierAttributeValue(x); break;
|
||||||
case IdentifierNameModel x: VisitIdentifierName(x); break;
|
case IdentifierNameModel x: VisitIdentifierName(x); break;
|
||||||
case IfExpressionModel x: VisitIfExpression(x); break;
|
case IfExpressionModel x: VisitIfExpression(x); break;
|
||||||
case ImportModel x: VisitImport(x); break;
|
case ImportModel x: VisitImport(x); break;
|
||||||
case InfiniteLoopStatementModel x: VisitInfiniteLoopStatement(x); break;
|
case InfiniteLoopStatementModel x: VisitInfiniteLoopStatement(x); break;
|
||||||
case LiteralAttributeValueModel x: VisitLiteralAttributeValue(x); break;
|
case LiteralAttributeValueModel x: VisitLiteralAttributeValue(x); break;
|
||||||
case LiteralExpressionModel x: VisitLiteralExpression(x); break;
|
case LiteralExpressionModel x: VisitLiteralExpression(x); break;
|
||||||
case Model x: Visit(x); break;
|
case Model x: Visit(x); break;
|
||||||
case NameExpressionModel x: VisitNameExpression(x); break;
|
case NameExpressionModel x: VisitNameExpression(x); break;
|
||||||
case NumericLiteralModel x: VisitNumericLiteral(x); break;
|
case NumericLiteralModel x: VisitNumericLiteral(x); break;
|
||||||
case ParenthesisExpressionModel x: VisitParenthesisExpression(x); break;
|
case ParenthesisExpressionModel x: VisitParenthesisExpression(x); break;
|
||||||
case PatternModel x: VisitPattern(x); break;
|
case PatternModel x: VisitPattern(x); break;
|
||||||
case PointerDereferenceExpressionModel x: VisitPointerDereferenceExpression(x); break;
|
case PointerDereferenceExpressionModel x: VisitPointerDereferenceExpression(x); break;
|
||||||
case PointerReferenceExpressionModel x: VisitPointerReferenceExpression(x); break;
|
case PointerReferenceExpressionModel x: VisitPointerReferenceExpression(x); break;
|
||||||
case PointerTypeReferenceModel x: VisitPointerTypeReference(x); break;
|
case PointerTypeReferenceModel x: VisitPointerTypeReference(x); break;
|
||||||
case ReturnStatementModel x: VisitReturnStatement(x); break;
|
case ReturnStatementModel x: VisitReturnStatement(x); break;
|
||||||
case SliceTypeModel x: VisitSliceType(x); break;
|
case SliceTypeModel x: VisitSliceType(x); break;
|
||||||
case StringLiteralModel x: VisitStringLiteral(x); break;
|
case StringLiteralModel x: VisitStringLiteral(x); break;
|
||||||
case StructAccessExpressionModel x: VisitStructAccessExpression(x); break;
|
case StructAccessExpressionModel x: VisitStructAccessExpression(x); break;
|
||||||
case StructConstructorExpressionModel x: VisitStructConstructorExpression(x); break;
|
case StructConstructorExpressionModel x: VisitStructConstructorExpression(x); break;
|
||||||
case StructConstructorMemberModel x: VisitStructConstructorMember(x); break;
|
case StructConstructorMemberModel x: VisitStructConstructorMember(x); break;
|
||||||
case StructDeclarationModel x: VisitStructDeclaration(x); break;
|
case StructDeclarationModel x: VisitStructDeclaration(x); break;
|
||||||
case StructMemberModel x: VisitStructMember(x); break;
|
case StructMemberModel x: VisitStructMember(x); break;
|
||||||
case StructTypeModel x: VisitStructType(x); break;
|
case StructTypeModel x: VisitStructType(x); break;
|
||||||
case SwitchExpressionModel x: VisitSwitchExpression(x); break;
|
case SwitchExpressionModel x: VisitSwitchExpression(x); break;
|
||||||
case TopLevelStatementModel x: VisitTopLevelStatement(x); break;
|
case TopLevelStatementModel x: VisitTopLevelStatement(x); break;
|
||||||
case TupleConstructorExpressionModel x: VisitTupleConstructorExpression(x); break;
|
case TupleConstructorExpressionModel x: VisitTupleConstructorExpression(x); break;
|
||||||
case TupleDeclarationModel x: VisitTupleDeclaration(x); break;
|
case TupleDeclarationModel x: VisitTupleDeclaration(x); break;
|
||||||
case TupleTypeModel x: VisitTupleType(x); break;
|
case TupleTypeModel x: VisitTupleType(x); break;
|
||||||
case TypeAliasModel x: VisitTypeAlias(x); break;
|
case TypeAliasModel x: VisitTypeAlias(x); break;
|
||||||
case TypeNameModel x: VisitTypeName(x); break;
|
case TypeNameModel x: VisitTypeName(x); break;
|
||||||
case TypeParameterModel x: VisitTypeParameter(x); break;
|
case TypeParameterModel x: VisitTypeParameter(x); break;
|
||||||
case UnaryOperationExpressionModel x: VisitUnaryOperationExpression(x); break;
|
case UnaryOperationExpressionModel x: VisitUnaryOperationExpression(x); break;
|
||||||
case VariableDeclarationStatementModel x: VisitVariableDeclarationStatement(x); break;
|
case VariableDeclarationStatementModel x: VisitVariableDeclarationStatement(x); break;
|
||||||
case WhileLoopStatementModel x: VisitWhileLoopStatement(x); break;
|
case WhileLoopStatementModel x: VisitWhileLoopStatement(x); break;
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
throw new MeowModelVisitorException(m, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
parser/MeowModelVisitorException.cs
Normal file
11
parser/MeowModelVisitorException.cs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
namespace meowlang.parser;
|
||||||
|
|
||||||
|
public class MeowModelVisitorException : Exception
|
||||||
|
{
|
||||||
|
public ModelBase Model { get; }
|
||||||
|
|
||||||
|
public MeowModelVisitorException(ModelBase model, Exception inner) : base($"{inner.Message} on line {model.Span.Line}", inner)
|
||||||
|
{
|
||||||
|
Model = model;
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@ public class MeowVisitorException : Exception
|
||||||
{
|
{
|
||||||
public IToken Token { get; }
|
public IToken Token { get; }
|
||||||
|
|
||||||
public MeowVisitorException(IToken token, string message) : base(message)
|
public MeowVisitorException(IToken token, string message) : base($"{message} on line {token.Line}")
|
||||||
{
|
{
|
||||||
Token = token;
|
Token = token;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
namespace meowlang.parser;
|
namespace meowlang.parser;
|
||||||
|
|
||||||
public record Span(string Filename, int From, int To);
|
public record Span(string Filename, int From, int To, int Line);
|
|
@ -118,7 +118,7 @@ internal static class ParserRuleContextExtensions
|
||||||
{
|
{
|
||||||
public static Span GetSpan(this ParserRuleContext context)
|
public static Span GetSpan(this ParserRuleContext context)
|
||||||
{
|
{
|
||||||
return new Span(context.Start.TokenSource.SourceName, context.Start.StartIndex, context.Stop.StopIndex);
|
return new Span(context.Start.TokenSource.SourceName, context.Start.StartIndex, context.Stop.StopIndex, context.Start.Line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ internal static class TokenExtensions
|
||||||
{
|
{
|
||||||
public static Span GetSpan(this IToken token)
|
public static Span GetSpan(this IToken token)
|
||||||
{
|
{
|
||||||
return new Span(token.TokenSource.SourceName, token.StartIndex, token.StopIndex);
|
return new Span(token.TokenSource.SourceName, token.StartIndex, token.StopIndex, token.Line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@ string MakeSwitchArm(TypeInfo model, bool isVoid)
|
||||||
var typeName = model.Name;
|
var typeName = model.Name;
|
||||||
var visitorName = $"Visit{UnModelifyName(typeName)}";
|
var visitorName = $"Visit{UnModelifyName(typeName)}";
|
||||||
return isVoid ? $@"
|
return isVoid ? $@"
|
||||||
case {typeName} x: {visitorName}(x); break;" : $@"
|
case {typeName} x: {visitorName}(x); break;" : $@"
|
||||||
case {typeName} x: return {visitorName}(x);";
|
case {typeName} x: return {visitorName}(x);";
|
||||||
}
|
}
|
||||||
|
|
||||||
var arms = new List<string>();
|
var arms = new List<string>();
|
||||||
|
@ -97,9 +97,14 @@ public class {className}<T>
|
||||||
|
|
||||||
public T Visit(ModelBase m)
|
public T Visit(ModelBase m)
|
||||||
{{
|
{{
|
||||||
switch(m)
|
try {{
|
||||||
{{
|
switch(m)
|
||||||
|
{{
|
||||||
{string.Join("", arms)}
|
{string.Join("", arms)}
|
||||||
|
}}
|
||||||
|
}} catch(Exception e) {{
|
||||||
|
if (e is MeowModelVisitorException) throw;
|
||||||
|
throw new MeowModelVisitorException(m, e);
|
||||||
}}
|
}}
|
||||||
return default;
|
return default;
|
||||||
}}
|
}}
|
||||||
|
@ -111,9 +116,14 @@ public class {className}
|
||||||
{{
|
{{
|
||||||
public void Visit(ModelBase m)
|
public void Visit(ModelBase m)
|
||||||
{{
|
{{
|
||||||
switch(m)
|
try {{
|
||||||
{{
|
switch(m)
|
||||||
|
{{
|
||||||
{string.Join("", voidArms)}
|
{string.Join("", voidArms)}
|
||||||
|
}}
|
||||||
|
}} catch(Exception e) {{
|
||||||
|
if (e is MeowModelVisitorException) throw;
|
||||||
|
throw new MeowModelVisitorException(m, e);
|
||||||
}}
|
}}
|
||||||
}}
|
}}
|
||||||
{string.Join("", voidMethods)}
|
{string.Join("", voidMethods)}
|
||||||
|
|
Loading…
Reference in a new issue