From: Steve Naroff Date: Mon, 12 Nov 2007 14:29:37 +0000 (+0000) Subject: Implement instance variable references. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7779db42c94405ecbd6ee45efb293483fa6cbeff;p=clang Implement instance variable references. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44016 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/Expr.cpp b/AST/Expr.cpp index 910bdf9311..1ef93f5054 100644 --- a/AST/Expr.cpp +++ b/AST/Expr.cpp @@ -923,6 +923,10 @@ bool ChooseExpr::isConditionTrue(ASTContext &C) const { Stmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); } Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); } +// ObjCIvarRefExpr +Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return child_iterator(); } +Stmt::child_iterator ObjCIvarRefExpr::child_end() { return child_iterator(); } + // PreDefinedExpr Stmt::child_iterator PreDefinedExpr::child_begin() { return child_iterator(); } Stmt::child_iterator PreDefinedExpr::child_end() { return child_iterator(); } diff --git a/AST/StmtPrinter.cpp b/AST/StmtPrinter.cpp index 7fa553d810..ae8bb1ae57 100644 --- a/AST/StmtPrinter.cpp +++ b/AST/StmtPrinter.cpp @@ -382,6 +382,10 @@ void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { OS << Node->getDecl()->getName(); } +void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { + OS << Node->getDecl()->getName(); +} + void StmtPrinter::VisitPreDefinedExpr(PreDefinedExpr *Node) { switch (Node->getIdentType()) { default: diff --git a/AST/StmtSerialization.cpp b/AST/StmtSerialization.cpp index 5ea56c2b45..a0197f9d37 100644 --- a/AST/StmtSerialization.cpp +++ b/AST/StmtSerialization.cpp @@ -337,6 +337,20 @@ DeclRefExpr* DeclRefExpr::directMaterialize(Deserializer& D) { return dr; } +void ObjCIvarRefExpr::directEmit(Serializer& S) const { + S.Emit(Loc); + S.Emit(getType()); + S.EmitPtr(getDecl()); +} + +ObjCIvarRefExpr* ObjCIvarRefExpr::directMaterialize(Deserializer& D) { + SourceLocation Loc = SourceLocation::ReadVal(D); + QualType T = QualType::ReadVal(D); + ObjCIvarRefExpr* dr = new ObjCIvarRefExpr(NULL,T,Loc); + D.ReadPtr(dr->D,false); + return dr; +} + DeclStmt* DeclStmt::directMaterialize(Deserializer& D) { ScopedDecl* decl = cast(D.ReadOwnedPtr()); return new DeclStmt(decl); diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index fe96bea693..124eb14dc6 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -82,6 +82,12 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc, !getLangOptions().CPlusPlus) D = ImplicitlyDefineFunction(Loc, II, S); else { + if (CurMethodDecl) { + ObjcInterfaceDecl *IFace = CurMethodDecl->getClassInterface(); + ObjcInterfaceDecl *clsDeclared; + if (ObjcIvarDecl *IV = IFace->lookupInstanceVariable(&II, clsDeclared)) + return new ObjCIvarRefExpr(IV, IV->getType(), Loc); + } // If this name wasn't predeclared and if this is not a function call, // diagnose the problem. return Diag(Loc, diag::err_undeclared_var_use, II.getName()); diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 5c17aa604f..c7d9c4d0bd 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -1229,7 +1229,32 @@ class ObjCProtocolExpr : public Expr { virtual child_iterator child_end(); }; + +/// ObjCIvarRefExpr - A reference to an ObjC instance variable. +class ObjCIvarRefExpr : public Expr { + class ObjcIvarDecl *D; + SourceLocation Loc; +public: + ObjCIvarRefExpr(ObjcIvarDecl *d, QualType t, SourceLocation l) : + Expr(ObjCIvarRefExprClass, t), D(d), Loc(l) {} + + ObjcIvarDecl *getDecl() { return D; } + const ObjcIvarDecl *getDecl() const { return D; } + virtual SourceRange getSourceRange() const { return SourceRange(Loc); } + + static bool classof(const Stmt *T) { + return T->getStmtClass() == ObjCIvarRefExprClass; + } + static bool classof(const ObjCIvarRefExpr *) { return true; } + // Iterators + virtual child_iterator child_begin(); + virtual child_iterator child_end(); + + virtual void directEmit(llvm::Serializer& S) const; + static ObjCIvarRefExpr* directMaterialize(llvm::Deserializer& D); +}; + class ObjCMessageExpr : public Expr { enum { RECEIVER=0, ARGS_START=1 }; diff --git a/include/clang/AST/StmtNodes.def b/include/clang/AST/StmtNodes.def index db87975823..bc394b2c5b 100644 --- a/include/clang/AST/StmtNodes.def +++ b/include/clang/AST/StmtNodes.def @@ -94,8 +94,9 @@ STMT(71, ObjCEncodeExpr , Expr) STMT(72, ObjCMessageExpr , Expr) STMT(73, ObjCSelectorExpr , Expr) STMT(74, ObjCProtocolExpr , Expr) +STMT(75, ObjCIvarRefExpr , Expr) -LAST_EXPR(74) +LAST_EXPR(75) #undef STMT #undef FIRST_STMT