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  }