Print information about various ObjC expression nodes when dumping the AST to JSON.

llvm-svn: 363988
This commit is contained in:
Aaron Ballman 2019-06-20 21:45:31 +00:00
parent 8b1abe568e
commit 75e23f8523
4 changed files with 5063 additions and 144 deletions

View File

@ -232,7 +232,6 @@ 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);
@ -261,6 +260,16 @@ public:
void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE);
void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *ME);
void VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE);
void VisitObjCMessageExpr(const ObjCMessageExpr *OME);
void VisitObjCBoxedExpr(const ObjCBoxedExpr *OBE);
void VisitObjCSelectorExpr(const ObjCSelectorExpr *OSE);
void VisitObjCProtocolExpr(const ObjCProtocolExpr *OPE);
void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *OPRE);
void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *OSRE);
void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *OIRE);
void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *OBLE);
void VisitIntegerLiteral(const IntegerLiteral *IL);
void VisitCharacterLiteral(const CharacterLiteral *CL);
void VisitFixedPointLiteral(const FixedPointLiteral *FPL);

View File

@ -838,6 +838,96 @@ void JSONNodeDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE) {
JOS.attribute("encodedType", createQualType(OEE->getEncodedType()));
}
void JSONNodeDumper::VisitObjCMessageExpr(const ObjCMessageExpr *OME) {
std::string Str;
llvm::raw_string_ostream OS(Str);
OME->getSelector().print(OS);
JOS.attribute("selector", OS.str());
switch (OME->getReceiverKind()) {
case ObjCMessageExpr::Instance:
JOS.attribute("receiverKind", "instance");
break;
case ObjCMessageExpr::Class:
JOS.attribute("receiverKind", "class");
JOS.attribute("classType", createQualType(OME->getClassReceiver()));
break;
case ObjCMessageExpr::SuperInstance:
JOS.attribute("receiverKind", "super (instance)");
JOS.attribute("superType", createQualType(OME->getSuperType()));
break;
case ObjCMessageExpr::SuperClass:
JOS.attribute("receiverKind", "super (class)");
JOS.attribute("superType", createQualType(OME->getSuperType()));
break;
}
QualType CallReturnTy = OME->getCallReturnType(Ctx);
if (OME->getType() != CallReturnTy)
JOS.attribute("callReturnType", createQualType(CallReturnTy));
}
void JSONNodeDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *OBE) {
if (const ObjCMethodDecl *MD = OBE->getBoxingMethod()) {
std::string Str;
llvm::raw_string_ostream OS(Str);
MD->getSelector().print(OS);
JOS.attribute("selector", OS.str());
}
}
void JSONNodeDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *OSE) {
std::string Str;
llvm::raw_string_ostream OS(Str);
OSE->getSelector().print(OS);
JOS.attribute("selector", OS.str());
}
void JSONNodeDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *OPE) {
JOS.attribute("protocol", createBareDeclRef(OPE->getProtocol()));
}
void JSONNodeDumper::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *OPRE) {
if (OPRE->isImplicitProperty()) {
JOS.attribute("propertyKind", "implicit");
if (const ObjCMethodDecl *MD = OPRE->getImplicitPropertyGetter())
JOS.attribute("getter", createBareDeclRef(MD));
if (const ObjCMethodDecl *MD = OPRE->getImplicitPropertySetter())
JOS.attribute("setter", createBareDeclRef(MD));
} else {
JOS.attribute("propertyKind", "explicit");
JOS.attribute("property", createBareDeclRef(OPRE->getExplicitProperty()));
}
attributeOnlyIfTrue("isSuperReceiver", OPRE->isSuperReceiver());
attributeOnlyIfTrue("isMessagingGetter", OPRE->isMessagingGetter());
attributeOnlyIfTrue("isMessagingSetter", OPRE->isMessagingSetter());
}
void JSONNodeDumper::VisitObjCSubscriptRefExpr(
const ObjCSubscriptRefExpr *OSRE) {
JOS.attribute("subscriptKind",
OSRE->isArraySubscriptRefExpr() ? "array" : "dictionary");
if (const ObjCMethodDecl *MD = OSRE->getAtIndexMethodDecl())
JOS.attribute("getter", createBareDeclRef(MD));
if (const ObjCMethodDecl *MD = OSRE->setAtIndexMethodDecl())
JOS.attribute("setter", createBareDeclRef(MD));
}
void JSONNodeDumper::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *OIRE) {
JOS.attribute("decl", createBareDeclRef(OIRE->getDecl()));
attributeOnlyIfTrue("isFreeIvar", OIRE->isFreeIvar());
JOS.attribute("isArrow", OIRE->isArrow());
}
void JSONNodeDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *OBLE) {
JOS.attribute("value", OBLE->getValue() ? "__objc_yes" : "__objc_no");
}
void JSONNodeDumper::VisitDeclRefExpr(const DeclRefExpr *DRE) {
JOS.attribute("referencedDecl", createBareDeclRef(DRE->getDecl()));
if (DRE->getDecl() != DRE->getFoundDecl())

File diff suppressed because it is too large Load Diff

View File

@ -19,11 +19,6 @@ void TestObjCAtCatchStmt() {
}
}
void TestObjCEncode() {
@encode(int);
@encode(typeof(^{;}));
}
// CHECK: "kind": "FunctionDecl",
// CHECK-NEXT: "loc": {
@ -735,141 +730,3 @@ void TestObjCEncode() {
// 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: }