code: func parseAssignmentRHS(rhs syntax.Expr) Node {
  	// <var> = <literal>.
  	if literal := matchSingleLiteral(rhs); literal != nil {
  		return &Var{Value: literal}
  	}
  
  	// <var> = <var>[.<field>]*.
  	if path := matchRefPath(rhs); path != nil {
  		return &Reference{Path: path}
  	}
  
  	// <var> = <fn>(...).
  	if fn, args := matchSimpleCall(rhs); len(fn) != 0 {
  		// Pick all 'k=v' pairs from args and parse them as assignments.
  		var nodes []Node
  		for _, arg := range args {
  			if lhs, rhs := matchEqExpr(arg); lhs != "" {
  				if n := parseAssignmentRHS(rhs); n != nil {
  					n.populateFromAST(lhs, arg)
  					nodes = append(nodes, n)
  				}
  			}
  		}
  
  		// <var> = struct(...).
  		if len(fn) == 1 && fn[0] == "struct" {
  			return &Namespace{Nodes: nodes}
  		}
  
  		// <var> = ns.ns.func(arg1=..., arg2=...).
  		return &Invocation{Func: fn, Args: nodes}
  	}
  
  	// <var> = <expr>.
  	return &Var{Value: Ellipsis("...")}
  }
docs: // parseAssignmentRHS parses RHS of statements like "<var> = <expr>".
  //
  // Name of the returned node and Star/End/Comments should be populated by the
  // caller.
  //
  // Only the following forms are recognized:
  //   Var: <var> = <literal>|<complex expr>
  //   Reference: <var> = <var>[.<field>]*
  //   Namespace: <var> = struct(...)