aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Driver/ASTConsumers.cpp32
-rw-r--r--Parse/ParseObjc.cpp4
-rw-r--r--include/clang/AST/DeclObjC.h4
-rw-r--r--include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h1
4 files changed, 34 insertions, 7 deletions
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index ddacfa88c1..a52cd4511a 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -79,6 +79,26 @@ static void PrintObjcInterfaceDecl(ObjcInterfaceDecl *OID) {
// FIXME: implement the rest...
}
+static void PrintObjcProtocolDecl(ObjcProtocolDecl *PID) {
+ std::string S = PID->getName();
+ fprintf(stderr, "@protocol %s;\n", S.c_str());
+ // FIXME: implement the rest...
+}
+
+static void PrintObjcCategoryImplDecl(ObjcCategoryImplDecl *PID) {
+ std::string S = PID->getName();
+ std::string I = PID->getClassInterface()->getName();
+ fprintf(stderr, "@implementation %s(%s);\n", I.c_str(), S.c_str());
+ // FIXME: implement the rest...
+}
+
+static void PrintObjcCategoryDecl(ObjcCategoryDecl *PID) {
+ std::string S = PID->getName();
+ std::string I = PID->getClassInterface()->getName();
+ fprintf(stderr, "@interface %s(%s);\n", I.c_str(), S.c_str());
+ // FIXME: implement the rest...
+}
+
namespace {
class ASTPrinter : public ASTConsumer {
virtual void HandleTopLevelDecl(Decl *D) {
@@ -92,10 +112,10 @@ namespace {
}
} else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
PrintTypeDefDecl(TD);
- } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
- fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName());
} else if (ObjcInterfaceDecl *OID = dyn_cast<ObjcInterfaceDecl>(D)) {
PrintObjcInterfaceDecl(OID);
+ } else if (ObjcProtocolDecl *PID = dyn_cast<ObjcProtocolDecl>(D)) {
+ PrintObjcProtocolDecl(PID);
} else if (ObjcForwardProtocolDecl *OFPD =
dyn_cast<ObjcForwardProtocolDecl>(D)) {
fprintf(stderr, "@protocol ");
@@ -109,8 +129,16 @@ namespace {
dyn_cast<ObjcImplementationDecl>(D)) {
fprintf(stderr, "@implementation %s [printing todo]\n",
OID->getName());
+ } else if (ObjcCategoryImplDecl *OID =
+ dyn_cast<ObjcCategoryImplDecl>(D)) {
+ PrintObjcCategoryImplDecl(OID);
+ } else if (ObjcCategoryDecl *OID =
+ dyn_cast<ObjcCategoryDecl>(D)) {
+ PrintObjcCategoryDecl(OID);
} else if (isa<ObjcClassDecl>(D)) {
fprintf(stderr, "@class [printing todo]\n");
+ } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
+ fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName());
} else {
assert(0 && "Unknown decl type!");
}
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index cd78797e2e..b7ec93aaca 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -163,7 +163,7 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration(
// The @ sign was already consumed by ParseObjCInterfaceDeclList().
if (Tok.isObjCAtKeyword(tok::objc_end)) {
ConsumeToken(); // the "end" identifier
- return 0;
+ return CategoryType;
}
Diag(Tok, diag::err_objc_missing_end);
return 0;
@@ -803,7 +803,7 @@ Parser::DeclTy *Parser::ParseObjCAtProtocolDeclaration(SourceLocation AtLoc) {
// The @ sign was already consumed by ParseObjCInterfaceDeclList().
if (Tok.isObjCAtKeyword(tok::objc_end)) {
ConsumeToken(); // the "end" identifier
- return 0;
+ return ProtoType;
}
Diag(Tok, diag::err_objc_missing_end);
return 0;
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index b53996fb86..b6f8332204 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -347,12 +347,12 @@ public:
///
/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
///
-class ObjcClassDecl : public TypeDecl {
+class ObjcClassDecl : public Decl {
ObjcInterfaceDecl **ForwardDecls;
unsigned NumForwardDecls;
public:
ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts)
- : TypeDecl(ObjcClass, L, 0, 0) {
+ : Decl(ObjcClass, L) {
if (nElts) {
ForwardDecls = new ObjcInterfaceDecl*[nElts];
memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*));
diff --git a/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h b/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
index 7b93705d84..b5858ebbb4 100644
--- a/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
+++ b/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
@@ -64,7 +64,6 @@ public:
DISPATCH_CASE(Class,RecordDecl) // FIXME: Refine.
DISPATCH_CASE(Enum,EnumDecl)
DISPATCH_CASE(ObjcInterface,ObjcInterfaceDecl)
- DISPATCH_CASE(ObjcClass,ObjcClassDecl)
DISPATCH_CASE(ObjcProtocol,ObjcProtocolDecl)
default:
assert(false && "Subtype of ScopedDecl not handled.");