Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add trimmed-structure counter for trimmer tool #148

Merged
merged 4 commits into from
Nov 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions generator/golang/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,12 @@ func (g *GoBackend) Generate(req *plugin.Request, log backend.LogFunc) *plugin.R
g.log = log
g.prepareUtilities()
if g.utils.Features().TrimIDL {
err := trim.TrimAST(&trim.TrimASTArg{Ast: req.AST, TrimMethods: nil, Preserve: nil})
g.log.Warn("You Are Using IDL Trimmer")
structureTrimmed, fieldTrimmed, err := trim.TrimAST(&trim.TrimASTArg{Ast: req.AST, TrimMethods: nil, Preserve: nil})
if err != nil {
g.log.Warn("trim error:", err.Error())
}
g.log.Warn("You Are Using IDL Trimmer")
g.log.Warn(fmt.Sprintf("removed %d unused structures with %d fields", structureTrimmed, fieldTrimmed))
}
g.prepareTemplates()
g.fillRequisitions()
Expand Down
25 changes: 23 additions & 2 deletions tool/trimmer/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,13 @@ func main() {
_, err = checker.CheckAll(ast)
check(err)
check(semantic.ResolveSymbols(ast))
structs, fields := countStructs(ast)

// trim ast
check(trim.TrimAST(&trim.TrimASTArg{
_, _, err = trim.TrimAST(&trim.TrimASTArg{
Ast: ast, TrimMethods: a.Methods, Preserve: preserveInput,
}))
})
check(err)

// dump the trimmed ast to idl
idl, err := dump.DumpIDL(ast)
Expand Down Expand Up @@ -123,6 +125,8 @@ func main() {
recurseDump(ast, a.Recurse, a.OutputFile)
} else {
check(writeStringToFile(a.OutputFile, idl))
structsNew, fieldsNew := countStructs(ast)
fmt.Printf("removed %d unused structures with %d fields\n", structs-structsNew, fields-fieldsNew)
}
println("success, dump to", a.OutputFile)

Expand Down Expand Up @@ -164,3 +168,20 @@ func writeStringToFile(filename, content string) error {
}
return nil
}

func countStructs(ast *parser.Thrift) (structs, fields int) {
structs += len(ast.Structs) + len(ast.Includes) + len(ast.Services) + len(ast.Unions) + len(ast.Exceptions)
for _, v := range ast.Structs {
fields += len(v.Fields)
}
for _, v := range ast.Services {
fields += len(v.Functions)
}
for _, v := range ast.Unions {
fields += len(v.Fields)
}
for _, v := range ast.Exceptions {
fields += len(v.Fields)
}
return structs, fields
}
6 changes: 3 additions & 3 deletions tool/trimmer/trim/mark.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ func (t *Trimmer) markService(svc *parser.Service, ast *parser.Thrift, filename
return
}

