fix(struct_tags): edge case with structs declared as var (#99)
* fix(struct_tags): edge case with structs declared as var * test: test it and fix it * fixup! test: test it and fix it * fixup! fix(struct_tags): edge case with structs declared as var * fixup! test: test it and fix it
This commit is contained in:
parent
a993ece59f
commit
969db908f8
7 changed files with 96 additions and 6 deletions
|
|
@ -1,8 +1,15 @@
|
|||
local ts = {}
|
||||
local queries = {
|
||||
struct = [[
|
||||
(type_spec name: (type_identifier) @_name
|
||||
[(type_spec name: (type_identifier) @_name
|
||||
type: (struct_type))
|
||||
(var_declaration (var_spec
|
||||
name: (identifier) @_name @_var
|
||||
type: (struct_type)))
|
||||
(short_var_declaration
|
||||
left: (expression_list (identifier) @_name @_var)
|
||||
right: (expression_list (composite_literal
|
||||
type: (struct_type))))]
|
||||
]],
|
||||
func = [[
|
||||
[(function_declaration name: (identifier) @_name)
|
||||
|
|
@ -40,7 +47,7 @@ end
|
|||
---@param query vim.treesitter.Query
|
||||
---@param node TSNode
|
||||
---@param bufnr integer
|
||||
---@return {name:string}
|
||||
---@return {name:string, is_varstruct:boolean}
|
||||
local function get_captures(query, node, bufnr)
|
||||
local res = {}
|
||||
for _, match, _ in query:iter_matches(node, bufnr) do
|
||||
|
|
@ -49,6 +56,10 @@ local function get_captures(query, node, bufnr)
|
|||
if capture_name == "_name" then
|
||||
res["name"] = vim.treesitter.get_node_text(captured_node, bufnr)
|
||||
end
|
||||
|
||||
if capture_name == "_var" then
|
||||
res["is_varstruct"] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -59,6 +70,7 @@ end
|
|||
---@field name string
|
||||
---@field start_line integer
|
||||
---@field end_line integer
|
||||
---@field is_varstruct boolean
|
||||
|
||||
---@param bufnr integer
|
||||
---@param parent_type string[]
|
||||
|
|
@ -93,7 +105,15 @@ function ts.get_struct_under_cursor(bufnr)
|
|||
--- should be both type_spec and type_declaration
|
||||
--- because in cases like `type ( T struct{}, U strict{} )`
|
||||
--- i will be choosing always last struct in the list
|
||||
return do_stuff(bufnr, { "type_spec", "type_declaration" }, queries.struct)
|
||||
---
|
||||
--- var_declaration is for cases like `var x struct{}`
|
||||
--- short_var_declaration is for cases like `x := struct{}{}`
|
||||
return do_stuff(bufnr, {
|
||||
"type_spec",
|
||||
"type_declaration",
|
||||
"var_declaration",
|
||||
"short_var_declaration",
|
||||
}, queries.struct)
|
||||
end
|
||||
|
||||
---@param bufnr integer
|
||||
|
|
|
|||
|
|
@ -44,11 +44,18 @@ local function handle_tags(fpath, bufnr, user_args)
|
|||
c.commands.gomodifytags,
|
||||
"-transform", c.gotag.transform,
|
||||
"-format", "json",
|
||||
"-struct", st.name,
|
||||
"-file", fpath,
|
||||
"-w",
|
||||
}
|
||||
|
||||
if st.is_varstruct then
|
||||
table.insert(cmd, "-line")
|
||||
table.insert(cmd, string.format("%d,%d", st.start_line, st.end_line))
|
||||
else
|
||||
table.insert(cmd, "-struct")
|
||||
table.insert(cmd, st.name)
|
||||
end
|
||||
|
||||
for _, v in ipairs(user_args) do
|
||||
table.insert(cmd, v)
|
||||
end
|
||||
|
|
@ -60,7 +67,6 @@ local function handle_tags(fpath, bufnr, user_args)
|
|||
end
|
||||
|
||||
local res = vim.json.decode(rs.stdout)
|
||||
|
||||
if res["errors"] then
|
||||
log.error("tags: got an error " .. vim.inspect(res))
|
||||
error("failed to set tags " .. vim.inspect(res["errors"]))
|
||||
|
|
|
|||
11
spec/fixtures/tags/svar_input.go
vendored
Normal file
11
spec/fixtures/tags/svar_input.go
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package main
|
||||
|
||||
func main() {
|
||||
s := struct {
|
||||
API string
|
||||
Key string
|
||||
}{
|
||||
API: "api.com",
|
||||
Key: "key",
|
||||
}
|
||||
}
|
||||
11
spec/fixtures/tags/svar_output.go
vendored
Normal file
11
spec/fixtures/tags/svar_output.go
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package main
|
||||
|
||||
func main() {
|
||||
s := struct {
|
||||
API string `xml:"api"`
|
||||
Key string `xml:"key"`
|
||||
}{
|
||||
API: "api.com",
|
||||
Key: "key",
|
||||
}
|
||||
}
|
||||
8
spec/fixtures/tags/var_input.go
vendored
Normal file
8
spec/fixtures/tags/var_input.go
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
package main
|
||||
|
||||
func main() {
|
||||
var a struct {
|
||||
TestField1 string
|
||||
TestField2 string
|
||||
}
|
||||
}
|
||||
8
spec/fixtures/tags/var_output.go
vendored
Normal file
8
spec/fixtures/tags/var_output.go
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
package main
|
||||
|
||||
func main() {
|
||||
var a struct {
|
||||
TestField1 string `yaml:"test_field_1"`
|
||||
TestField2 string `yaml:"test_field_2"`
|
||||
}
|
||||
}
|
||||
|
|
@ -82,4 +82,30 @@ T["struct_tags"]["should add more than one tag"] = function()
|
|||
t.eq(t.readfile(tmp), fixtures.output)
|
||||
end
|
||||
|
||||
T["struct_tags"]["should add tags on var"] = function()
|
||||
local tmp = t.tmpfile()
|
||||
local fixtures = t.get_fixtures "tags/var"
|
||||
t.writefile(tmp, fixtures.input)
|
||||
|
||||
child.cmd("silent edit " .. tmp)
|
||||
child.fn.setpos(".", { child.fn.bufnr(tmp), 5, 3 })
|
||||
child.cmd "GoTagAdd yaml"
|
||||
child.cmd "write"
|
||||
|
||||
t.eq(t.readfile(tmp), fixtures.output)
|
||||
end
|
||||
|
||||
T["struct_tags"]["should add tags on short declr var"] = function()
|
||||
local tmp = t.tmpfile()
|
||||
local fixtures = t.get_fixtures "tags/svar"
|
||||
t.writefile(tmp, fixtures.input)
|
||||
|
||||
child.cmd("silent edit " .. tmp)
|
||||
child.fn.setpos(".", { child.fn.bufnr(tmp), 4, 3 })
|
||||
child.cmd "GoTagAdd xml"
|
||||
child.cmd "write"
|
||||
|
||||
t.eq(t.readfile(tmp), fixtures.output)
|
||||
end
|
||||
|
||||
return T
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue