github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgGoSource/kmgGoParser/goSourceRemoveComment.go (about)

     1  package kmgGoParser
     2  
     3  import (
     4  	"bytes"
     5  	"github.com/bronze1man/kmg/kmgGoSource/kmgGoReader"
     6  )
     7  
     8  type noGrowBuf struct {
     9  	buf []byte
    10  	pos int
    11  }
    12  
    13  func (buf *noGrowBuf) WriteByte(b byte) {
    14  	buf.buf[buf.pos] = b
    15  	buf.pos++
    16  }
    17  func (buf *noGrowBuf) Write(b []byte) {
    18  	copy(buf.buf[buf.pos:], b)
    19  	buf.pos += len(b)
    20  }
    21  func goSourceRemoveComment(in []byte, filePos *kmgGoReader.FilePos) (out []byte) {
    22  	r := kmgGoReader.NewReader(in, filePos)
    23  	buf := &noGrowBuf{
    24  		buf: make([]byte, len(in)),
    25  		pos: 0,
    26  	}
    27  	for {
    28  		if r.IsEof() {
    29  			return buf.buf
    30  		}
    31  		b := r.ReadByte()
    32  		switch b {
    33  		case '/':
    34  			r.UnreadByte()
    35  			if r.IsMatchAfter(tokenSlashStar) {
    36  				thisBuf := r.ReadUntilString(tokenStarSlash)
    37  				// 保留换行
    38  				commentReader := kmgGoReader.NewReader(thisBuf, nil)
    39  				for {
    40  					if commentReader.IsEof() {
    41  						break
    42  					}
    43  					b := commentReader.ReadByte()
    44  					if b == '\n' {
    45  						buf.WriteByte('\n')
    46  					} else {
    47  						buf.WriteByte(' ')
    48  					}
    49  				}
    50  			} else if r.IsMatchAfter(tokenDoubleSlash) {
    51  				thisBuf := r.ReadUntilByte('\n')
    52  				buf.Write(bytes.Repeat([]byte{' '}, len(thisBuf)-1))
    53  				buf.WriteByte('\n')
    54  			} else {
    55  				buf.WriteByte(r.ReadByte())
    56  			}
    57  		case '"', '`':
    58  			r.UnreadByte()
    59  			startPos := r.Pos()
    60  			//fmt.Println("string start "+r.GetFileLineInfo())
    61  			MustReadGoString(r)
    62  			buf.Write(r.BufToCurrent(startPos))
    63  		case '\'':
    64  			r.UnreadByte()
    65  			startPos := r.Pos()
    66  			mustReadGoChar(r)
    67  			buf.Write(r.BufToCurrent(startPos))
    68  		default:
    69  			buf.WriteByte(b)
    70  		}
    71  		/*
    72  			switch {
    73  			case r.IsEof():
    74  				return outBuf.Bytes()
    75  			case r.IsMatchAfter(tokenSlashStar):
    76  				thisBuf := r.ReadUntilString(tokenStarSlash)
    77  				// 保留换行
    78  				commentReader := kmgGoReader.NewReader(thisBuf, nil)
    79  				for {
    80  					if commentReader.IsEof() {
    81  						break
    82  					}
    83  					b := commentReader.ReadByte()
    84  					if b == '\n' {
    85  						outBuf.WriteByte('\n')
    86  					} else {
    87  						outBuf.WriteByte(' ')
    88  					}
    89  				}
    90  			case r.IsMatchAfter(tokenDoubleSlash):
    91  				thisBuf := r.ReadUntilByte('\n')
    92  				outBuf.Write(bytes.Repeat([]byte{' '}, len(thisBuf)-1))
    93  				outBuf.WriteByte('\n')
    94  			case r.IsMatchAfter(tokenDoubleQuate) || r.IsMatchAfter(tokenGraveAccent):
    95  				startPos := r.Pos()
    96  				//fmt.Println("string start "+r.GetFileLineInfo())
    97  				mustReadGoString(r)
    98  				outBuf.Write(r.BufToCurrent(startPos))
    99  			case r.IsMatchAfter(tokenSingleQuate):
   100  				startPos := r.Pos()
   101  				mustReadGoChar(r)
   102  				outBuf.Write(r.BufToCurrent(startPos))
   103  			default:
   104  				outBuf.WriteByte(r.ReadByte())
   105  			}
   106  		*/
   107  	}
   108  }