github.com/yoheimuta/protolint@v0.49.8-0.20240515023657-4ecaebb7575d/linter/autodisable/commentator.go (about) 1 package autodisable 2 3 import ( 4 "log" 5 6 "github.com/yoheimuta/go-protoparser/v4/parser" 7 "github.com/yoheimuta/protolint/linter/disablerule" 8 "github.com/yoheimuta/protolint/linter/fixer" 9 ) 10 11 type commentator struct { 12 fixing *fixer.BaseFixing 13 ruleID string 14 } 15 16 func newCommentator(filename, ruleID string) (*commentator, error) { 17 f, err := fixer.NewBaseFixing(filename) 18 if err != nil { 19 return nil, err 20 } 21 return &commentator{ 22 fixing: f, 23 ruleID: ruleID, 24 }, nil 25 } 26 27 func (c *commentator) insertNewline(offset int) { 28 comment := disablerule.PrefixDisableNext + " " + c.ruleID 29 30 space := "" 31 pos := offset 32 loop: 33 for i := offset; 0 < i; i-- { 34 ch := c.fixing.Content()[i] 35 switch ch { 36 case ' ', '\t': 37 space += " " 38 case '\n', '\r': 39 break loop 40 default: 41 pos = i 42 space = "" 43 } 44 } 45 c.insert("// "+comment+c.fixing.LineEnding()+space, pos) 46 } 47 48 func (c *commentator) tryMergeInline(inline *parser.Comment) bool { 49 matches := disablerule.ReDisableThis.FindStringIndex(inline.Raw) 50 log.Println(matches) 51 if matches != nil { 52 extracted := inline.Raw[matches[0]:matches[1]] 53 log.Println(extracted) 54 startPos := inline.Meta.Pos.Offset 55 c.fixing.Replace(fixer.TextEdit{ 56 Pos: startPos + matches[0], 57 End: startPos + matches[1] - 1, 58 NewText: []byte(extracted + " " + c.ruleID), 59 }) 60 return true 61 } 62 return false 63 } 64 65 func (c *commentator) insertInline(offset int) { 66 comment := disablerule.PrefixDisableThis + " " + c.ruleID 67 68 pos := offset 69 content := c.fixing.Content() 70 loop: 71 for i := offset; i < len(content); i++ { 72 ch := content[i] 73 switch ch { 74 case ' ', '\t': 75 case '\n', '\r': 76 break loop 77 default: 78 pos = i 79 } 80 } 81 c.insert(" // "+comment, pos+1) 82 } 83 84 func (c *commentator) finalize() error { 85 return c.fixing.Finally() 86 } 87 88 func (c *commentator) insert(text string, pos int) { 89 c.fixing.Replace(fixer.TextEdit{ 90 Pos: pos, 91 End: pos - 1, 92 NewText: []byte(text), 93 }) 94 }