func extractGoType(messages messageMap, fset *token.FileSet, f *ast.File, typ string) error { // for castings calls, err := astutil.Calls(fset, f, typ) if err != nil { return err } for _, c := range calls { if len(c.Args) > 0 { lit, pos := astutil.StringLiteral(fset, c.Args[0]) if pos == nil { p := fset.Position(c.Pos()) log.Debugf("Skipping cast to %s (%v) - not a literal", typ, p) continue } comment := comments(fset, f, pos) if err := messages.AddString(&astutil.String{Value: lit, Position: pos}, comment); err != nil { return err } } } strings, err := astutil.Strings(fset, f, typ) if err != nil { return err } for _, s := range strings { comment := comments(fset, f, s.Position) if err := messages.AddString(s, comment); err != nil { return err } } return nil }
func extractGoFunc(messages messageMap, fset *token.FileSet, f *ast.File, fn *Function) error { calls, err := astutil.Calls(fset, f, fn.Name) if err != nil { return err } n := fn.Start if fn.Context { n++ } var message *Message var position *token.Position for _, c := range calls { if fn.Plural { if len(c.Args) < n+3 { log.Debugf("Skipping plural function %s (%v) - not enough arguments", astutil.Ident(c.Fun), fset.Position(c.Pos())) continue } slit, spos := astutil.StringLiteral(fset, c.Args[n]) if slit == "" || spos == nil { log.Debugf("Skipping first argument to plural function %s (%v) - not a literal", astutil.Ident(c.Fun), fset.Position(c.Pos())) continue } plit, ppos := astutil.StringLiteral(fset, c.Args[n+1]) if plit == "" || ppos == nil { log.Debugf("Skipping second argument to plural function %s (%v) - not a literal", astutil.Ident(c.Fun), fset.Position(c.Pos())) continue } message = &Message{ Singular: slit, Plural: plit, } position = spos } else { if len(c.Args) < n+1 { log.Debugf("Skipping singular function %s (%v) - not enough arguments", astutil.Ident(c.Fun), fset.Position(c.Pos())) continue } lit, pos := astutil.StringLiteral(fset, c.Args[n]) if lit == "" || pos == nil { log.Debugf("Skipping argument to singular function %s (%v) - not a literal", astutil.Ident(c.Fun), fset.Position(c.Pos())) continue } message = &Message{ Singular: lit, } position = pos } if message != nil && position != nil { if fn.Context { ctx, cpos := astutil.StringLiteral(fset, c.Args[fn.Start]) if ctx == "" || cpos == nil { log.Debugf("Skipping argument to context function %s (%v) - empty context", astutil.Ident(c.Fun), fset.Position(c.Pos())) continue } message.Context = ctx } if err := messages.Add(message, position, comments(fset, f, position)); err != nil { return err } } } return nil }