Program (script) @2:1
├─ FunctionDeclaration "hoist_test" @2:1
│  └─ body
│     └─ FunctionBody @3:5
│        ├─ BlockStatement @3:5
│        │  ├─ VariableDeclaration (var) @4:9
│        │  │  └─ VariableDeclarator @4:9
│        │  │     ├─ Identifier "hoisted" [variable:1] (var) @4:13
│        │  │     └─ NumericLiteral 1 @4:23
│        │  └─ VariableDeclaration (let) @5:9
│        │     └─ VariableDeclarator @5:9
│        │        ├─ Identifier "blocked" [variable:0] (let) @5:13
│        │        └─ NumericLiteral 2 @5:23
│        └─ ReturnStatement @7:5
│           └─ Identifier "hoisted" [variable:1] @7:12
├─ FunctionDeclaration "for_var" @11:1
│  └─ body
│     └─ FunctionBody @12:5
│        ├─ ForStatement @12:5
│        │  ├─ init
│        │  │  └─ VariableDeclaration (var) @12:10
│        │  │     └─ VariableDeclarator @12:10
│        │  │        ├─ Identifier "i" [variable:0] (var) @12:14
│        │  │        └─ NumericLiteral 0 @12:18
│        │  ├─ test
│        │  │  └─ BinaryExpression (<) @12:23
│        │  │     ├─ Identifier "i" [variable:0] (var) @12:21
│        │  │     └─ NumericLiteral 10 @12:25
│        │  ├─ update
│        │  │  └─ UpdateExpression (++, postfix) @12:30
│        │  │     └─ Identifier "i" [variable:0] (var) @12:29
│        │  └─ body
│        │     └─ BlockStatement @12:34
│        │        └─ VariableDeclaration (var) @13:9
│        │           └─ VariableDeclarator @13:9
│        │              ├─ Identifier "inner" [variable:1] (var) @13:13
│        │              └─ Identifier "i" [variable:0] (var) @13:21
│        └─ ReturnStatement @15:5
│           └─ BinaryExpression (+) @15:14
│              ├─ Identifier "i" [variable:0] @15:12
│              └─ Identifier "inner" [variable:1] @15:16
├─ FunctionDeclaration "for_let" @19:1
│  └─ body
│     └─ FunctionBody @20:5
│        └─ ForStatement @20:5
│           ├─ init
│           │  └─ VariableDeclaration (let) @20:10
│           │     └─ VariableDeclarator @20:10
│           │        ├─ Identifier "j" [variable:0] (let) @20:14
│           │        └─ NumericLiteral 0 @20:18
│           ├─ test
│           │  └─ BinaryExpression (<) @20:23
│           │     ├─ Identifier "j" [variable:0] (let) @20:21
│           │     └─ NumericLiteral 10 @20:25
│           ├─ update
│           │  └─ UpdateExpression (++, postfix) @20:30
│           │     └─ Identifier "j" [variable:0] (let) @20:29
│           └─ body
│              └─ BlockStatement @20:34
└─ FunctionDeclaration "catch_var" @24:1
   └─ body
      └─ FunctionBody @25:5
         ├─ TryStatement @25:5
         │  ├─ block
         │  │  └─ BlockStatement @25:9
         │  │     └─ ThrowStatement @26:9
         │  │        └─ NumericLiteral 1 @26:15
         │  └─ handler
         │     └─ CatchClause @27:7
         │        ├─ parameter
         │        │  └─ Identifier "e" [variable:0] @27:14
         │        └─ BlockStatement @27:17
         │           └─ VariableDeclaration (var) @28:9
         │              └─ VariableDeclarator @28:9
         │                 ├─ Identifier "caught" [variable:1] (var) @28:13
         │                 └─ Identifier "e" [variable:0] @28:22
         └─ ReturnStatement @30:5
            └─ Identifier "caught" [variable:1] @30:12
