From e0e8c7b26df3d345eefe6a18579c5eb04c836160 Mon Sep 17 00:00:00 2001 From: csh Date: Sat, 25 Oct 2025 23:52:33 +0800 Subject: [PATCH] fix ast --- lsp-server/src/language/ast/deserializer.cpp | 16 ++++- lsp-server/src/language/ast/deserializer.hpp | 2 +- lsp-server/src/language/ast/detail.cpp | 9 ++- lsp-server/src/language/ast/detail.hpp | 2 +- .../src/language/ast/tree_sitter_utils.cpp | 4 +- .../src/language/ast/tree_sitter_utils.hpp | 2 +- lsp-server/src/language/ast/types.hpp | 17 ++++- lsp-server/src/tree-sitter/grammar.json | 4 +- lsp-server/src/tree-sitter/node-types.json | 2 +- lsp-server/src/tree-sitter/parser.c | 64 +++++++++---------- 10 files changed, 72 insertions(+), 50 deletions(-) diff --git a/lsp-server/src/language/ast/deserializer.cpp b/lsp-server/src/language/ast/deserializer.cpp index 918cc2e..3b9b399 100644 --- a/lsp-server/src/language/ast/deserializer.cpp +++ b/lsp-server/src/language/ast/deserializer.cpp @@ -1,3 +1,4 @@ +#include #include "./detail.hpp" #include "./tree_sitter_utils.hpp" #include "./deserializer.hpp" @@ -17,6 +18,10 @@ namespace lsp::language::ast detail::ParseContext ctx(source, result.errors); + auto program = std::make_unique(); + program->location = ts::NodeLocation(root); + program->node_type_name = "program"; + uint32_t count = ts_node_child_count(root); for (uint32_t i = 0; i < count; i++) { @@ -26,10 +31,11 @@ namespace lsp::language::ast if (!ts_node_is_named(child)) continue; - StatementPtr stmt = detail::ParseStatement(child, ctx); + StatementPtr stmt = detail::ParseStatement(child, ctx); if (stmt) - result.statements.push_back(std::move(stmt)); + program->statements.push_back(std::move(stmt)); } + result.root = std::move(program); // 收集语法错误 auto syntax_errors = detail::CollectSyntaxErrors(root, source); @@ -46,6 +52,10 @@ namespace lsp::language::ast detail::ParseContext ctx(source, result.result.errors); + auto program = std::make_unique(); + program->location = ts::NodeLocation(root); + program->node_type_name = "program"; + uint32_t count = ts_node_child_count(root); for (uint32_t i = 0; i < count; i++) { @@ -62,7 +72,7 @@ namespace lsp::language::ast StatementPtr stmt = detail::ParseStatement(child, ctx); if (stmt) - result.result.statements.push_back(std::move(stmt)); + program->statements.push_back(std::move(stmt)); } auto syntax_errors = detail::CollectSyntaxErrors(root, source); diff --git a/lsp-server/src/language/ast/deserializer.hpp b/lsp-server/src/language/ast/deserializer.hpp index 46d0103..d7d760d 100644 --- a/lsp-server/src/language/ast/deserializer.hpp +++ b/lsp-server/src/language/ast/deserializer.hpp @@ -46,7 +46,7 @@ namespace lsp::language::ast // ===== 解析结果 ===== struct ParseResult { - std::vector statements; + std::unique_ptr root; std::vector errors; bool HasErrors() const { return !errors.empty(); } diff --git a/lsp-server/src/language/ast/detail.cpp b/lsp-server/src/language/ast/detail.cpp index c3c7dee..0e502a0 100644 --- a/lsp-server/src/language/ast/detail.cpp +++ b/lsp-server/src/language/ast/detail.cpp @@ -1,4 +1,3 @@ -#include #include #include "../../utils/string.hpp" #include "./tree_sitter_utils.hpp" @@ -207,7 +206,7 @@ namespace lsp::language::ast::detail return type == "ERROR" || type == "MISSING"; } - std::vector CollectSyntaxErrors(TSNode node, const std::string& source) + std::vector CollectSyntaxErrors(TSNode node, std::string_view source) { std::vector errors; @@ -1715,7 +1714,7 @@ namespace lsp::language::ast::detail return stmt; } - StatementPtr ParseUsesStatement(TSNode node, [[maybe_unused]] ParseContext& ctx) + StatementPtr ParseUsesStatement(TSNode node, ParseContext& ctx) { Location loc = ts::NodeLocation(node); @@ -1728,11 +1727,11 @@ namespace lsp::language::ast::detail for (uint32_t i = 0; i < count; i++) { const char* field = ts_node_field_name_for_child(node, i); - if (!field || std::string_view(field) != "module") + if (!field || std::string_view(field) != "units") continue; TSNode child = ts_node_child(node, i); - uses->modules.push_back(std::move(ts::Text(child, ctx.Source()))); + uses->units.push_back(std::move(ts::Text(child, ctx.Source()))); } return uses; } diff --git a/lsp-server/src/language/ast/detail.hpp b/lsp-server/src/language/ast/detail.hpp index 817aa84..6737bc4 100644 --- a/lsp-server/src/language/ast/detail.hpp +++ b/lsp-server/src/language/ast/detail.hpp @@ -122,7 +122,7 @@ namespace lsp::language::ast::detail // ===== 基础辅助函数 ===== TSNode FindChildByType(TSNode parent, const std::string& type); bool IsSyntaxErrorNode(TSNode node); - std::vector CollectSyntaxErrors(TSNode node, const std::string& source); + std::vector CollectSyntaxErrors(TSNode node, std::string_view source); // 访问修饰符和方法修饰符解析 AccessModifier ParseAccessModifier(TSNode node, ParseContext& ctx); diff --git a/lsp-server/src/language/ast/tree_sitter_utils.cpp b/lsp-server/src/language/ast/tree_sitter_utils.cpp index 588bf2e..1db0c48 100644 --- a/lsp-server/src/language/ast/tree_sitter_utils.cpp +++ b/lsp-server/src/language/ast/tree_sitter_utils.cpp @@ -2,7 +2,7 @@ namespace lsp::language::ast::ts { - std::string Text(TSNode node, const std::string& source) + std::string Text(TSNode node, std::string_view source) { uint32_t start = ts_node_start_byte(node); uint32_t end = ts_node_end_byte(node); @@ -10,7 +10,7 @@ namespace lsp::language::ast::ts if (start >= end || end > source.length()) return ""; - return source.substr(start, end - start); + return std::string(source.substr(start, end - start)); } Location NodeLocation(TSNode node) diff --git a/lsp-server/src/language/ast/tree_sitter_utils.hpp b/lsp-server/src/language/ast/tree_sitter_utils.hpp index 2e2a30d..a82a527 100644 --- a/lsp-server/src/language/ast/tree_sitter_utils.hpp +++ b/lsp-server/src/language/ast/tree_sitter_utils.hpp @@ -8,7 +8,7 @@ extern "C" { namespace lsp::language::ast::ts { - std::string Text(TSNode node, const std::string& source); + std::string Text(TSNode node, std::string_view source); Location NodeLocation(TSNode node); diff --git a/lsp-server/src/language/ast/types.hpp b/lsp-server/src/language/ast/types.hpp index f88eb44..cfef51d 100644 --- a/lsp-server/src/language/ast/types.hpp +++ b/lsp-server/src/language/ast/types.hpp @@ -23,6 +23,7 @@ namespace lsp::language::ast // ===== 节点类型枚举 ===== enum class NodeKind { + kProgram, // Expressions kIdentifier, kLiteral, @@ -244,6 +245,7 @@ namespace lsp::language::ast // ===== 前向声明 ===== class ASTNode; + class Program; class Expression; class Statement; class Declaration; @@ -310,6 +312,7 @@ namespace lsp::language::ast public: virtual ~ASTVisitor() = default; + virtual void VisitProgram(Program& node) = 0; virtual void VisitUnitDefinition(UnitDefinition& node) = 0; virtual void VisitMethodDeclaration(MethodDeclaration& node) = 0; virtual void VisitPropertyDeclaration(PropertyDeclaration& node) = 0; @@ -864,14 +867,14 @@ namespace lsp::language::ast ExpressionPtr value; }; - class UsesStatement: public Statement + class UsesStatement : public Statement { public: UsesStatement() { kind = NodeKind::kUsesStatement; } void Accept(ASTVisitor& visitor) override { visitor.VisitUsesStatement(*this); } public: - std::vector modules; + std::vector units; }; struct Parameter @@ -1017,6 +1020,16 @@ namespace lsp::language::ast std::string operator_symbol; }; + class Program : public ASTNode + { + public: + Program() { kind = NodeKind::kProgram; } + void Accept(ASTVisitor& visitor) override { visitor.VisitProgram(*this); } + + public: + std::vector statements; + }; + template std::unique_ptr MakeNode(Args&&... args) { diff --git a/lsp-server/src/tree-sitter/grammar.json b/lsp-server/src/tree-sitter/grammar.json index 7cf72b6..e251f78 100644 --- a/lsp-server/src/tree-sitter/grammar.json +++ b/lsp-server/src/tree-sitter/grammar.json @@ -7884,7 +7884,7 @@ "members": [ { "type": "FIELD", - "name": "module", + "name": "unit", "content": { "type": "SYMBOL", "name": "identifier" @@ -7901,7 +7901,7 @@ }, { "type": "FIELD", - "name": "module", + "name": "unit", "content": { "type": "SYMBOL", "name": "identifier" diff --git a/lsp-server/src/tree-sitter/node-types.json b/lsp-server/src/tree-sitter/node-types.json index 41c7871..d467bc8 100644 --- a/lsp-server/src/tree-sitter/node-types.json +++ b/lsp-server/src/tree-sitter/node-types.json @@ -5659,7 +5659,7 @@ "type": "uses_statement", "named": true, "fields": { - "module": { + "unit": { "multiple": true, "required": true, "types": [ diff --git a/lsp-server/src/tree-sitter/parser.c b/lsp-server/src/tree-sitter/parser.c index 3d131f0..c2282c9 100644 --- a/lsp-server/src/tree-sitter/parser.c +++ b/lsp-server/src/tree-sitter/parser.c @@ -3073,32 +3073,32 @@ enum ts_field_identifiers { field_left_fields = 44, field_method_name = 45, field_modifier = 46, - field_module = 47, - field_name = 48, - field_object = 49, - field_operator = 50, - field_order_by = 51, - field_parameter = 52, - field_parameters = 53, - field_parent = 54, - field_part = 55, - field_read = 56, - field_ref = 57, - field_ref_modifier = 58, - field_reference_modifier = 59, - field_return_type = 60, - field_right = 61, - field_right_fields = 62, - field_source = 63, - field_start = 64, - field_subscript = 65, - field_table = 66, - field_table_index = 67, - field_tag_name = 68, - field_target = 69, - field_total = 70, - field_try_body = 71, - field_type_name = 72, + field_name = 47, + field_object = 48, + field_operator = 49, + field_order_by = 50, + field_parameter = 51, + field_parameters = 52, + field_parent = 53, + field_part = 54, + field_read = 55, + field_ref = 56, + field_ref_modifier = 57, + field_reference_modifier = 58, + field_return_type = 59, + field_right = 60, + field_right_fields = 61, + field_source = 62, + field_start = 63, + field_subscript = 64, + field_table = 65, + field_table_index = 66, + field_tag_name = 67, + field_target = 68, + field_total = 69, + field_try_body = 70, + field_type_name = 71, + field_unit = 72, field_value = 73, field_variable = 74, field_where = 75, @@ -3153,7 +3153,6 @@ static const char * const ts_field_names[] = { [field_left_fields] = "left_fields", [field_method_name] = "method_name", [field_modifier] = "modifier", - [field_module] = "module", [field_name] = "name", [field_object] = "object", [field_operator] = "operator", @@ -3179,6 +3178,7 @@ static const char * const ts_field_names[] = { [field_total] = "total", [field_try_body] = "try_body", [field_type_name] = "type_name", + [field_unit] = "unit", [field_value] = "value", [field_variable] = "variable", [field_where] = "where", @@ -3603,7 +3603,7 @@ static const TSFieldMapEntry ts_field_map_entries[] = { [62] = {field_table, 2}, [63] = - {field_module, 1}, + {field_unit, 1}, [64] = {field_left, 0}, {field_operator, 1}, @@ -3727,11 +3727,11 @@ static const TSFieldMapEntry ts_field_map_entries[] = { [143] = {field_try_body, 1}, [144] = - {field_module, 1}, - {field_module, 2, .inherited = true}, + {field_unit, 1}, + {field_unit, 2, .inherited = true}, [146] = - {field_module, 0, .inherited = true}, - {field_module, 1, .inherited = true}, + {field_unit, 0, .inherited = true}, + {field_unit, 1, .inherited = true}, [148] = {field_alternative, 3}, {field_condition, 0},