diff --git a/lua/gopher/_utils/ts.lua b/lua/gopher/_utils/ts.lua index 0b88b64..86cc316 100644 --- a/lua/gopher/_utils/ts.lua +++ b/lua/gopher/_utils/ts.lua @@ -11,6 +11,9 @@ local queries = { right: (expression_list (composite_literal type: (struct_type))))] ]], + struct_field = [[ + (field_declaration name: (field_identifier) @_name) + ]], func = [[ [(function_declaration name: (identifier) @_name) (method_declaration name: (field_identifier) @_name) @@ -80,16 +83,14 @@ local function do_stuff(bufnr, parent_type, query) error "No treesitter parser found for go" end - local node = vim.treesitter.get_node { - bufnr = bufnr, - } + local node = vim.treesitter.get_node { bufnr = bufnr } if not node then - error "No nodes found under cursor" + error "No nodes found under the cursor" end local parent_node = get_parrent_node(parent_type, node) if not parent_node then - error "No parent node found under cursor" + error "No parent node found under the cursor" end local q = vim.treesitter.query.parse("go", query) @@ -107,11 +108,12 @@ end ---@param bufnr integer 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 + --- because in cases like `type ( T struct{}, U struct{} )` --- --- var_declaration is for cases like `var x struct{}` --- short_var_declaration is for cases like `x := struct{}{}` + --- + --- it always chooses last struct type in the list return do_stuff(bufnr, { "type_spec", "type_declaration", @@ -120,6 +122,11 @@ function ts.get_struct_under_cursor(bufnr) }, queries.struct) end +---@param bufnr integer +function ts.get_struct_field_under_cursor(bufnr) + return do_stuff(bufnr, { "field_declaration" }, queries.struct_field) +end + ---@param bufnr integer function ts.get_func_under_cursor(bufnr) --- since this handles both and funcs and methods we should check for both parent nodes diff --git a/lua/gopher/comment.lua b/lua/gopher/comment.lua index 0192e51..e7ee08e 100644 --- a/lua/gopher/comment.lua +++ b/lua/gopher/comment.lua @@ -15,6 +15,11 @@ local comment = {} ---@return string ---@dochide local function generate(bufnr, line) + local sf_ok, sf_res = pcall(ts.get_struct_field_under_cursor, bufnr) + if sf_ok then + return u.indent(line, sf_res.indent) .. "// " .. sf_res.name .. " " + end + local s_ok, s_res = pcall(ts.get_struct_under_cursor, bufnr) if s_ok then return u.indent(line, s_res.indent) .. "// " .. s_res.name .. " " diff --git a/spec/fixtures/comment/many_structs_fields_input.go b/spec/fixtures/comment/many_structs_fields_input.go new file mode 100644 index 0000000..f5c6367 --- /dev/null +++ b/spec/fixtures/comment/many_structs_fields_input.go @@ -0,0 +1,18 @@ +package main + +type ( + TestOne struct { + Asdf string + ID int + } + + TestTwo struct { + Fesa int + A bool + } + + TestThree struct { + Asufj int + Fs string + } +) diff --git a/spec/fixtures/comment/many_structs_fields_output.go b/spec/fixtures/comment/many_structs_fields_output.go new file mode 100644 index 0000000..648f39f --- /dev/null +++ b/spec/fixtures/comment/many_structs_fields_output.go @@ -0,0 +1,19 @@ +package main + +type ( + TestOne struct { + Asdf string + ID int + } + + TestTwo struct { + // Fesa + Fesa int + A bool + } + + TestThree struct { + Asufj int + Fs string + } +) diff --git a/spec/fixtures/comment/struct_fields_input.go b/spec/fixtures/comment/struct_fields_input.go new file mode 100644 index 0000000..6d6da38 --- /dev/null +++ b/spec/fixtures/comment/struct_fields_input.go @@ -0,0 +1,7 @@ +package main + +type CommentStruct struct { + Name string + Address string + Aliases []string +} diff --git a/spec/fixtures/comment/struct_fields_output.go b/spec/fixtures/comment/struct_fields_output.go new file mode 100644 index 0000000..06e6483 --- /dev/null +++ b/spec/fixtures/comment/struct_fields_output.go @@ -0,0 +1,8 @@ +package main + +type CommentStruct struct { + Name string + // Address + Address string + Aliases []string +} diff --git a/spec/fixtures/comment/var_struct_fields_input.go b/spec/fixtures/comment/var_struct_fields_input.go new file mode 100644 index 0000000..c686212 --- /dev/null +++ b/spec/fixtures/comment/var_struct_fields_input.go @@ -0,0 +1,8 @@ +package main + +func main() { + var s struct { + API string + Key string + } +} diff --git a/spec/fixtures/comment/var_struct_fields_output.go b/spec/fixtures/comment/var_struct_fields_output.go new file mode 100644 index 0000000..9676923 --- /dev/null +++ b/spec/fixtures/comment/var_struct_fields_output.go @@ -0,0 +1,9 @@ +package main + +func main() { + var s struct { + API string + // Key + Key string + } +} diff --git a/spec/integration/comment_test.lua b/spec/integration/comment_test.lua index b727239..a6fb667 100644 --- a/spec/integration/comment_test.lua +++ b/spec/integration/comment_test.lua @@ -18,6 +18,18 @@ comment["should add comment to struct"] = function() do_the_test("struct", { 4, 1 }) end +comment["should add a comment on struct field"] = function() + do_the_test("struct_fields", { 5, 8 }) +end + +comment["should add a comment on var struct field"] = function() + do_the_test("var_struct_fields", { 6, 4 }) +end + +comment["should add a comment on one field of many structs"] = function() + do_the_test("many_structs_fields", { 10, 4 }) +end + comment["should add comment to function"] = function() do_the_test("func", { 3, 1 }) end