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 }