Skip to content

Commit b2f8a0f

Browse files
authored
[clang] ast-dump: dump AvailabilityAttr fields to JSON (#179281)
This adds `AvailabilityAttr` fields for the JSON dumper
1 parent 0d94148 commit b2f8a0f

File tree

5 files changed

+201
-0
lines changed

5 files changed

+201
-0
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ ABI Changes in This Version
5252
AST Dumping Potentially Breaking Changes
5353
----------------------------------------
5454

55+
- The JSON AST dump now includes all fields from ``AvailabilityAttr``: ``platform``,
56+
``introduced``, ``deprecated``, ``obsoleted``, ``unavailable``, ``message``,
57+
``strict``, ``replacement``, ``priority``, and ``environment``. Previously, these
58+
fields were missing from the JSON output.
59+
5560
Clang Frontend Potentially Breaking Changes
5661
-------------------------------------------
5762

clang/include/clang/AST/JSONNodeDumper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ class JSONNodeDumper
219219
void VisitSectionAttr(const SectionAttr *SA);
220220
void VisitVisibilityAttr(const VisibilityAttr *VA);
221221
void VisitTLSModelAttr(const TLSModelAttr *TA);
222+
void VisitAvailabilityAttr(const AvailabilityAttr *AA);
222223

223224
void VisitTypedefType(const TypedefType *TT);
224225
void VisitUsingType(const UsingType *TT);

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,27 @@ void JSONNodeDumper::VisitTLSModelAttr(const TLSModelAttr *TA) {
596596
JOS.attribute("tls_model", TA->getModel());
597597
}
598598

599+
void JSONNodeDumper::VisitAvailabilityAttr(const AvailabilityAttr *AA) {
600+
if (const IdentifierInfo *Platform = AA->getPlatform())
601+
JOS.attribute("platform", Platform->getName());
602+
if (!AA->getIntroduced().empty())
603+
JOS.attribute("introduced", AA->getIntroduced().getAsString());
604+
if (!AA->getDeprecated().empty())
605+
JOS.attribute("deprecated", AA->getDeprecated().getAsString());
606+
if (!AA->getObsoleted().empty())
607+
JOS.attribute("obsoleted", AA->getObsoleted().getAsString());
608+
attributeOnlyIfTrue("unavailable", AA->getUnavailable());
609+
if (!AA->getMessage().empty())
610+
JOS.attribute("message", AA->getMessage());
611+
attributeOnlyIfTrue("strict", AA->getStrict());
612+
if (!AA->getReplacement().empty())
613+
JOS.attribute("replacement", AA->getReplacement());
614+
if (AA->getPriority() != 0)
615+
JOS.attribute("priority", AA->getPriority());
616+
if (const IdentifierInfo *Env = AA->getEnvironment())
617+
JOS.attribute("environment", Env->getName());
618+
}
619+
599620
void JSONNodeDumper::VisitTypedefType(const TypedefType *TT) {
600621
JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
601622
if (!TT->typeMatchesDecl())
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -ast-dump=json %s | FileCheck %s
2+
3+
// Test AvailabilityAttr fields in JSON AST dump
4+
5+
__attribute__((availability(shadermodel, introduced=6.0, deprecated=6.3, obsoleted=6.5, replacement="new_func", environment=compute)))
6+
void availability_all(void);
7+
8+
// CHECK: "kind": "FunctionDecl",
9+
// CHECK: "name": "availability_all",
10+
// CHECK: "kind": "AvailabilityAttr",
11+
// CHECK: "platform": "shadermodel",
12+
// CHECK: "introduced": "6.0",
13+
// CHECK: "deprecated": "6.3",
14+
// CHECK: "obsoleted": "6.5",
15+
// CHECK: "replacement": "new_func",
16+
// CHECK: "environment": "compute"

clang/test/AST/ast-dump-attr-json.cpp

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ __attribute__ ((visibility ("hidden"))) int visibility_var;
2121

2222
__thread __attribute__ ((tls_model ("local-exec"))) int tls_model_var;
2323

24+
__attribute__((availability(macos, introduced=10.15, deprecated=12.0, obsoleted=13.0, strict, replacement="new_func"))) int availability_var_all;
25+
__attribute__((availability(macos, unavailable, message="use new API"))) int availability_var_unavailable;
26+
27+
#pragma clang attribute push(__attribute__((availability(macos, introduced=11.0))), apply_to=variable)
28+
int availability_var_pragma;
29+
#pragma clang attribute pop
30+
2431
// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
2532
// using --filters=VarDecl
2633

@@ -529,3 +536,154 @@ __thread __attribute__ ((tls_model ("local-exec"))) int tls_model_var;
529536
// CHECK-NEXT: }
530537
// CHECK-NEXT: ]
531538
// CHECK-NEXT: }
539+
540+
541+
// CHECK-NOT: {{^}}Dumping
542+
// CHECK: "kind": "VarDecl",
543+
// CHECK-NEXT: "loc": {
544+
// CHECK-NEXT: "offset": 888,
545+
// CHECK-NEXT: "line": 24,
546+
// CHECK-NEXT: "col": 125,
547+
// CHECK-NEXT: "tokLen": 20
548+
// CHECK-NEXT: },
549+
// CHECK-NEXT: "range": {
550+
// CHECK-NEXT: "begin": {
551+
// CHECK-NEXT: "offset": 764,
552+
// CHECK-NEXT: "col": 1,
553+
// CHECK-NEXT: "tokLen": 13
554+
// CHECK-NEXT: },
555+
// CHECK-NEXT: "end": {
556+
// CHECK-NEXT: "offset": 888,
557+
// CHECK-NEXT: "col": 125,
558+
// CHECK-NEXT: "tokLen": 20
559+
// CHECK-NEXT: }
560+
// CHECK-NEXT: },
561+
// CHECK-NEXT: "name": "availability_var_all",
562+
// CHECK-NEXT: "mangledName": "availability_var_all",
563+
// CHECK-NEXT: "type": {
564+
// CHECK-NEXT: "qualType": "int"
565+
// CHECK-NEXT: },
566+
// CHECK-NEXT: "inner": [
567+
// CHECK-NEXT: {
568+
// CHECK-NEXT: "id": "0x{{.*}}",
569+
// CHECK-NEXT: "kind": "AvailabilityAttr",
570+
// CHECK-NEXT: "range": {
571+
// CHECK-NEXT: "begin": {
572+
// CHECK-NEXT: "offset": 779,
573+
// CHECK-NEXT: "col": 16,
574+
// CHECK-NEXT: "tokLen": 12
575+
// CHECK-NEXT: },
576+
// CHECK-NEXT: "end": {
577+
// CHECK-NEXT: "offset": 880,
578+
// CHECK-NEXT: "col": 117,
579+
// CHECK-NEXT: "tokLen": 1
580+
// CHECK-NEXT: }
581+
// CHECK-NEXT: },
582+
// CHECK-NEXT: "platform": "macos",
583+
// CHECK-NEXT: "introduced": "10.15",
584+
// CHECK-NEXT: "deprecated": "12.0",
585+
// CHECK-NEXT: "obsoleted": "13.0",
586+
// CHECK-NEXT: "strict": true,
587+
// CHECK-NEXT: "replacement": "new_func"
588+
// CHECK-NEXT: }
589+
// CHECK-NEXT: ]
590+
// CHECK-NEXT: }
591+
592+
593+
// CHECK-NOT: {{^}}Dumping
594+
// CHECK: "kind": "VarDecl",
595+
// CHECK-NEXT: "loc": {
596+
// CHECK-NEXT: "offset": 987,
597+
// CHECK-NEXT: "line": 25,
598+
// CHECK-NEXT: "col": 78,
599+
// CHECK-NEXT: "tokLen": 28
600+
// CHECK-NEXT: },
601+
// CHECK-NEXT: "range": {
602+
// CHECK-NEXT: "begin": {
603+
// CHECK-NEXT: "offset": 910,
604+
// CHECK-NEXT: "col": 1,
605+
// CHECK-NEXT: "tokLen": 13
606+
// CHECK-NEXT: },
607+
// CHECK-NEXT: "end": {
608+
// CHECK-NEXT: "offset": 987,
609+
// CHECK-NEXT: "col": 78,
610+
// CHECK-NEXT: "tokLen": 28
611+
// CHECK-NEXT: }
612+
// CHECK-NEXT: },
613+
// CHECK-NEXT: "name": "availability_var_unavailable",
614+
// CHECK-NEXT: "mangledName": "availability_var_unavailable",
615+
// CHECK-NEXT: "type": {
616+
// CHECK-NEXT: "qualType": "int"
617+
// CHECK-NEXT: },
618+
// CHECK-NEXT: "inner": [
619+
// CHECK-NEXT: {
620+
// CHECK-NEXT: "id": "0x{{.*}}",
621+
// CHECK-NEXT: "kind": "AvailabilityAttr",
622+
// CHECK-NEXT: "range": {
623+
// CHECK-NEXT: "begin": {
624+
// CHECK-NEXT: "offset": 925,
625+
// CHECK-NEXT: "col": 16,
626+
// CHECK-NEXT: "tokLen": 12
627+
// CHECK-NEXT: },
628+
// CHECK-NEXT: "end": {
629+
// CHECK-NEXT: "offset": 979,
630+
// CHECK-NEXT: "col": 70,
631+
// CHECK-NEXT: "tokLen": 1
632+
// CHECK-NEXT: }
633+
// CHECK-NEXT: },
634+
// CHECK-NEXT: "platform": "macos",
635+
// CHECK-NEXT: "unavailable": true,
636+
// CHECK-NEXT: "message": "use new API"
637+
// CHECK-NEXT: }
638+
// CHECK-NEXT: ]
639+
// CHECK-NEXT: }
640+
641+
642+
// CHECK-NOT: {{^}}Dumping
643+
// CHECK: "kind": "VarDecl",
644+
// CHECK-NEXT: "loc": {
645+
// CHECK-NEXT: "offset": 1125,
646+
// CHECK-NEXT: "line": 28,
647+
// CHECK-NEXT: "col": 5,
648+
// CHECK-NEXT: "tokLen": 23
649+
// CHECK-NEXT: },
650+
// CHECK-NEXT: "range": {
651+
// CHECK-NEXT: "begin": {
652+
// CHECK-NEXT: "offset": 1121,
653+
// CHECK-NEXT: "col": 1,
654+
// CHECK-NEXT: "tokLen": 3
655+
// CHECK-NEXT: },
656+
// CHECK-NEXT: "end": {
657+
// CHECK-NEXT: "offset": 1125,
658+
// CHECK-NEXT: "col": 5,
659+
// CHECK-NEXT: "tokLen": 23
660+
// CHECK-NEXT: }
661+
// CHECK-NEXT: },
662+
// CHECK-NEXT: "name": "availability_var_pragma",
663+
// CHECK-NEXT: "mangledName": "availability_var_pragma",
664+
// CHECK-NEXT: "type": {
665+
// CHECK-NEXT: "qualType": "int"
666+
// CHECK-NEXT: },
667+
// CHECK-NEXT: "inner": [
668+
// CHECK-NEXT: {
669+
// CHECK-NEXT: "id": "0x{{.*}}",
670+
// CHECK-NEXT: "kind": "AvailabilityAttr",
671+
// CHECK-NEXT: "range": {
672+
// CHECK-NEXT: "begin": {
673+
// CHECK-NEXT: "offset": 1062,
674+
// CHECK-NEXT: "line": 27,
675+
// CHECK-NEXT: "col": 45,
676+
// CHECK-NEXT: "tokLen": 12
677+
// CHECK-NEXT: },
678+
// CHECK-NEXT: "end": {
679+
// CHECK-NEXT: "offset": 1097,
680+
// CHECK-NEXT: "col": 80,
681+
// CHECK-NEXT: "tokLen": 1
682+
// CHECK-NEXT: }
683+
// CHECK-NEXT: },
684+
// CHECK-NEXT: "platform": "macos",
685+
// CHECK-NEXT: "introduced": "11.0",
686+
// CHECK-NEXT: "priority": 1
687+
// CHECK-NEXT: }
688+
// CHECK-NEXT: ]
689+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)