109 lines
2.2 KiB
Go
109 lines
2.2 KiB
Go
package parser
|
|
|
|
import (
|
|
"complie-erlang/cache"
|
|
"complie-erlang/parser/zm_lib"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
)
|
|
|
|
type ErrCode struct {
|
|
codeMap map[string]bool
|
|
ClientConfig *ClientConfig
|
|
}
|
|
|
|
func NewErrCode(c *ClientConfig) *ErrCode {
|
|
return &ErrCode{
|
|
codeMap: make(map[string]bool),
|
|
ClientConfig: c,
|
|
}
|
|
}
|
|
|
|
func (e *ErrCode) LoadWd() error {
|
|
wdDir, err := zm_lib.FindPathByWd(".")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return e.iterationDir(wdDir)
|
|
}
|
|
|
|
func (e *ErrCode) iterationDir(baseDir string) error {
|
|
|
|
dir, err := os.ReadDir(baseDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, d := range dir {
|
|
if d.IsDir() {
|
|
err = e.iterationDir(filepath.Join(filepath.Join(baseDir, d.Name())))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
path := filepath.Join(baseDir, d.Name())
|
|
|
|
if err = e.loadFile(path); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (e *ErrCode) loadFile(filename string) error {
|
|
bytes, err := os.ReadFile(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 定义正则表达式
|
|
// 注意:由于\?在Go的字符串中是一个特殊字符,我们使用\\?来表示一个问号。
|
|
// 同时,由于双引号在正则表达式中有特殊含义,我们需要使用\\"来表示一个普通双引号。
|
|
// 我们使用非贪婪匹配来确保只匹配到第一个双引号后的内容。
|
|
re := regexp.MustCompile(`(?:\\?\?ThrowErr|throw)\("([^"]+)"\)`)
|
|
|
|
// 查找所有匹配项
|
|
matches := re.FindAllStringSubmatch(string(bytes), -1)
|
|
|
|
// 提取并打印双引号内的内容
|
|
for _, match := range matches {
|
|
// match[0] 是整个匹配的字符串,match[1] 是第一个括号内的匹配(即双引号内的内容)
|
|
if e.codeMap[match[1]] {
|
|
continue
|
|
}
|
|
e.codeMap[match[1]] = true
|
|
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e *ErrCode) PrintErrCode(c cache.Cache) error {
|
|
fmt.Println(">")
|
|
|
|
for key := range e.codeMap {
|
|
line := e.ClientConfig.LineByKey(key)
|
|
if line == nil {
|
|
val, is := c.Get(key)
|
|
if is {
|
|
fmt.Printf(" %s: %v[cache] \n", key, val)
|
|
} else {
|
|
fmt.Printf(" %s: %v \n", key, nil)
|
|
}
|
|
|
|
} else {
|
|
_, s, err := e.ClientConfig.ValueByLine(line, "UserCN")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf(" %s: %s \n", key, s)
|
|
}
|
|
}
|
|
|
|
fmt.Println()
|
|
|
|
return nil
|
|
}
|