diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2007-10-17 16:58:11 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2007-10-17 16:58:11 +0000 |
| commit | a32aaefadcf84f20861332961a5d2c68b19e3abb (patch) | |
| tree | e281b6ab54b4d53ff2f42ae841f0e660c17ef1b6 /clang/AST | |
| parent | 7078da8e587d201765f293ed0ef0b63b2ad15deb (diff) | |
| download | bcm5719-llvm-a32aaefadcf84f20861332961a5d2c68b19e3abb.tar.gz bcm5719-llvm-a32aaefadcf84f20861332961a5d2c68b19e3abb.zip | |
Implementation of AST for @protocol expression.
llvm-svn: 43075
Diffstat (limited to 'clang/AST')
| -rw-r--r-- | clang/AST/ASTContext.cpp | 11 | ||||
| -rw-r--r-- | clang/AST/Expr.cpp | 4 | ||||
| -rw-r--r-- | clang/AST/StmtDumper.cpp | 8 | ||||
| -rw-r--r-- | clang/AST/StmtPrinter.cpp | 7 |
4 files changed, 30 insertions, 0 deletions
diff --git a/clang/AST/ASTContext.cpp b/clang/AST/ASTContext.cpp index 4c06e7c88cb..cf617d190ee 100644 --- a/clang/AST/ASTContext.cpp +++ b/clang/AST/ASTContext.cpp @@ -870,6 +870,17 @@ void ASTContext::setObjcSelType(TypedefDecl *TD) SelStructType = rec; } +void ASTContext::setObjcProtoType(TypedefDecl *TD) +{ + assert(ObjcProtoType.isNull() && "'Protocol' type already set!"); + + // typedef struct Protocol Protocol; + ObjcProtoType = TD->getUnderlyingType(); + // Protocol * type + ObjcProtoType = getPointerType(ObjcProtoType); + ProtoStructType = TD->getUnderlyingType()->getAsStructureType(); +} + void ASTContext::setObjcConstantStringInterface(ObjcInterfaceDecl *Decl) { assert(ObjcConstantStringType.isNull() && "'NSConstantString' type already set!"); diff --git a/clang/AST/Expr.cpp b/clang/AST/Expr.cpp index 1b989a4a61c..d69133258a1 100644 --- a/clang/AST/Expr.cpp +++ b/clang/AST/Expr.cpp @@ -1084,6 +1084,10 @@ Stmt::child_iterator ObjCEncodeExpr::child_end() { return NULL; } Stmt::child_iterator ObjCSelectorExpr::child_begin() { return NULL; } Stmt::child_iterator ObjCSelectorExpr::child_end() { return NULL; } +// ObjCProtocolExpr +Stmt::child_iterator ObjCProtocolExpr::child_begin() { return NULL; } +Stmt::child_iterator ObjCProtocolExpr::child_end() { return NULL; } + // ObjCMessageExpr Stmt::child_iterator ObjCMessageExpr::child_begin() { return reinterpret_cast<Stmt**>(&SubExprs[0]); diff --git a/clang/AST/StmtDumper.cpp b/clang/AST/StmtDumper.cpp index 39d2effd5a3..62886981b23 100644 --- a/clang/AST/StmtDumper.cpp +++ b/clang/AST/StmtDumper.cpp @@ -14,6 +14,7 @@ #include "clang/AST/StmtVisitor.h" #include "clang/AST/Decl.h" +#include "clang/AST/DeclObjc.h" #include "clang/AST/ExprCXX.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/SourceManager.h" @@ -129,6 +130,7 @@ namespace { // ObjC void VisitObjCEncodeExpr(ObjCEncodeExpr *Node); void VisitObjCSelectorExpr(ObjCSelectorExpr *Node); + void VisitObjCProtocolExpr(ObjCProtocolExpr *Node); }; } @@ -415,6 +417,12 @@ void StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { fprintf(F, "%s", selector.getName().c_str()); } +void StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { + DumpExpr(Node); + + fprintf(F, " "); + fprintf(F, "%s", Node->getProtocol()->getName()); +} //===----------------------------------------------------------------------===// // Stmt method implementations //===----------------------------------------------------------------------===// diff --git a/clang/AST/StmtPrinter.cpp b/clang/AST/StmtPrinter.cpp index a19ad37a0c3..90c5ef21598 100644 --- a/clang/AST/StmtPrinter.cpp +++ b/clang/AST/StmtPrinter.cpp @@ -14,6 +14,7 @@ #include "clang/AST/StmtVisitor.h" #include "clang/AST/Decl.h" +#include "clang/AST/DeclObjc.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/PrettyPrinter.h" #include "clang/Basic/IdentifierTable.h" @@ -627,6 +628,12 @@ void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { OS << ")"; } +void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { + OS << "@protocol("; + OS << Node->getProtocol()->getName(); + OS << ")"; +} + void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { OS << "["; Expr *receiver = Mess->getReceiver(); |

