displayTree displays AST in tree format
(astObj *ast.AST)
| 252 | |
| 253 | // displayTree displays AST in tree format |
| 254 | func (p *Parser) displayTree(astObj *ast.AST) error { |
| 255 | fmt.Fprintf(p.Out, "🌳 AST Tree Structure:\n") |
| 256 | fmt.Fprintf(p.Out, "├── AST Root\n") |
| 257 | |
| 258 | for i, stmt := range astObj.Statements { |
| 259 | isLast := i == len(astObj.Statements)-1 |
| 260 | prefix := "├──" |
| 261 | childPrefix := "│ " |
| 262 | if isLast { |
| 263 | prefix = "└──" |
| 264 | childPrefix = " " |
| 265 | } |
| 266 | |
| 267 | stmtType := fmt.Sprintf("%T", stmt) |
| 268 | if strings.Contains(stmtType, ".") { |
| 269 | parts := strings.Split(stmtType, ".") |
| 270 | stmtType = parts[len(parts)-1] |
| 271 | } |
| 272 | |
| 273 | fmt.Fprintf(p.Out, "%s %s\n", prefix, stmtType) |
| 274 | |
| 275 | // Add basic tree structure for SELECT statements |
| 276 | if s, ok := stmt.(*ast.SelectStatement); ok { |
| 277 | if len(s.Columns) > 0 { |
| 278 | fmt.Fprintf(p.Out, "%s├── Columns (%d items)\n", childPrefix, len(s.Columns)) |
| 279 | } |
| 280 | if len(s.From) > 0 { |
| 281 | fmt.Fprintf(p.Out, "%s├── From (%d tables)\n", childPrefix, len(s.From)) |
| 282 | } |
| 283 | if s.Where != nil { |
| 284 | fmt.Fprintf(p.Out, "%s├── Where\n", childPrefix) |
| 285 | } |
| 286 | if len(s.GroupBy) > 0 { |
| 287 | fmt.Fprintf(p.Out, "%s├── GroupBy\n", childPrefix) |
| 288 | } |
| 289 | if len(s.OrderBy) > 0 { |
| 290 | fmt.Fprintf(p.Out, "%s├── OrderBy\n", childPrefix) |
| 291 | } |
| 292 | if s.Limit != nil { |
| 293 | fmt.Fprintf(p.Out, "%s└── Limit\n", childPrefix) |
| 294 | } |
| 295 | } |
| 296 | } |
| 297 | |
| 298 | return nil |
| 299 | } |
| 300 | |
| 301 | // convertStatement converts an AST statement to a display format |
| 302 | func convertStatement(stmt ast.Statement) StatementDisplay { |