// 分析 path 指向的文件,并将内容写入到 docs 中。 func parseFile(docs *doc.Doc, path string, blocks []*block, synerrLog *log.Logger) { data, err := ioutil.ReadFile(path) if err != nil && synerrLog != nil { synerrLog.Println(&app.SyntaxError{Message: err.Error(), File: path}) return } l := &lexer{data: data} var block *block wg := sync.WaitGroup{} defer wg.Wait() for { if l.atEOF() { return } if block == nil { block = l.block(blocks) if block == nil { // 没有匹配的 block 了 return } } ln := l.lineNumber() + 1 // 记录当前的行号,顺便调整为行号起始行号为 1 rs, ok := block.end(l) if !ok && synerrLog != nil { synerrLog.Println(&app.SyntaxError{Line: ln, File: path, Message: "找不到结束标记"}) return } if block.Type == blockTypeString { block = nil continue } block = nil wg.Add(1) go func(rs []rune, ln int) { if err := docs.Scan(rs); err != nil && synerrLog != nil { err.Line += ln err.File = path synerrLog.Println(err) } wg.Done() }(rs, ln) } // end for }
// 分析 path 指向的文件,并将内容写入到 docs 中。 func parseFile(docs *doc.Doc, path string, blocks []blocker, synerrLog *log.Logger) { data, err := ioutil.ReadFile(path) if err != nil && synerrLog != nil { synerrLog.Println(&app.SyntaxError{Message: err.Error(), File: path}) return } l := &lexer{data: data} var block blocker wg := sync.WaitGroup{} defer wg.Wait() for { if l.atEOF() { return } if block == nil { block = l.block(blocks) if block == nil { // 没有匹配的 block 了 return } } ln := l.lineNumber() + 1 // 记录当前的行号,顺便调整为行号起始行号为 1 rs, ok := block.EndFunc(l) if !ok && synerrLog != nil { synerrLog.Println(&app.SyntaxError{Line: ln, File: path, Message: locale.Sprintf(locale.ErrNotFoundEndFlag)}) return } block = nil if len(rs) < miniSize { continue } wg.Add(1) go func(rs []rune, ln int) { if err := docs.Scan(rs); err != nil && synerrLog != nil { err.Line += ln err.File = path synerrLog.Println(err) } wg.Done() }(rs, ln) } // end for }