Index: clang/include/clang/AST/JSONNodeDumper.h =================================================================== --- clang/include/clang/AST/JSONNodeDumper.h +++ clang/include/clang/AST/JSONNodeDumper.h @@ -213,6 +213,7 @@ void VisitDeprecatedAttr(const DeprecatedAttr *DA); void VisitUnavailableAttr(const UnavailableAttr *UA); void VisitSectionAttr(const SectionAttr *SA); + void VisitVisibilityAttr(const VisibilityAttr *VA); void VisitTypedefType(const TypedefType *TT); void VisitUsingType(const UsingType *TT); Index: clang/lib/AST/JSONNodeDumper.cpp =================================================================== --- clang/lib/AST/JSONNodeDumper.cpp +++ clang/lib/AST/JSONNodeDumper.cpp @@ -551,6 +551,11 @@ JOS.attribute("section_name", SA->getName()); } +void JSONNodeDumper::VisitVisibilityAttr(const VisibilityAttr *VA) { + JOS.attribute("visibility", VisibilityAttr::ConvertVisibilityTypeToStr( + VA->getVisibility())); +} + void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) { JOS.attribute("decl", createBareDeclRef(TT->getDecl())); if (!TT->typeMatchesDecl()) Index: clang/test/AST/ast-dump-attr-json.cpp =================================================================== --- clang/test/AST/ast-dump-attr-json.cpp +++ clang/test/AST/ast-dump-attr-json.cpp @@ -17,6 +17,9 @@ __attribute__ ((section ("SECTION_NAME"))) int section_var; +__attribute__ ((visibility ("hidden"))) int visibility_var; + + // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py // using --filters=VarDecl @@ -433,3 +436,50 @@ // CHECK-NEXT: } // CHECK-NEXT: ] // CHECK-NEXT: } + + +// CHECK-NOT: {{^}}Dumping +// CHECK: "kind": "VarDecl", +// CHECK-NEXT: "loc": { +// CHECK-NEXT: "offset": 651, +// CHECK-NEXT: "line": 20, +// CHECK-NEXT: "col": 45, +// CHECK-NEXT: "tokLen": 14 +// CHECK-NEXT: }, +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "offset": 607, +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "tokLen": 13 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "offset": 651, +// CHECK-NEXT: "col": 45, +// CHECK-NEXT: "tokLen": 14 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "name": "visibility_var", +// CHECK-NEXT: "mangledName": "visibility_var", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "int" +// CHECK-NEXT: }, +// CHECK-NEXT: "inner": [ +// CHECK-NEXT: { +// CHECK-NEXT: "id": "0x{{.*}}", +// CHECK-NEXT: "kind": "VisibilityAttr", +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "offset": 623, +// CHECK-NEXT: "col": 17, +// CHECK-NEXT: "tokLen": 10 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "offset": 643, +// CHECK-NEXT: "col": 37, +// CHECK-NEXT: "tokLen": 1 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "visibility": "hidden" +// CHECK-NEXT: } +// CHECK-NEXT: ] +// CHECK-NEXT: }