(command.CommandList
  children: [
    (C {(Id.KW_Set set)} {(-o)} {(nounset)})
    (C {(Id.KW_Set set)} {(-o)} {(pipefail)})
    (C {(Id.KW_Set set)} {(-o)} {(errexit)})
    (C {(source)} {(test/common.sh)})
    (command.ShFunction
      name: ast
      body: 
        (command.BraceGroup
          children: [
            (C {(bin/osh)} {(-n)} {(-c)} {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:57))})
            (C {(bin/osh)} {(-n)} {(--ast-format)} {(text)} {(-c)} 
              {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:72))}
            )
            (C {(bin/osh)} {(-n)} {(--ast-format)} {(abbrev-html)} {(-c)} 
              {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:87))}
            )
            (C {(bin/osh)} {(-n)} {(--ast-format)} {(html)} {(-c)} 
              {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:102))}
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(bin/osh)} {(-n)} {(--ast-format)} {(oheap)} {(-c)} 
                          {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:124))}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:126)
                    )
                  ]
                  action: [(C {(die)} {(DQ ('Should have failed'))})]
                  spids: [111 128]
                )
              ]
            )
            (C {(local)} {(Id.Lit_VarLike 'ast_bin=') (_tmp/smoke-ast.bin)})
            (command.Simple
              words: [
                {(bin/osh)}
                {(-n)}
                {(--ast-format)}
                {(oheap)}
                {(-c)}
                {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:159))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:162)
                  fd: -1
                  arg_word: {($ Id.VSub_DollarName '$ast_bin')}
                )
              ]
            )
            (C {(ls)} {(-l)} {($ Id.VSub_DollarName '$ast_bin')})
            (C {(hexdump)} {(-C)} {($ Id.VSub_DollarName '$ast_bin')})
          ]
        )
    )
    (command.ShFunction
      name: osh-file
      body: 
        (command.BraceGroup
          children: [
            (C {(echo)} 
              {(Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') 
                (Id.Lit_Equals '=')
              } {(Hello)}
            )
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:207)
                  fd: -1
                  arg_word: {(_tmp/hi.sh)}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:210)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 242
                  stdin_parts: [
                    ('\n')
                    ('echo hi\n')
                    ('echo bye\n')
                    ('\n')
                    ('func() {\n')
                    ('  echo ')
                    (Id.Right_DoubleQuote '"')
                    ('inside func')
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('}\n')
                    ('func 1 2 3\n')
                    ('\n')
                    ("# TODO: Test vars don't persist.\n")
                    ('(echo ')
                    (Id.Right_DoubleQuote '"')
                    ('in subshell')
                    (Id.Right_DoubleQuote '"')
                    ('; echo ')
                    (Id.Right_DoubleQuote '"')
                    (another)
                    (Id.Right_DoubleQuote '"')
                    (')\n')
                    ('\n')
                    ('echo ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:238)
                    )
                    ('(echo ComSub)\n')
                    ('\n')
                  ]
                )
              ]
            )
            (C {($ Id.VSub_DollarName '$OSH')} {(_tmp/hi.sh)})
            (C {(echo)} 
              {(Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') 
                (Id.Lit_Equals '=')
              } {(EMPTY)}
            )
            (C {(touch)} {(_tmp/empty.sh)})
            (C {($ Id.VSub_DollarName '$OSH')} {(_tmp/empty.sh)})
            (C {(echo)} 
              {(Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') 
                (Id.Lit_Equals '=')
              } {(NO)} {(TRAILING)} {(NEWLINE)}
            )
            (command.Simple
              words: [{(echo)} {(-n)} {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:293))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:296)
                  fd: -1
                  arg_word: {(_tmp/no-newline.sh)}
                )
              ]
            )
            (C {($ Id.VSub_DollarName '$OSH')} {(_tmp/no-newline.sh)})
          ]
        )
    )
    (command.ShFunction
      name: osh-stdin
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{($ Id.VSub_DollarName '$OSH')}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:319)
                  fd: -1
                  arg_word: {(_tmp/hi.sh)}
                )
              ]
            )
            (C {(echo)} 
              {(Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') 
                (Id.Lit_Equals '=')
              } {(EMPTY)}
            )
            (command.Simple
              words: [{($ Id.VSub_DollarName '$OSH')}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:339)
                  fd: -1
                  arg_word: {(_tmp/empty.sh)}
                )
              ]
            )
            (C {(echo)} 
              {(Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') (Id.Lit_Equals '=') 
                (Id.Lit_Equals '=')
              } {(NO)} {(TRAILING)} {(NEWLINE)}
            )
            (command.Simple
              words: [{($ Id.VSub_DollarName '$OSH')}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:362)
                  fd: -1
                  arg_word: {(_tmp/no-newline.sh)}
                )
              ]
            )
            (command.Simple
              words: [{($ Id.VSub_DollarName '$OSH')}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:374)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 403
                  stdin_parts: [
                    ('echo ')
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('hi\n')
                    (Id.Right_DoubleQuote '"')
                    ('\n')
                    ('echo ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:384)
                    )
                    ('\n')
                    ('line continuation; echo two\n')
                    ('\n')
                    ('cat <<EOF_INNER\n')
                    ('here doc\n')
                    ('EOF_INNER\n')
                    ('\n')
                    ('echo ')
                    (word_part.EscapedLiteral
                      token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:393)
                    )
                    ('(\n')
                    ('echo command sub\n')
                    (')\n')
                    ('\n')
                    ('func() {\n')
                    ('  echo hi\n')
                    ('}\n')
                    ('\n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: osh-interactive
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:'echo hi' span_id:420))})
                (C {($ Id.VSub_DollarName '$OSH')} {(-i)})
              ]
              negated: F
            )
            (command.Pipeline
              children: [
                (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:exit span_id:434))})
                (C {($ Id.VSub_DollarName '$OSH')} {(-i)})
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: help
      body: 
        (command.BraceGroup
          children: [
            (C {(Id.KW_Set set)} {(Id.Lit_Other '+') (o)} {(errexit)})
            (C {(bin/oil.py)} {(--help)})
            (C {(assert)} {($ Id.VSub_QMark '$?')} {(-eq)} {(0)})
            (C {(bin/oil.py)} {(osh)} {(--help)})
            (C {(assert)} {($ Id.VSub_QMark '$?')} {(-eq)} {(0)})
            (C {(bin/oil.py)} {(oil)} {(--help)})
            (C {(assert)} {($ Id.VSub_QMark '$?')} {(-eq)} {(0)})
            (C {(bin/osh)} {(--help)})
            (C {(assert)} {($ Id.VSub_QMark '$?')} {(-eq)} {(0)})
            (C {(bin/oil)} {(--help)})
            (C {(assert)} {($ Id.VSub_QMark '$?')} {(-eq)} {(0)})
          ]
        )
    )
    (command.ShFunction
      name: _error-case
      body: 
        (command.BraceGroup
          children: [
            (C {(echo)})
            (C {(echo)} {(DQ ($ Id.VSub_At '$@'))})
            (C {(echo)})
            (C {(bin/osh)} {(-c)} {(DQ ($ Id.VSub_At '$@'))})
          ]
        )
    )
    (command.ShFunction
      name: parse-errors
      body: 
        (command.BraceGroup
          children: [
            (C {(Id.KW_Set set)} {(Id.Lit_Other '+') (o)} {(errexit)})
            (C {(_error-case)} {(SQ (Token id:Id.Lit_Chars val:'echo < <<' span_id:603))})
            (C {(_error-case)} {(SQ (Token id:Id.Lit_Chars val:'${foo:}' span_id:610))})
            (C {(_error-case)} {(SQ (Token id:Id.Lit_Chars val:'$(( 1 +  ))' span_id:617))})
            (C {(_error-case)} {(SQ (Token id:Id.Lit_Chars val:'echo $( echo > >>  )' span_id:624))})
          ]
        )
    )
    (command.ShFunction
      name: exit-builtin-interactive
      body: 
        (command.BraceGroup
          children: [
            (C {(Id.KW_Set set)} {(Id.Lit_Other '+') (o)} {(errexit)})
            (command.Pipeline
              children: [
                (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:'echo one; exit 42; echo two' span_id:652))})
                (C {(bin/osh)} {(-i)})
              ]
              negated: F
            )
            (C {(assert)} {($ Id.VSub_QMark '$?')} {(-eq)} {(42)})
          ]
        )
    )
    (C {(readonly)} {(-a)} 
      {(Id.Lit_VarLike 'PASSING=') 
        (sh_array_literal
          left: (Token id:Id.Op_LParen val:'(' span_id:678)
          words: [
            {(ast)}
            {(osh-file)}
            {(osh-stdin)}
            {(osh-interactive)}
            {(exit-builtin-interactive)}
            {(help)}
          ]
        )
      }
    )
    (command.ShFunction
      name: all-passing
      body: 
        (command.BraceGroup
          children: [
            (C {(run-all)} 
              {
                (DQ 
                  (braced_var_sub
                    token: (Token id:Id.VSub_Name val:PASSING span_id:712)
                    bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                  )
                )
              }
            )
          ]
        )
    )
    (C {(DQ ($ Id.VSub_At '$@'))})
  ]
)