Skip to content

Commit 9f15236

Browse files
committed
Support --fields=+l
Signed-off-by: Lewis Marshall <[email protected]>
1 parent 1dd8168 commit 9f15236

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

fields.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"regexp"
6+
)
7+
8+
// FieldSet is a set of extension fields to include in a tag.
9+
type FieldSet map[TagField]bool
10+
11+
// Includes tests whether the given field is included in the set.
12+
func (f FieldSet) Includes(field TagField) bool {
13+
b, ok := f[field]
14+
return ok && b
15+
}
16+
17+
// ErrInvalidFields is an error returned when attempting to parse invalid
18+
// fields.
19+
type ErrInvalidFields struct {
20+
Fields string
21+
}
22+
23+
func (e ErrInvalidFields) Error() string {
24+
return fmt.Sprintf("invalid fields: %s", e.Fields)
25+
}
26+
27+
// currently only "+l" is supported
28+
var fieldsPattern = regexp.MustCompile(`^\+l$`)
29+
30+
func parseFields(fields string) (FieldSet, error) {
31+
if fields == "" {
32+
return FieldSet{}, nil
33+
}
34+
if fieldsPattern.MatchString(fields) {
35+
return FieldSet{Language: true}, nil
36+
}
37+
return FieldSet{}, ErrInvalidFields{fields}
38+
}

fields_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestParseFieldsEmpty(t *testing.T) {
8+
_, err := parseFields("")
9+
if err != nil {
10+
t.Fatalf("unexpected error from parseFields: %s", err)
11+
}
12+
}
13+
14+
func TestParseFieldsLanguage(t *testing.T) {
15+
set, err := parseFields("+l")
16+
if err != nil {
17+
t.Fatalf("unexpected error from parseFields: %s", err)
18+
}
19+
if !set.Includes(Language) {
20+
t.Fatal("expected set to include Language")
21+
}
22+
}
23+
24+
func TestParseFieldsInvalid(t *testing.T) {
25+
_, err := parseFields("junk")
26+
if err == nil {
27+
t.Fatal("expected parseFields to return error")
28+
}
29+
if _, ok := err.(ErrInvalidFields); !ok {
30+
t.Fatalf("expected parseFields to return error of type ErrInvalidFields, got %T", err)
31+
}
32+
}

main.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ var (
3030
silent bool
3131
relative bool
3232
listLangs bool
33+
fields string
3334
)
3435

3536
// Initialize flags.
@@ -42,6 +43,7 @@ func init() {
4243
flag.BoolVar(&silent, "silent", false, "do not produce any output on error.")
4344
flag.BoolVar(&relative, "tag-relative", false, "file paths should be relative to the directory containing the tag file.")
4445
flag.BoolVar(&listLangs, "list-languages", false, "list supported languages.")
46+
flag.StringVar(&fields, "fields", "", "include selected extension fields (only +l).")
4547

4648
flag.Usage = func() {
4749
fmt.Fprintf(os.Stderr, "gotags version %s\n\n", Version)
@@ -164,6 +166,13 @@ func main() {
164166
}
165167
}
166168

169+
fieldSet, err := parseFields(fields)
170+
if err != nil {
171+
fmt.Fprintf(os.Stderr, "%s\n\n", err)
172+
flag.Usage()
173+
os.Exit(1)
174+
}
175+
167176
tags := []Tag{}
168177
for _, file := range files {
169178
ts, err := Parse(file, relative, basedir)
@@ -178,6 +187,9 @@ func main() {
178187

179188
output := createMetaTags()
180189
for _, tag := range tags {
190+
if fieldSet.Includes(Language) {
191+
tag.Fields[Language] = "Go"
192+
}
181193
output = append(output, tag.String())
182194
}
183195

tag.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const (
2828
ReceiverType TagField = "ctype"
2929
Line TagField = "line"
3030
InterfaceType TagField = "ntype"
31+
Language TagField = "language"
3132
)
3233

3334
// TagType represents the type of a tag in a tag line.

0 commit comments

Comments
 (0)