forked from OSchip/llvm-project
Print information about various ObjC expression nodes when dumping the AST to JSON.
llvm-svn: 363988
This commit is contained in:
parent
8b1abe568e
commit
75e23f8523
|
@ -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);
|
||||
|
|
|
@ -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
|
@ -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: }
|
||||
|
|
Loading…
Reference in New Issue