Add a new expression class, ObjCSuperExpr, to handle the Objective-C 'super'. Remove ObjCThis from PredefinedExpr

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58698 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 171f7db..ce08560 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -1311,6 +1311,10 @@
 Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; }
 Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; }
 
+// ObjCSuperExpr
+Stmt::child_iterator ObjCSuperExpr::child_begin() { return child_iterator(); }
+Stmt::child_iterator ObjCSuperExpr::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/lib/AST/StmtDumper.cpp b/lib/AST/StmtDumper.cpp
index 349b6fb..ecfdbf7 100644
--- a/lib/AST/StmtDumper.cpp
+++ b/lib/AST/StmtDumper.cpp
@@ -130,8 +130,9 @@
     // C++
     void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
     void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
+    void VisitCXXThisExpr(CXXThisExpr *Node);
     void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node);
-
+    
     // ObjC
     void VisitObjCEncodeExpr(ObjCEncodeExpr *Node);
     void VisitObjCMessageExpr(ObjCMessageExpr* Node);
@@ -139,6 +140,7 @@
     void VisitObjCProtocolExpr(ObjCProtocolExpr *Node);
     void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node);
     void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
+    void VisitObjCSuperExpr(ObjCSuperExpr *Node);
   };
 }
 
@@ -312,7 +314,6 @@
   case PredefinedExpr::Func:           fprintf(F, " __func__"); break;
   case PredefinedExpr::Function:       fprintf(F, " __FUNCTION__"); break;
   case PredefinedExpr::PrettyFunction: fprintf(F, " __PRETTY_FUNCTION__");break;
-  case PredefinedExpr::ObjCSuper:      fprintf(F, "super"); break;
   }
 }
 
@@ -418,6 +419,11 @@
   fprintf(F, " %s", Node->getValue() ? "true" : "false");
 }
 
+void StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
+  DumpExpr(Node);
+  fprintf(F, " this");
+}
+
 void StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
   DumpExpr(Node);
   fprintf(F, " functional cast to %s", 
@@ -471,6 +477,11 @@
   }
 }
 
+void StmtDumper::VisitObjCSuperExpr(ObjCSuperExpr *Node) {
+  DumpExpr(Node);
+  fprintf(F, " super");
+}
+
 //===----------------------------------------------------------------------===//
 // Stmt method implementations
 //===----------------------------------------------------------------------===//
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index 34aefc2..420bdbd 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -515,9 +515,6 @@
     case PredefinedExpr::PrettyFunction:
       OS << "__PRETTY_FUNCTION__";
       break;
-    case PredefinedExpr::ObjCSuper:
-      OS << "super";
-      break;
   }
 }
 
@@ -917,6 +914,10 @@
   OS << "]";
 }
 
+void StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) {
+  OS << "super";
+}
+
 void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
   BlockDecl *BD = Node->getBlockDecl();
   OS << "^";
diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp
index aefaee3..09aacef 100644
--- a/lib/AST/StmtSerialization.cpp
+++ b/lib/AST/StmtSerialization.cpp
@@ -191,6 +191,9 @@
     case ObjCStringLiteralClass:
       return ObjCStringLiteral::CreateImpl(D, C);
       
+    case ObjCSuperExprClass:
+      return ObjCSuperExpr::CreateImpl(D, C);
+
     //==--------------------------------------==//
     //    C++
     //==--------------------------------------==//
@@ -1232,6 +1235,17 @@
   return new ObjCStringLiteral(String,T,L);
 }
 
+void ObjCSuperExpr::EmitImpl(llvm::Serializer& S) const {
+  S.Emit(getType());
+  S.Emit(Loc);
+}
+
+ObjCSuperExpr* ObjCSuperExpr::CreateImpl(llvm::Deserializer& D, ASTContext&) {
+  QualType Ty = QualType::ReadVal(D);
+  SourceLocation Loc = SourceLocation::ReadVal(D);
+  return new ObjCSuperExpr(Loc, Ty);
+}
+
 //===----------------------------------------------------------------------===//
 //   Serialization for Clang Extensions.
 //===----------------------------------------------------------------------===//