Program (script) @3:1
├─ FunctionDeclaration "basic_with" @3:1
│  ├─ parameters
│  │  └─ Identifier "obj" [argument:0] @3:21
│  └─ body
│     └─ FunctionBody @4:5
│        ├─ VariableDeclaration (let) @4:5
│        │  └─ VariableDeclarator @4:5
│        │     ├─ Identifier "x" (let) @4:9
│        │     └─ NumericLiteral 1 @4:13
│        └─ WithStatement @5:5
│           ├─ object
│           │  └─ Identifier "obj" [argument:0] @5:11
│           └─ body
│              └─ BlockStatement @5:16
│                 └─ ExpressionStatement @6:9
│                    └─ Identifier "x" (let) @6:9
├─ FunctionDeclaration "var_in_with" @11:1
│  ├─ parameters
│  │  └─ Identifier "obj" [argument:0] @11:22
│  └─ body
│     └─ FunctionBody @12:5
│        ├─ WithStatement @12:5
│        │  ├─ object
│        │  │  └─ Identifier "obj" [argument:0] @12:11
│        │  └─ body
│        │     └─ BlockStatement @12:16
│        │        └─ VariableDeclaration (var) @13:9
│        │           └─ VariableDeclarator @13:9
│        │              ├─ Identifier "y" (var) @13:13
│        │              └─ NumericLiteral 2 @13:17
│        └─ ReturnStatement @15:5
│           └─ Identifier "y" @15:12
├─ FunctionDeclaration "nested_in_with" @19:1
│  ├─ parameters
│  │  └─ Identifier "obj" [argument:0] @19:25
│  └─ body
│     └─ FunctionBody @20:5
│        ├─ VariableDeclaration (let) @20:5
│        │  └─ VariableDeclarator @20:5
│        │     ├─ Identifier "z" (let) @20:9
│        │     └─ NumericLiteral 10 @20:13
│        └─ WithStatement @21:5
│           ├─ object
│           │  └─ Identifier "obj" [argument:0] @21:11
│           └─ body
│              └─ BlockStatement @21:16
│                 └─ ExpressionStatement @22:9
│                    └─ FunctionExpression "" @22:10
│                       └─ body
│                          └─ FunctionBody @23:13
│                             └─ ReturnStatement @23:13
│                                └─ Identifier "z" (let) @23:20
└─ FunctionDeclaration "with_and_eval" [direct-eval] [uses-this] [might-need-arguments] @29:1
   ├─ parameters
   │  └─ Identifier "obj" @29:24
   └─ body
      └─ FunctionBody @30:5
         ├─ VariableDeclaration (let) @30:5
         │  └─ VariableDeclarator @30:5
         │     ├─ Identifier "a" (let) @30:9
         │     └─ NumericLiteral 1 @30:13
         └─ WithStatement @31:5
            ├─ object
            │  └─ Identifier "obj" @31:11
            └─ body
               └─ BlockStatement @31:16
                  ├─ ExpressionStatement @32:9
                  │  └─ CallExpression @32:13
                  │     ├─ Identifier "eval" [in-eval-scope] @32:9
                  │     └─ StringLiteral "" @32:16
                  └─ ExpressionStatement @33:9
                     └─ Identifier "a" (let) [in-eval-scope] @33:9
