func scanFile()

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
}