func makeCallExpr(name string, params *st.SymbolTable, pointerSymbols map[st.Symbol]int, pos token.Pos, recvSym *st.VariableSymbol, pack *st.Package, filename string) (*ast.CallExpr, int) { var Fun ast.Expr if recvSym != nil { x := ast.NewIdent(recvSym.Name()) x.NamePos = pos Fun = &ast.SelectorExpr{x, ast.NewIdent(name)} } else { x := ast.NewIdent(name) x.NamePos = pos Fun = x } l, _ := utils.GetNodeLength(Fun) l += 2 args, i := make([]ast.Expr, params.Count()), 0 params.ForEachNoLock(func(sym st.Symbol) { args[i] = sym.ToAstExpr(pack, filename) if depth, ok := pointerSymbols[sym]; ok { for depth > 0 { args[i] = &ast.UnaryExpr{token.NoPos, token.AND, args[i]} depth-- } } ll, _ := utils.GetNodeLength(args[i]) l += ll + 2 i++ }) l -= 2 return &ast.CallExpr{Fun, token.NoPos, args, token.NoPos, pos + token.Pos(l-1)}, l }
func (pp *packageParser) fixTypesInSymbolTable(table *st.SymbolTable) { if table == nil { return } table.ForEachNoLock(func(sym st.Symbol) { // if sym.Name() == "Parser" { // fmt.Printf("horay %T\n", sym) // } if uts, ok := sym.(*st.UnresolvedTypeSymbol); ok { res := pp.resolveType(uts) table.ReplaceSymbol(uts.Name(), res) pp.moveData(res, uts) // fmt.Printf("rewrited %s with %s from %s \n", sym.Name(), res.Name(), res.PackageFrom().AstPackage.Name) pp.fixType(res) } else { //Start recursive walk pp.fixType(sym) } }) }