diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-26 00:44:05 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-26 00:44:05 +0000 |
commit | 0389e6bd0159bfdd08f7c50a37543b6e3adf0c33 (patch) | |
tree | a6192f51f47c316d424c66f8416d05e2e092a407 /lib/Frontend/PCHWriter.cpp | |
parent | cf11b52ac2819e0d82d60ba570b14ffdba3cd607 (diff) |
implement PCH support for the rest of ExprObjC.h, including
the missing bits of ObjCMessageExpr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70100 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHWriter.cpp')
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 59aabfe0e4..f648a75650 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -672,7 +672,11 @@ namespace { void VisitObjCEncodeExpr(ObjCEncodeExpr *E); void VisitObjCSelectorExpr(ObjCSelectorExpr *E); void VisitObjCProtocolExpr(ObjCProtocolExpr *E); + void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E); + void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E); + void VisitObjCKVCRefExpr(ObjCKVCRefExpr *E); void VisitObjCMessageExpr(ObjCMessageExpr *E); + void VisitObjCSuperExpr(ObjCSuperExpr *E); }; } @@ -1199,21 +1203,59 @@ void PCHStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { Code = pch::EXPR_OBJC_PROTOCOL_EXPR; } +void PCHStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { + VisitExpr(E); + Writer.AddDeclRef(E->getDecl(), Record); + Writer.AddSourceLocation(E->getLocation(), Record); + Writer.WriteSubStmt(E->getBase()); + Record.push_back(E->isArrow()); + Record.push_back(E->isFreeIvar()); +} + +void PCHStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { + VisitExpr(E); + Writer.AddDeclRef(E->getProperty(), Record); + Writer.AddSourceLocation(E->getLocation(), Record); + Writer.WriteSubStmt(E->getBase()); +} + +void PCHStmtWriter::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) { + VisitExpr(E); + Writer.AddDeclRef(E->getGetterMethod(), Record); + Writer.AddDeclRef(E->getSetterMethod(), Record); + + // NOTE: ClassProp and Base are mutually exclusive. + Writer.AddDeclRef(E->getClassProp(), Record); + Writer.WriteSubStmt(E->getBase()); + Writer.AddSourceLocation(E->getLocation(), Record); + Writer.AddSourceLocation(E->getClassLoc(), Record); +} + void PCHStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) { VisitExpr(E); Record.push_back(E->getNumArgs()); - Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record); - Writer.AddSourceLocation(E->getSourceRange().getEnd(), Record); + Writer.AddSourceLocation(E->getLeftLoc(), Record); + Writer.AddSourceLocation(E->getRightLoc(), Record); Writer.AddSelectorRef(E->getSelector(), Record); Writer.AddDeclRef(E->getMethodDecl(), Record); // optional - // FIXME: deal with class messages. + + ObjCMessageExpr::ClassInfo CI = E->getClassInfo(); Writer.WriteSubStmt(E->getReceiver()); + Writer.AddDeclRef(CI.first, Record); + Writer.AddIdentifierRef(CI.second, Record); + for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end(); Arg != ArgEnd; ++Arg) Writer.WriteSubStmt(*Arg); Code = pch::EXPR_OBJC_MESSAGE_EXPR; } +void PCHStmtWriter::VisitObjCSuperExpr(ObjCSuperExpr *E) { + VisitExpr(E); + Writer.AddSourceLocation(E->getLoc(), Record); + +} + //===----------------------------------------------------------------------===// // PCHWriter Implementation |