fixes, more information in errors

This commit is contained in:
ProgramSnail 2023-05-05 11:59:02 +03:00
parent a11ddbd25f
commit b686fe00fb
10 changed files with 356 additions and 65 deletions

View file

@ -8,8 +8,15 @@
namespace interpreter {
void SetPosition(BaseNode& base_node, parser::ParseTree::Node& parse_node) {
base_node.start_position = parse_node.GetStartPoint();
base_node.end_position = parse_node.GetEndPoint();
}
// Sources -----------------
void BuildVisitor::Visit(SourceFile* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t statement_count = parse_node.NamedChildCount();
@ -26,6 +33,8 @@ void BuildVisitor::Visit(SourceFile* node) {
// Namespaces, partitions -----------------
void BuildVisitor::Visit(PartitionSources* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t statement_count = parse_node.NamedChildCount();
@ -40,6 +49,8 @@ void BuildVisitor::Visit(PartitionSources* node) {
}
void BuildVisitor::Visit(Partition* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
std::string name = parse_node.ChildByFieldName("name").GetValue();
@ -59,6 +70,8 @@ void BuildVisitor::Visit(Partition* node) {
}
void BuildVisitor::Visit(NamespaceSources* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t statement_count = parse_node.NamedChildCount();
@ -73,6 +86,8 @@ void BuildVisitor::Visit(NamespaceSources* node) {
}
void BuildVisitor::Visit(Namespace* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.ChildCount();
@ -86,8 +101,7 @@ void BuildVisitor::Visit(Namespace* node) {
}
}
current_node_ = parse_node.ChildByFieldName("type");
Visit(&node->type);
node->type = parse_node.ChildByFieldName("type").GetValue();
current_node_ = parse_node.ChildByFieldName("scope");
Visit(&node->scope);
@ -98,6 +112,8 @@ void BuildVisitor::Visit(Namespace* node) {
// Definitions -----------------
void BuildVisitor::Visit(ImportStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t excluded_child_count = 0;
@ -119,8 +135,7 @@ void BuildVisitor::Visit(ImportStatement* node) {
node->symbols.resize(child_count - excluded_child_count);
for (size_t i = 0; i < child_count - excluded_child_count; ++i) {
current_node_ = parse_node.NthNamedChild(i + excluded_child_count);
Visit(&node->symbols[i]);
node->symbols[i] = parse_node.NthNamedChild(i + excluded_child_count).GetValue();
}
}
@ -128,6 +143,8 @@ void BuildVisitor::Visit(ImportStatement* node) {
}
void BuildVisitor::Visit(AliasDefinitionStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
std::string modifier = parse_node.NthChild(0).GetValue();
@ -159,6 +176,8 @@ void BuildVisitor::Visit(AliasDefinitionStatement* node) {
}
void BuildVisitor::Visit(VariableDefinitionStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
std::string modifier = parse_node.NthChild(0).GetValue();
@ -185,6 +204,8 @@ void BuildVisitor::Visit(VariableDefinitionStatement* node) {
}
void BuildVisitor::Visit(FunctionDeclaration* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->name.name = parse_node.ChildByFieldName("name").GetValue();
@ -208,6 +229,8 @@ void BuildVisitor::Visit(FunctionDeclaration* node) {
}
void BuildVisitor::Visit(FunctionDefinitionStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->is_inline = (parse_node.NthChild(1).GetValue() == "inline");
@ -223,6 +246,8 @@ void BuildVisitor::Visit(FunctionDefinitionStatement* node) {
}
void BuildVisitor::Visit(TypeDefinitionStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
std::string modifier = parse_node.NthChild(0).GetValue();
@ -243,6 +268,8 @@ void BuildVisitor::Visit(TypeDefinitionStatement* node) {
}
void BuildVisitor::Visit(AbstractTypeDefinitionStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
std::string modifier = parse_node.NthChild(0).GetValue();
@ -260,6 +287,8 @@ void BuildVisitor::Visit(AbstractTypeDefinitionStatement* node) {
}
void BuildVisitor::Visit(TypeclassDefinitionStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("definition");
@ -361,6 +390,8 @@ void BuildVisitor::Visit(SourceStatement& node) {
// Definition parts
void BuildVisitor::Visit(FunctionDefinition* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->name.name = parse_node.ChildByFieldName("name").GetValue();
@ -385,6 +416,8 @@ void BuildVisitor::Visit(FunctionDefinition* node) {
}
void BuildVisitor::Visit(TypeDefinition* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("type");
@ -405,6 +438,8 @@ void BuildVisitor::Visit(TypeDefinition* node) {
}
void BuildVisitor::Visit(AnyAnnotatedType* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->type = parse_node.ChildByFieldName("type").GetValue();
@ -427,6 +462,8 @@ void BuildVisitor::Visit(AnyAnnotatedType* node) {
// Flow control -----------------
void BuildVisitor::Visit(TypeConstructorPatternParameter* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.NamedChildCount();
@ -445,6 +482,8 @@ void BuildVisitor::Visit(TypeConstructorPatternParameter* node) {
}
void BuildVisitor::Visit(TypeConstructorPattern* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("constructor");
@ -509,6 +548,8 @@ void BuildVisitor::Visit(Pattern& node) {
}
void BuildVisitor::Visit(MatchCase* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("value");
@ -536,6 +577,8 @@ void BuildVisitor::Visit(MatchCase* node) {
}
void BuildVisitor::Visit(Match* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("value");
@ -556,6 +599,8 @@ void BuildVisitor::Visit(Match* node) {
}
void BuildVisitor::Visit(Condition* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.NamedChildCount();
@ -577,6 +622,8 @@ void BuildVisitor::Visit(Condition* node) {
}
void BuildVisitor::Visit(DoWhileLoop* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("statement");
@ -589,6 +636,8 @@ void BuildVisitor::Visit(DoWhileLoop* node) {
}
void BuildVisitor::Visit(WhileLoop* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("condition");
@ -600,6 +649,8 @@ void BuildVisitor::Visit(WhileLoop* node) {
current_node_ = parse_node;
}
void BuildVisitor::Visit(ForLoop* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("variable");
@ -615,6 +666,8 @@ void BuildVisitor::Visit(ForLoop* node) {
}
void BuildVisitor::Visit(LoopLoop* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("statement");
@ -684,6 +737,8 @@ void BuildVisitor::Visit(BlockStatement& node) {
}
void BuildVisitor::Visit(Block* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t statement_count = parse_node.NamedChildCount();
@ -831,6 +886,8 @@ void BuildVisitor::Visit(SuperExpression& node) {
}
void BuildVisitor::Visit(ScopedStatement* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("statement");
@ -842,6 +899,8 @@ void BuildVisitor::Visit(ScopedStatement* node) {
// Operators
void BuildVisitor::Visit(BinaryOperatorExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("left_expression");
@ -856,6 +915,8 @@ void BuildVisitor::Visit(BinaryOperatorExpression* node) {
}
void BuildVisitor::Visit(UnaryOperatorExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->operator_name = parse_node.ChildByFieldName("operator_name").GetValue();
@ -867,6 +928,8 @@ void BuildVisitor::Visit(UnaryOperatorExpression* node) {
}
void BuildVisitor::Visit(ReferenceExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.ChildCount();
@ -891,6 +954,8 @@ void BuildVisitor::Visit(ReferenceExpression* node) {
}
void BuildVisitor::Visit(AccessExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("name");
@ -906,6 +971,8 @@ void BuildVisitor::Visit(AccessExpression* node) {
// Other expressions
void BuildVisitor::Visit(FunctionCallExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t excluded_child_count = 0;
@ -958,6 +1025,8 @@ void BuildVisitor::Visit(FunctionCallExpression* node) {
}
void BuildVisitor::Visit(TupleExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t expressions_count = parse_node.NamedChildCount();
@ -973,6 +1042,8 @@ void BuildVisitor::Visit(TupleExpression* node) {
}
void BuildVisitor::Visit(VariantExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t expressions_count = parse_node.NamedChildCount();
@ -988,6 +1059,8 @@ void BuildVisitor::Visit(VariantExpression* node) {
}
void BuildVisitor::Visit(ReturnExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("expression");
@ -997,6 +1070,8 @@ void BuildVisitor::Visit(ReturnExpression* node) {
}
void BuildVisitor::Visit(TypeConstructorParameter* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.NamedChildCount();
@ -1021,6 +1096,8 @@ void BuildVisitor::Visit(TypeConstructorParameter* node) {
}
void BuildVisitor::Visit(TypeConstructor* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("constructor");
@ -1042,6 +1119,8 @@ void BuildVisitor::Visit(TypeConstructor* node) {
}
void BuildVisitor::Visit(LambdaFunction* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.NamedChildCount();
@ -1073,6 +1152,8 @@ void BuildVisitor::Visit(LambdaFunction* node) {
}
void BuildVisitor::Visit(ArrayExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t elements_count = parse_node.NamedChildCount();
@ -1102,6 +1183,8 @@ void BuildVisitor::Visit(LoopControlExpression& node) {
// Name
void BuildVisitor::Visit(NameExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.NamedChildCount();
@ -1116,6 +1199,8 @@ void BuildVisitor::Visit(NameExpression* node) {
}
void BuildVisitor::Visit(TupleName* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t names_count = parse_node.NamedChildCount();
@ -1132,6 +1217,8 @@ void BuildVisitor::Visit(TupleName* node) {
}
void BuildVisitor::Visit(VariantName* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t names_count = parse_node.NamedChildCount();
@ -1148,6 +1235,8 @@ void BuildVisitor::Visit(VariantName* node) {
}
void BuildVisitor::Visit(AnnotatedName* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->name = parse_node.ChildByFieldName("name").GetValue();
@ -1189,6 +1278,8 @@ void BuildVisitor::Visit(AnyName& node) {
// Type
void BuildVisitor::Visit(FunctionType* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t types_count = parse_node.NamedChildCount();
@ -1204,6 +1295,8 @@ void BuildVisitor::Visit(FunctionType* node) {
}
void BuildVisitor::Visit(TupleType* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t current_node_n = 0;
@ -1239,6 +1332,8 @@ void BuildVisitor::Visit(TupleType* node) {
}
void BuildVisitor::Visit(VariantType* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t current_node_n = 0;
@ -1274,6 +1369,8 @@ void BuildVisitor::Visit(VariantType* node) {
}
void BuildVisitor::Visit(TypeExpression* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t excluded_child_count = 0;
@ -1337,6 +1434,8 @@ void BuildVisitor::Visit(AnyType& node) {
}
void BuildVisitor::Visit(ExtendedScopedAnyType* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
size_t child_count = parse_node.ChildCount();
@ -1362,9 +1461,12 @@ void BuildVisitor::Visit(ExtendedScopedAnyType* node) {
// Typeclass
void BuildVisitor::Visit(ParametrizedTypeclass* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->typeclass = parse_node.ChildByFieldName("typeclass").GetValue();
std::string prefixed_typeclass = parse_node.ChildByFieldName("typeclass").GetValue(); // prefix # removed
node->typeclass = prefixed_typeclass.substr(1, prefixed_typeclass.size() - 1);
size_t child_count = parse_node.NamedChildCount();
@ -1385,6 +1487,8 @@ void BuildVisitor::Visit(ParametrizedTypeclass* node) {
void BuildVisitor::Visit(ParametrizedType* node) {
SetPosition(node->base, current_node_);
auto parse_node = current_node_;
node->type = parse_node.ChildByFieldName("type").GetValue();
@ -1407,6 +1511,8 @@ void BuildVisitor::Visit(ParametrizedType* node) {
// Identifiers, constants, etc. -----------------
void BuildVisitor::Visit(ExtendedName* node) {
SetPosition(node->base, current_node_);
size_t child_count = current_node_.NamedChildCount();
if (child_count > 1) {
node->name = current_node_.GetValue();
@ -1415,29 +1521,39 @@ void BuildVisitor::Visit(ExtendedName* node) {
}
}
void BuildVisitor::Visit(AnyIdentifier* node) { // std::string
*node = current_node_.GetValue();
}
// void BuildVisitor::Visit(AnyIdentifier* node) { // std::string
// *node = current_node_.GetValue();
// }
void BuildVisitor::Visit(FloatNumberLiteral* node) {
SetPosition(node->base, current_node_);
node->value = std::stod(current_node_.GetValue());
}
void BuildVisitor::Visit(NumberLiteral* node) {
SetPosition(node->base, current_node_);
node->value = std::stoll(current_node_.GetValue());
}
void BuildVisitor::Visit(StringLiteral* node) {
SetPosition(node->base, current_node_);
std::string literal = current_node_.GetValue();
node->value = literal.substr(1, literal.size() - 2);
}
void BuildVisitor::Visit(CharLiteral* node) {
SetPosition(node->base, current_node_);
std::string literal = current_node_.GetValue();
node->value = literal.substr(1, literal.size() - 2).back(); // TODO: special symbols, etc.
}
void BuildVisitor::Visit(UnitLiteral* node) {}
void BuildVisitor::Visit(UnitLiteral* node) {
SetPosition(node->base, current_node_);
}
void BuildVisitor::Visit(Literal& node) {
auto parse_node = current_node_;