if t.trimMethods == nil {
if len(t.trimMethods) == 0 {
t.marks[filename][svc] = true
}

for _, function := range svc.Functions {
if t.trimMethods != nil {
if len(t.trimMethods) != 0 {
funcName := svc.Name + "." + function.Name
for i, method := range t.trimMethods {
if ok, _ := method.MatchString(funcName); ok {
Expand All @@ -55,7 +55,7 @@ func (t *Trimmer) markService(svc *parser.Service, ast *parser.Thrift, filename
t.markFunction(function, ast, filename)
}

if t.trimMethods != nil && (svc.Extends != "" || svc.Reference != nil) {
if len(t.trimMethods) != 0 && (svc.Extends != "" || svc.Reference != nil) {
t.traceExtendMethod(svc, svc, ast, filename)
}

Expand Down
8 changes: 7 additions & 1 deletion tool/trimmer/trim/traversal.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ func (t *Trimmer) traversal(ast *parser.Thrift, filename string) {
for i := range ast.Structs {
if t.marks[filename][ast.Structs[i]] || t.checkPreserve(ast.Structs[i]) {
listStruct = append(listStruct, ast.Structs[i])
t.fieldsTrimmed -= len(ast.Structs[i].Fields)
}
}
ast.Structs = listStruct
Expand All @@ -42,6 +43,7 @@ func (t *Trimmer) traversal(ast *parser.Thrift, filename string) {
for i := range ast.Unions {
if t.marks[filename][ast.Unions[i]] || t.checkPreserve(ast.Unions[i]) {
listUnion = append(listUnion, ast.Unions[i])
t.fieldsTrimmed -= len(ast.Unions[i].Fields)
}
}
ast.Unions = listUnion
Expand All @@ -50,14 +52,15 @@ func (t *Trimmer) traversal(ast *parser.Thrift, filename string) {
for i := range ast.Exceptions {
if t.marks[filename][ast.Exceptions[i]] || t.checkPreserve(ast.Exceptions[i]) {
listException = append(listException, ast.Exceptions[i])
t.fieldsTrimmed -= len(ast.Exceptions[i].Fields)
}
}
ast.Exceptions = listException

var listService []*parser.Service
for i := range ast.Services {
if t.marks[filename][ast.Services[i]] {
if t.trimMethods != nil {
if len(t.trimMethods) != 0 {
var trimmedMethods []*parser.Function
for j := range ast.Services[i].Functions {
if t.marks[filename][ast.Services[i].Functions[j]] {
Expand All @@ -67,11 +70,14 @@ func (t *Trimmer) traversal(ast *parser.Thrift, filename string) {
ast.Services[i].Functions = trimmedMethods
}
listService = append(listService, ast.Services[i])
t.fieldsTrimmed -= len(ast.Services[i].Functions)
}
}
ast.Services = listService
ast.Name2Category = nil
for _, inc := range ast.Includes {
inc.Used = nil
}

t.structsTrimmed -= len(ast.Structs) + len(ast.Includes) + len(ast.Services) + len(ast.Unions) + len(ast.Exceptions)
}
31 changes: 27 additions & 4 deletions tool/trimmer/trim/trimmer.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ type Trimmer struct {
preserveRegex *regexp.Regexp
forceTrimming bool
preservedStructs []string
structsTrimmed int
fieldsTrimmed int
}

type TrimASTArg struct {
Expand All @@ -48,7 +50,7 @@ type TrimASTArg struct {
}

// TrimAST parse the cfg and trim the single AST
func TrimAST(arg *TrimASTArg) error {
func TrimAST(arg *TrimASTArg) (structureTrimmed int, fieldTrimmed int, err error) {
var preservedStructs []string
if wd, err := os.Getwd(); err == nil {
cfg := ParseYamlConfig(wd)
Expand All @@ -71,10 +73,11 @@ func TrimAST(arg *TrimASTArg) error {
}

// doTrimAST trim the single AST, pass method names if -m specified
func doTrimAST(ast *parser.Thrift, trimMethods []string, forceTrimming bool, preservedStructs []string) error {
func doTrimAST(ast *parser.Thrift, trimMethods []string, forceTrimming bool, preservedStructs []string) (
structureTrimmed int, fieldTrimmed int, err error) {
trimmer, err := newTrimmer(nil, "")
if err != nil {
return err
return 0, 0, err
}
trimmer.asts[ast.Filename] = ast
trimmer.trimMethods = make([]*regexp2.Regexp, len(trimMethods))
Expand All @@ -94,6 +97,7 @@ func doTrimAST(ast *parser.Thrift, trimMethods []string, forceTrimming bool, pre
check(err)
}
trimmer.preservedStructs = preservedStructs
trimmer.countStructs(ast)
trimmer.markAST(ast)
trimmer.traversal(ast, ast.Filename)
if path := parser.CircleDetect(ast); len(path) > 0 {
Expand All @@ -111,7 +115,7 @@ func doTrimAST(ast *parser.Thrift, trimMethods []string, forceTrimming bool, pre
}
}

return nil
return trimmer.structsTrimmed, trimmer.fieldsTrimmed, nil
}

// Trim to trim thrift files to remove unused fields
Expand Down Expand Up @@ -140,6 +144,25 @@ func Trim(files, includeDir []string, outDir string) error {
return nil
}

func (t *Trimmer) countStructs(ast *parser.Thrift) {
t.structsTrimmed += len(ast.Structs) + len(ast.Includes) + len(ast.Services) + len(ast.Unions) + len(ast.Exceptions)
for _, v := range ast.Structs {
t.fieldsTrimmed += len(v.Fields)
}
for _, v := range ast.Services {
t.fieldsTrimmed += len(v.Functions)
}
for _, v := range ast.Unions {
t.fieldsTrimmed += len(v.Fields)
}
for _, v := range ast.Exceptions {
t.fieldsTrimmed += len(v.Fields)
}
for _, v := range ast.Includes {
t.countStructs(v.Reference)
}
}

// make and init a trimmer with related parameters
func newTrimmer(files []string, outDir string) (*Trimmer, error) {
trimmer := &Trimmer{
Expand Down
11 changes: 3 additions & 8 deletions tool/trimmer/trim/trimmer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,8 @@ import (
"github.com/cloudwego/thriftgo/semantic"
)

func TestTrimmer(t *testing.T) {
t.Run("trim AST", testSingleFile)
// t.Run("trim AST - test many", testMany)
}

// test single file ast trimming
func testSingleFile(t *testing.T) {
func TestSingleFile(t *testing.T) {
trimmer, err := newTrimmer(nil, "")
test.Assert(t, err == nil, err)
filename := filepath.Join("..", "test_cases", "sample1.thrift")
Expand Down Expand Up @@ -101,7 +96,7 @@ func TestTrimMethod(t *testing.T) {
methods := make([]string, 1)
methods[0] = "func1"

err = TrimAST(&TrimASTArg{
_, _, err = TrimAST(&TrimASTArg{
Ast: ast,
TrimMethods: methods,
Preserve: nil,
Expand All @@ -124,7 +119,7 @@ func TestPreserve(t *testing.T) {

preserve := false

err = TrimAST(&TrimASTArg{
_, _, err = TrimAST(&TrimASTArg{
Ast: ast,
TrimMethods: nil,
Preserve: &preserve,
Expand Down