in tools/dubbogo-cli/generator/sample/hessian/generator.go [84:154]
func scanFile(filePath string) (file *fileInfo, err error) {
var f *os.File
f, err = os.Open(filePath)
if err != nil {
return
}
defer func(f *os.File) {
_ = f.Close()
}(f)
buf := bufio.NewReader(f)
file = &fileInfo{
path: filePath,
}
bufferSize := 0
buffer := make([]byte, bufferSize)
stack := make([][]byte, 0)
var line []byte
var lineSize int
for {
line, _, err = buf.ReadLine()
if err == io.EOF {
err = nil
break
}
bufferSize = len(buffer)
lineSize = len(line)
if file.hasInitFunc && lineSize > 0 && line[0] == funcEnd {
file.initFuncEndIndex = bufferSize + 1 // 检测初始化函数结束位
}
buffer = append(buffer, line...)
buffer = append(buffer, newLine)
if passed, _ := regexp.Match(PackageRegexp, line); passed { // 检测package位置
file.packageStartIndex = bufferSize // 检测初始化函数初始位
file.packageEndIndex = bufferSize + lineSize + 1 // 检测初始化函数初始位
continue
}
if passed, _ := regexp.Match(InitFunctionRegexp, line); passed { // 检测初始化函数
file.hasInitFunc = true
file.initFuncStartIndex = bufferSize // 检测初始化函数初始位
file.initFuncStatementStartIndex = bufferSize + lineSize // 初始化函数方法体初始位
continue
}
if !file.hasHessianImport {
r, _ := regexp.Compile(HessianImportRegexp)
rIndexList := r.FindIndex(line)
if len(rIndexList) > 0 { // 检测是否已导入hessian2包
checkStatement := line[:rIndexList[0]]
passed, _ := regexp.Match(LineCommentRegexp, checkStatement) // 是否被行注释
file.hasHessianImport = !passed
continue
}
}
if passed, _ := regexp.Match(HessianPOJORegexp, line); !passed { // 校验是否为Hessian.POJO实现类
continue
}
structName := getStructName(line)
if len(structName) != 0 {
stack = append(stack, structName)
}
}
file.buffer = buffer
file.hessianPOJOList = stack
return
}