]> granicus.if.org Git - clang/commitdiff
Implement instance variable references.
authorSteve Naroff <snaroff@apple.com>
Mon, 12 Nov 2007 14:29:37 +0000 (14:29 +0000)
committerSteve Naroff <snaroff@apple.com>
Mon, 12 Nov 2007 14:29:37 +0000 (14:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44016 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Expr.cpp
AST/StmtPrinter.cpp
AST/StmtSerialization.cpp
Sema/SemaExpr.cpp
include/clang/AST/Expr.h
include/clang/AST/StmtNodes.def

index 910bdf93112120a0e0324022c9843c8665198305..1ef93f5054e1812cd213c80f7090fcc15305a3d1 100644 (file)
@@ -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(); }
index 7fa553d810e21a3307f68302842a7dc393d72c46..ae8bb1ae57925193b3e554db49847a8d295d77b7 100644 (file)
@@ -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:
index 5ea56c2b4569cab80908ea7cf66197b9b6bf2c15..a0197f9d370ae2b1e68753666b3b6cc5ffe5f8d8 100644 (file)
@@ -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<ScopedDecl>(D.ReadOwnedPtr<Decl>());
   return new DeclStmt(decl);
index fe96bea69363444671d26221bbee15941ea5bda4..124eb14dc676d5b1f38d8b5e763eb229af052ac1 100644 (file)
@@ -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());
index 5c17aa604fde1d6d0513bd412c1481a20ea79b15..c7d9c4d0bd1316fce8a0ad08ed58c786b723aa30 100644 (file)
@@ -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 };
 
index db87975823aeda43fc12dbec3d594bb628ee4cc3..bc394b2c5b69a8f50cf0956b6ed54bf75849f6ac 100644 (file)
@@ -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