Skip to content

Commit 79876a7

Browse files
committed
fix: issues 6
1 parent 9e1a95f commit 79876a7

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed

tagalign.go

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ const (
2929
StrictStyle
3030
)
3131

32+
const (
33+
errTagValueSyntax = "bad syntax for struct tag value"
34+
)
35+
3236
func NewAnalyzer(options ...Option) *analysis.Analyzer {
3337
return &analysis.Analyzer{
3438
Name: "tagalign",
@@ -207,19 +211,25 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
207211
}
208212
uniqueKeys = append(uniqueKeys, k)
209213
}
214+
mark := make(map[int]struct{})
210215

211216
for i, field := range fields {
212-
offsets[i] = pass.Fset.Position(field.Tag.Pos()).Column
217+
column := pass.Fset.Position(field.Tag.Pos()).Column - 1
213218
tag, err := strconv.Unquote(field.Tag.Value)
214219
if err != nil {
215-
break
220+
mark[i] = struct{}{}
221+
w.report(pass, field, column, errTagValueSyntax, field.Tag.Value)
222+
continue
216223
}
217224

218225
tags, err := structtag.Parse(tag)
219226
if err != nil {
220-
break
227+
mark[i] = struct{}{}
228+
w.report(pass, field, column, err.Error(), field.Tag.Value)
229+
continue
221230
}
222231

232+
offsets = append(offsets, column)
223233
maxTagNum = max(maxTagNum, tags.Len())
224234

225235
if w.sort {
@@ -236,6 +246,17 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
236246
tagsGroup = append(tagsGroup, tags.Tags())
237247
}
238248

249+
offset := 0
250+
for i := range fields {
251+
if _, exist := mark[i]; exist {
252+
continue
253+
}
254+
255+
fields[offset] = fields[i]
256+
offset++
257+
}
258+
fields = fields[:offset]
259+
239260
if w.sort && StrictStyle == w.style {
240261
sortAllKeys(w.fixedTagOrder, uniqueKeys)
241262
maxTagNum = len(uniqueKeys)
@@ -325,19 +346,22 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
325346

326347
msg := "tag is not aligned, should be: " + unquoteTag
327348

328-
w.report(pass, field, offsets[i]-1, msg, newTagValue)
349+
w.report(pass, field, offsets[i], msg, newTagValue)
329350
}
330351
}
331352

332353
// process single fields
333354
for _, field := range w.singleFields {
355+
column := pass.Fset.Position(field.Tag.Pos()).Column - 1
334356
tag, err := strconv.Unquote(field.Tag.Value)
335357
if err != nil {
358+
w.report(pass, field, column, errTagValueSyntax, field.Tag.Value)
336359
continue
337360
}
338361

339362
tags, err := structtag.Parse(tag)
340363
if err != nil {
364+
w.report(pass, field, column, err.Error(), field.Tag.Value)
341365
continue
342366
}
343367
originalTags := append([]*structtag.Tag(nil), tags.Tags()...)
@@ -353,7 +377,7 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
353377

354378
msg := "tag is not aligned , should be: " + tags.String()
355379

356-
w.report(pass, field, pass.Fset.Position(field.Tag.Pos()).Column-1, msg, newTagValue)
380+
w.report(pass, field, column, msg, newTagValue)
357381
}
358382
}
359383

tagalign_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ func Test_alignAndSortWithOrder(t *testing.T) {
3939
assert.NoError(t, err)
4040
analysistest.Run(t, sort, a)
4141
}
42+
4243
func TestSprintf(t *testing.T) {
4344
format := alignFormat(20)
4445
assert.Equal(t, "%-20s", format)
@@ -72,3 +73,11 @@ func Test_alignSingleField(t *testing.T) {
7273
assert.NoError(t, err)
7374
analysistest.Run(t, unsort, a)
7475
}
76+
77+
func Test_issues6(t *testing.T) {
78+
// only align
79+
a := NewAnalyzer()
80+
unsort, err := filepath.Abs("testdata/issues6")
81+
assert.NoError(t, err)
82+
analysistest.Run(t, unsort, a)
83+
}

testdata/issues6/example.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package issues6
2+
3+
type FooBar struct {
4+
Foo int `json: "foo" validate:"required"` // want `bad syntax for struct tag value`
5+
Bar string `json:bar` // want `bad syntax for struct tag value`
6+
FooFoo int8 `json:"foo_foo" validate:"required"`
7+
BarBar int `json:"bar_bar" validate:"required"`
8+
}

0 commit comments

Comments
 (0)