Skip to content

Commit a9040da

Browse files
feat: upgrade tree-sitter-http
1 parent 76d868c commit a9040da

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

lua/rest-nvim/parser/init.lua

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,24 +108,27 @@ function M.parse_body(body_node, source, context)
108108
return body
109109
end
110110

111+
local IN_PLACE_VARIABLE_QUERY = "(variable_declaration) @inplace_variable"
112+
111113
---parse all in-place variables from source
112114
---@param source Source
113115
---@return Context ctx
114116
function M.create_context(source)
117+
local query = vim.treesitter.query.parse("http", IN_PLACE_VARIABLE_QUERY)
115118
local ctx = Context:new()
116119
local _, tree = utils.ts_parse_source(source)
117-
for node, _ in tree:root():iter_children() do
120+
for _, node in query:iter_captures(tree:root(), source) do
118121
if node:type() == "variable_declaration" then
119122
M.parse_variable_declaration(node, source, ctx)
120123
end
121124
end
122125
return ctx
123126
end
124127

125-
---@return TSNode?
128+
---@return TSNode? node TSNode with type `request_section`
126129
function M.get_cursor_request_node()
127130
local node = vim.treesitter.get_node()
128-
return node and utils.ts_find(node, "request")
131+
return node and utils.ts_find(node, "request_section")
129132
end
130133

131134
---@return TSNode[]
@@ -145,6 +148,7 @@ end
145148
---@param source Source
146149
---@param ctx Context
147150
function M.parse_variable_declaration(vd_node, source, ctx)
151+
vim.validate({ node = utils.ts_node_spec(vd_node, "variable_declaration") })
148152
local name = assert(get_node_field_text(vd_node, "name", source))
149153
local value = vim.trim(assert(get_node_field_text(vd_node, "value", source)))
150154
value = expand_variables(value, ctx)
@@ -210,15 +214,21 @@ end
210214

211215
---Parse the request node and create Request object. Returns `nil` if parsing
212216
---failed.
213-
---@param req_node TSNode Tree-sitter request node
217+
---@param node TSNode Tree-sitter request node
214218
---@param source Source
215219
---@param context? Context
216220
---@return Request|nil
217-
function M.parse(req_node, source, context)
221+
function M.parse(node, source, context)
222+
assert(node:type() == "request_section")
218223
context = context or Context:new()
219224
-- request should not include error
220-
if req_node:has_error() then
221-
logger.error(utils.ts_node_error_log(req_node))
225+
if node:has_error() then
226+
logger.error(utils.ts_node_error_log(node))
227+
return nil
228+
end
229+
local req_node = node:field("request")[1]
230+
if not req_node then
231+
logger.error("request section doesn't have request node")
222232
return nil
223233
end
224234
local body_node = req_node:field("body")[1]
@@ -238,6 +248,7 @@ function M.parse(req_node, source, context)
238248
config.encode_url and utils.escape or nil
239249
)
240250

251+
-- FIXME: use query instead
241252
local pre_script_nodes = collect_prev_siblings(req_node, {"pre_request_script"})
242253
for _, script_node in ipairs(pre_script_nodes) do
243254
M.parse_pre_request_script(script_node, source, context)

spec/api_spec.lua

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ local logger = require("rest-nvim.logger")
99

1010
local spy = require("luassert.spy")
1111

12-
local function file(path)
12+
local function open(path)
1313
vim.cmd.edit(path)
1414
return 0
1515
end
@@ -31,7 +31,7 @@ describe("parser", function()
3131
}, parser.parse(req_node, source))
3232
end)
3333
it("parse from http file", function()
34-
local source = file "spec/api.http"
34+
local source = open "spec/api.http"
3535
local _, tree = utils.ts_parse_source(source)
3636
local req_node = assert(tree:root():child(0))
3737
assert.same({
@@ -111,7 +111,7 @@ X-DATE: {{$date}}
111111
local _, tree = utils.ts_parse_source(source)
112112
local req_node = assert(tree:root():child(0))
113113
local req = parser.parse(req_node, source)
114-
assert.is_not_nil(req)
114+
assert.not_nil(req)
115115
---@cast req Request
116116
assert.same({
117117
["x-date"] = os.date("%Y-%m-%d")
@@ -128,7 +128,7 @@ X-DATE: {{$date}}
128128
local _, tree = utils.ts_parse_source(source)
129129
local req_node = assert(tree:root():child(0))
130130
local req = parser.parse(req_node, source)
131-
assert.is_not_nil(req)
131+
assert.not_nil(req)
132132
---@cast req Request
133133
assert.same({
134134
__TYPE = "json",
@@ -140,7 +140,7 @@ X-DATE: {{$date}}
140140
it("parse variable declaration", function ()
141141
local source = "@foo = bar\n"
142142
local _, tree = utils.ts_parse_source(source)
143-
local vd_node = assert(tree:root():child(0))
143+
local vd_node = assert(tree:root():child(0):child(0))
144144
assert.same("variable_declaration", vd_node:type())
145145
local c = context:new()
146146
parser.parse_variable_declaration(vd_node, source, c)
@@ -152,8 +152,8 @@ X-DATE: {{$date}}
152152
local source = "@foo = bar\n@baz = {{foo}} {{$date}}"
153153
local _, tree = utils.ts_parse_source(source)
154154
local c = context:new()
155-
parser.parse_variable_declaration(assert(tree:root():child(0)), source, c)
156-
parser.parse_variable_declaration(assert(tree:root():child(1)), source, c)
155+
parser.parse_variable_declaration(assert(tree:root():child(0):child(0)), source, c)
156+
parser.parse_variable_declaration(assert(tree:root():child(0):child(1)), source, c)
157157
assert.same({
158158
foo = "bar",
159159
baz = "bar " .. os.date("%Y-%m-%d"),
@@ -163,7 +163,7 @@ X-DATE: {{$date}}
163163
local source = "< {%\nrequest.variables.set('foo', 'bar')\n%}\n"
164164
local _, tree = utils.ts_parse_source(source)
165165
local c = context:new()
166-
local script_node = tree:root():child(0)
166+
local script_node = tree:root():child(0):child(0)
167167
assert(script_node)
168168
assert.same("pre_request_script", script_node:type())
169169
parser.parse_pre_request_script(script_node, source, c)

0 commit comments

Comments
 (0)