func (gofile *File) readStruct(r *kmgGoReader.Reader) StructType { // 仅跳过 r.ReadAllSpace() b := r.ReadByte() if b != '{' { panic(fmt.Errorf("%s unexcept %s", r.GetFileLineInfo(), string(rune(b)))) } lastReadBuf := []bytesAndType{} var lastTag []byte out := StructType{} for { r.ReadAllSpaceWithoutLineBreak() b := r.ReadByte() if b == '}' { return out } else if b == '"' || b == '\'' || b == '`' { r.UnreadByte() lastTag = MustReadGoString(r) } else if b == ',' { continue } else if b == '\n' { if len(lastReadBuf) == 0 { continue } else if len(lastReadBuf) == 1 { typ := lastReadBuf[0].typ name := getTypeStructAnonymousName(typ) out.Field = append(out.Field, StructField{ Name: name, Elem: typ, IsAnonymousField: true, Tag: string(lastTag), }) lastReadBuf = []bytesAndType{} } else if len(lastReadBuf) >= 2 { typ := lastReadBuf[len(lastReadBuf)-1].typ for i := range lastReadBuf[:len(lastReadBuf)-1] { out.Field = append(out.Field, StructField{ Name: string(lastReadBuf[i].originByte), Elem: typ, IsAnonymousField: false, Tag: string(lastTag), }) } lastReadBuf = []bytesAndType{} } } else { r.UnreadByte() startPos := r.Pos() typ := gofile.readType(r) lastReadBuf = append(lastReadBuf, bytesAndType{ originByte: r.BufToCurrent(startPos), typ: typ, }) } } }
func readMatchChar(r *kmgGoReader.Reader, starter byte, ender byte) []byte { startPos := r.Pos() level := 1 for { if r.IsEof() { panic(r.GetFileLineInfo() + " unexcept EOF") } b := r.ReadByte() if b == '"' || b == '`' { r.UnreadByte() MustReadGoString(r) } else if b == '\'' { r.UnreadByte() mustReadGoChar(r) } else if b == starter { level++ } else if b == ender { level-- if level == 0 { return r.BufToCurrent(startPos) } } } }
func (gofile *File) readParameters(r *kmgGoReader.Reader) (output []FuncParameter) { b := r.ReadByte() if b != '(' { // 处理 int 这种类型 r.UnreadByte() return []FuncParameter{ { Type: gofile.readType(r), }, } } parameterPartList := []*astParameterPart{} lastPart := &astParameterPart{} for { r.ReadAllSpace() b := r.ReadByte() if b == ')' || b == ',' { if lastPart.partList[0].originByte != nil { parameterPartList = append(parameterPartList, lastPart) lastPart = &astParameterPart{} } if b == ')' { break } if b == ',' { continue } } r.UnreadByte() if r.IsMatchAfter([]byte("...")) { r.MustReadMatch([]byte("...")) lastPart.isVariadic = true } startPos := r.Pos() typ := gofile.readType(r) buf := r.BufToCurrent(startPos) //fmt.Println(string(buf)) hasSet := false for i := range lastPart.partList { if lastPart.partList[i].originByte == nil { lastPart.partList[i].originByte = buf lastPart.partList[i].typ = typ hasSet = true break } } if !hasSet { panic(r.GetFileLineInfo() + " unexcept func parameterList.") } } output = make([]FuncParameter, len(parameterPartList)) onlyHavePart1Num := 0 for i := range parameterPartList { if parameterPartList[i].partList[1].originByte == nil { onlyHavePart1Num++ } } //重新分析出函数参数来. 处理(int,int) 这种类型. if onlyHavePart1Num == len(parameterPartList) { for i := range parameterPartList { output[i].Type = parameterPartList[i].partList[0].typ output[i].IsVariadic = parameterPartList[i].isVariadic } return output } // 处理 (x,y int) (x int,y int) 这种类型. for i, parameterPart := range parameterPartList { output[i].Name = string(parameterPart.partList[0].originByte) if parameterPart.partList[1].typ != nil { output[i].Type = parameterPart.partList[1].typ } output[i].IsVariadic = parameterPart.isVariadic } // 补全 (x,y int) 里面 x的类型. for i := range parameterPartList { if output[i].Type == nil { for j := i + 1; j < len(parameterPartList); j++ { if output[j].Type != nil { output[i].Type = output[j].Type } } } } return output }