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/PCHReader.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/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index d824c56848..9970eb2b09 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -497,7 +497,11 @@ namespace { unsigned VisitObjCEncodeExpr(ObjCEncodeExpr *E); unsigned VisitObjCSelectorExpr(ObjCSelectorExpr *E); unsigned VisitObjCProtocolExpr(ObjCProtocolExpr *E); + unsigned VisitObjCIvarRefExpr(ObjCIvarRefExpr *E); + unsigned VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E); + unsigned VisitObjCKVCRefExpr(ObjCKVCRefExpr *E); unsigned VisitObjCMessageExpr(ObjCMessageExpr *E); + unsigned VisitObjCSuperExpr(ObjCSuperExpr *E); }; } @@ -1081,21 +1085,60 @@ unsigned PCHStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { return 0; } +unsigned PCHStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { + VisitExpr(E); + E->setDecl(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); + E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setBase(cast<Expr>(StmtStack.back())); + E->setIsArrow(Record[Idx++]); + E->setIsFreeIvar(Record[Idx++]); + return 1; +} + +unsigned PCHStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { + VisitExpr(E); + E->setProperty(cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++]))); + E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setBase(cast<Expr>(StmtStack.back())); + return 1; +} + +unsigned PCHStmtReader::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) { + VisitExpr(E); + E->setGetterMethod(cast<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); + E->setSetterMethod(cast<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); + E->setClassProp(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); + E->setBase(cast<Expr>(StmtStack.back())); + E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + return 1; +} + unsigned PCHStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { VisitExpr(E); E->setNumArgs(Record[Idx++]); - SourceRange SR(SourceLocation::getFromRawEncoding(Record[Idx++]), - SourceLocation::getFromRawEncoding(Record[Idx++])); - E->setSourceRange(SR); + E->setLeftLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setRightLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); E->setSelector(Reader.GetSelector(Record, Idx)); E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); - // FIXME: deal with class messages. + + ObjCMessageExpr::ClassInfo CI; + CI.first = cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])); + CI.second = Reader.GetIdentifierInfo(Record, Idx); + if (E->getMethodDecl() == 0) + E->setClassInfo(CI); + E->setReceiver(cast<Expr>(StmtStack[StmtStack.size() - E->getNumArgs() - 1])); for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) E->setArg(I, cast<Expr>(StmtStack[StmtStack.size() - N + I])); return E->getNumArgs() + 1; } +unsigned PCHStmtReader::VisitObjCSuperExpr(ObjCSuperExpr *E) { + VisitExpr(E); + E->setLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + return 0; +} //===----------------------------------------------------------------------===// // PCH reader implementation @@ -3312,9 +3355,21 @@ Stmt *PCHReader::ReadStmt() { case pch::EXPR_OBJC_PROTOCOL_EXPR: S = new (Context) ObjCProtocolExpr(Empty); break; + case pch::EXPR_OBJC_IVAR_REF_EXPR: + S = new (Context) ObjCIvarRefExpr(Empty); + break; + case pch::EXPR_OBJC_PROPERTY_REF_EXPR: + S = new (Context) ObjCPropertyRefExpr(Empty); + break; + case pch::EXPR_OBJC_KVC_REF_EXPR: + S = new (Context) ObjCKVCRefExpr(Empty); + break; case pch::EXPR_OBJC_MESSAGE_EXPR: S = new (Context) ObjCMessageExpr(Empty); break; + case pch::EXPR_OBJC_SUPER_EXPR: + S = new (Context) ObjCSuperExpr(Empty); + break; } // We hit a STMT_STOP, so we're done with this expression. |