@@ -29,6 +29,10 @@ const (
29
29
StrictStyle
30
30
)
31
31
32
+ const (
33
+ errTagValueSyntax = "bad syntax for struct tag value"
34
+ )
35
+
32
36
func NewAnalyzer (options ... Option ) * analysis.Analyzer {
33
37
return & analysis.Analyzer {
34
38
Name : "tagalign" ,
@@ -207,19 +211,25 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
207
211
}
208
212
uniqueKeys = append (uniqueKeys , k )
209
213
}
214
+ mark := make (map [int ]struct {})
210
215
211
216
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
213
218
tag , err := strconv .Unquote (field .Tag .Value )
214
219
if err != nil {
215
- break
220
+ mark [i ] = struct {}{}
221
+ w .report (pass , field , column , errTagValueSyntax , field .Tag .Value )
222
+ continue
216
223
}
217
224
218
225
tags , err := structtag .Parse (tag )
219
226
if err != nil {
220
- break
227
+ mark [i ] = struct {}{}
228
+ w .report (pass , field , column , err .Error (), field .Tag .Value )
229
+ continue
221
230
}
222
231
232
+ offsets = append (offsets , column )
223
233
maxTagNum = max (maxTagNum , tags .Len ())
224
234
225
235
if w .sort {
@@ -236,6 +246,17 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
236
246
tagsGroup = append (tagsGroup , tags .Tags ())
237
247
}
238
248
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
+
239
260
if w .sort && StrictStyle == w .style {
240
261
sortAllKeys (w .fixedTagOrder , uniqueKeys )
241
262
maxTagNum = len (uniqueKeys )
@@ -325,19 +346,22 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
325
346
326
347
msg := "tag is not aligned, should be: " + unquoteTag
327
348
328
- w .report (pass , field , offsets [i ]- 1 , msg , newTagValue )
349
+ w .report (pass , field , offsets [i ], msg , newTagValue )
329
350
}
330
351
}
331
352
332
353
// process single fields
333
354
for _ , field := range w .singleFields {
355
+ column := pass .Fset .Position (field .Tag .Pos ()).Column - 1
334
356
tag , err := strconv .Unquote (field .Tag .Value )
335
357
if err != nil {
358
+ w .report (pass , field , column , errTagValueSyntax , field .Tag .Value )
336
359
continue
337
360
}
338
361
339
362
tags , err := structtag .Parse (tag )
340
363
if err != nil {
364
+ w .report (pass , field , column , err .Error (), field .Tag .Value )
341
365
continue
342
366
}
343
367
originalTags := append ([]* structtag.Tag (nil ), tags .Tags ()... )
@@ -353,7 +377,7 @@ func (w *Helper) Process(pass *analysis.Pass) { //nolint:gocognit
353
377
354
378
msg := "tag is not aligned , should be: " + tags .String ()
355
379
356
- w .report (pass , field , pass . Fset . Position ( field . Tag . Pos ()). Column - 1 , msg , newTagValue )
380
+ w .report (pass , field , column , msg , newTagValue )
357
381
}
358
382
}
359
383
0 commit comments