From 20a24c5233f9d3a343778b15f521c80be30e3d34 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 20 Jun 2019 19:11:35 +0000 Subject: [PATCH] Print additional information about @encode expressions when dumping the AST to JSON. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363966 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/JSONNodeDumper.h | 1 + lib/AST/JSONNodeDumper.cpp | 4 + test/AST/ast-dump-stmt-json.m | 143 +++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) diff --git a/include/clang/AST/JSONNodeDumper.h b/include/clang/AST/JSONNodeDumper.h index 18d051b88a..e8db14ad81 100644 --- a/include/clang/AST/JSONNodeDumper.h +++ b/include/clang/AST/JSONNodeDumper.h @@ -232,6 +232,7 @@ public: void VisitObjCPropertyDecl(const ObjCPropertyDecl *D); void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D); void VisitBlockDecl(const BlockDecl *D); + void VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE); void VisitDeclRefExpr(const DeclRefExpr *DRE); void VisitPredefinedExpr(const PredefinedExpr *PE); diff --git a/lib/AST/JSONNodeDumper.cpp b/lib/AST/JSONNodeDumper.cpp index f15bd780ba..77ba91a1f0 100644 --- a/lib/AST/JSONNodeDumper.cpp +++ b/lib/AST/JSONNodeDumper.cpp @@ -834,6 +834,10 @@ void JSONNodeDumper::VisitBlockDecl(const BlockDecl *D) { attributeOnlyIfTrue("capturesThis", D->capturesCXXThis()); } +void JSONNodeDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE) { + JOS.attribute("encodedType", createQualType(OEE->getEncodedType())); +} + void JSONNodeDumper::VisitDeclRefExpr(const DeclRefExpr *DRE) { JOS.attribute("referencedDecl", createBareDeclRef(DRE->getDecl())); if (DRE->getDecl() != DRE->getFoundDecl()) diff --git a/test/AST/ast-dump-stmt-json.m b/test/AST/ast-dump-stmt-json.m index 9647f4a78c..3764bd1d22 100644 --- a/test/AST/ast-dump-stmt-json.m +++ b/test/AST/ast-dump-stmt-json.m @@ -19,6 +19,11 @@ void TestObjCAtCatchStmt() { } } +void TestObjCEncode() { + @encode(int); + @encode(typeof(^{;})); +} + // CHECK: "kind": "FunctionDecl", // CHECK-NEXT: "loc": { @@ -730,3 +735,141 @@ void TestObjCAtCatchStmt() { // CHECK-NEXT: } // CHECK-NEXT: ] // CHECK-NEXT: } + + +// CHECK: "kind": "FunctionDecl", +// CHECK-NEXT: "loc": { +// CHECK-NEXT: "col": 6, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 22 +// CHECK-NEXT: }, +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 22 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 25 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "name": "TestObjCEncode", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "void ()" +// CHECK-NEXT: }, +// CHECK-NEXT: "inner": [ +// CHECK-NEXT: { +// CHECK-NEXT: "id": "0x{{.*}}", +// CHECK-NEXT: "kind": "CompoundStmt", +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 23, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 22 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 25 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "inner": [ +// CHECK-NEXT: { +// CHECK-NEXT: "id": "0x{{.*}}", +// CHECK-NEXT: "kind": "ImplicitCastExpr", +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 3, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 23 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 14, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 23 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "char *" +// CHECK-NEXT: }, +// CHECK-NEXT: "valueCategory": "rvalue", +// CHECK-NEXT: "castKind": "ArrayToPointerDecay", +// CHECK-NEXT: "inner": [ +// CHECK-NEXT: { +// CHECK-NEXT: "id": "0x{{.*}}", +// CHECK-NEXT: "kind": "ObjCEncodeExpr", +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 3, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 23 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 14, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 23 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "char [2]" +// CHECK-NEXT: }, +// CHECK-NEXT: "valueCategory": "lvalue", +// CHECK-NEXT: "encodedType": { +// CHECK-NEXT: "qualType": "int" +// CHECK-NEXT: } +// CHECK-NEXT: } +// CHECK-NEXT: ] +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "id": "0x{{.*}}", +// CHECK-NEXT: "kind": "ImplicitCastExpr", +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 3, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 24 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 23, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 24 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "char *" +// CHECK-NEXT: }, +// CHECK-NEXT: "valueCategory": "rvalue", +// CHECK-NEXT: "castKind": "ArrayToPointerDecay", +// CHECK-NEXT: "inner": [ +// CHECK-NEXT: { +// CHECK-NEXT: "id": "0x{{.*}}", +// CHECK-NEXT: "kind": "ObjCEncodeExpr", +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 3, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 24 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 23, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 24 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "char [3]" +// CHECK-NEXT: }, +// CHECK-NEXT: "valueCategory": "lvalue", +// CHECK-NEXT: "encodedType": { +// CHECK-NEXT: "desugaredQualType": "void (^)(void)", +// CHECK-NEXT: "qualType": "typeof (^{ })" +// CHECK-NEXT: } +// CHECK-NEXT: } +// CHECK-NEXT: ] +// CHECK-NEXT: } +// CHECK-NEXT: ] +// CHECK-NEXT: } +// CHECK-NEXT: ] +// CHECK-NEXT: } -- 2.40.0