# Test `image dump ast` command.

# DWARF is required to properly create the AST, and on Windows that is discarded
# and we only have PDB which doesn't work for this test.
# UNSUPPORTED: system-windows

# RUN: split-file %s %t
# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out
# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \
# RUN:       | FileCheck %s

#--- main.cpp

void A() {}
void A1() {}
void BA1() {}
void AB() {}

int main() {
  A();
  A1();
  BA1();
  AB();
}

#--- commands.input

break set -n main
run
expr A(); A1(); BA1(); AB()

image dump ast

# CHECK: image dump ast
# CHECK-DAG: FunctionDecl {{.*}} main
# CHECK-DAG: FunctionDecl {{.*}} A
# CHECK-DAG: FunctionDecl {{.*}} A1
# CHECK-DAG: FunctionDecl {{.*}} BA1
# CHECK-DAG: FunctionDecl {{.*}} AB

image dump ast --filter A

# CHECK: image dump ast --filter A
# CHECK: Dumping A
# CHECK-NOT: FunctionDecl {{.*}} main
# CHECK-DAG: FunctionDecl {{.*}} A1
# CHECK-DAG: FunctionDecl {{.*}} BA1
# CHECK-DAG: FunctionDecl {{.*}} AB

image dump ast --filter A1

# CHECK: image dump ast --filter A1
# CHECK: Dumping A
# CHECK-NOT: FunctionDecl {{.*}} main
# CHECK-NOT: FunctionDecl {{.*}} AB
# CHECK-DAG: FunctionDecl {{.*}} A1
# CHECK-DAG: FunctionDecl {{.*}} BA1

image dump ast --filter ""

# CHECK: image dump ast --filter ""
# CHECK-DAG: FunctionDecl {{.*}} main
# CHECK-DAG: FunctionDecl {{.*}} AB
# CHECK-DAG: FunctionDecl {{.*}} A1
# CHECK-DAG: FunctionDecl {{.*}} BA1

image dump ast -f AB

# CHECK: image dump ast -f AB
# CHECK: Dumping AB
# CHECK-NOT: FunctionDecl {{.*}} main
# CHECK-NOT: FunctionDecl {{.*}} A1
# CHECK-NOT: FunctionDecl {{.*}} BA1
# CHECK: FunctionDecl {{.*}} AB
