From ad0cd3a39d5d77ec32d2f203c7258f727a06ba6e Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 26 Mar 2026 11:16:37 +0800 Subject: feat: add m_end position to AST nodes - Add end line and column (m_end.m_line, m_end.m_col) to AST output - New AST format: [name, begin_line, begin_col, end_line, end_col, ...children] - Update format_spec.yue to normalize end positions for comparison - Add ast_spec.yue tests for AST end position feature Closes #251 --- spec/outputs/test/ast_spec.lua | 85 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 spec/outputs/test/ast_spec.lua (limited to 'spec/outputs/test/ast_spec.lua') diff --git a/spec/outputs/test/ast_spec.lua b/spec/outputs/test/ast_spec.lua new file mode 100644 index 0000000..bab5b9e --- /dev/null +++ b/spec/outputs/test/ast_spec.lua @@ -0,0 +1,85 @@ +local yue = require("yue") +return describe("yue.to_ast", function() + it("should return AST with end position for simple expression", function() + local ast = yue.to_ast("x = 1") + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.same(ast[2], 1) + assert.same(ast[3], 1) + assert.is_number(ast[4]) + return assert.is_number(ast[5]) + end) + it("should have correct end position for leaf nodes", function() + local ast = yue.to_ast("1") + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.same(ast[2], 1) + assert.same(ast[3], 1) + assert.is_number(ast[4]) + return assert.is_number(ast[5]) + end) + it("should have end position for multi-line code", function() + local code = [[x = 1 +y = 2]] + local ast = yue.to_ast(code) + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.same(ast[2], 1) + assert.same(ast[3], 1) + return assert.is_true(ast[4] >= 2) + end) + it("should have end position for function definition", function() + local code = [[add = (a, b) -> + a + b]] + local ast = yue.to_ast(code) + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.same(ast[2], 1) + assert.same(ast[3], 1) + assert.is_number(ast[4]) + return assert.is_number(ast[5]) + end) + it("should have end position for table literal", function() + local ast = yue.to_ast("{a: 1, b: 2}") + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.same(ast[2], 1) + assert.same(ast[3], 1) + assert.is_number(ast[4]) + return assert.is_number(ast[5]) + end) + it("should have end position for class definition", function() + local code = [[class Person + new: (@name) => + getName: => @name]] + local ast = yue.to_ast(code) + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.same(ast[2], 1) + assert.same(ast[3], 1) + return assert.is_true(ast[4] >= 3) + end) + it("should return nil and error message for invalid syntax", function() + local ast, err = yue.to_ast("if then else") + assert.is_nil(ast) + return assert.is_string(err) + end) + it("should support flatten level parameter", function() + local ast = yue.to_ast("x = 1", 0) + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.is_number(ast[4]) + return assert.is_number(ast[5]) + end) + return it("should have end position in nested structures", function() + local code = "x = [i for i = 1, 10]" + local ast = yue.to_ast(code) + assert.is_not_nil(ast) + assert.same(ast[1], "File") + assert.same(ast[2], 1) + assert.same(ast[3], 1) + assert.is_number(ast[4]) + assert.is_number(ast[5]) + return assert.is_true(ast[5] > 1) + end) +end) -- cgit v1.2.3-55-g6feb