From e90597f593675b89421590d4ad60dc76ec7efdc1 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 8 Oct 2007 18:53:38 +0000 Subject: [PATCH] Several small patches to do pretty printing for objective-c top-level decls (minimal printing), Derive ObjcClassDecl from Decl. Ted may want to take note of the change I made to CFGRecStmtDeclVisitor.h llvm-svn: 42764 --- clang/Driver/ASTConsumers.cpp | 32 +++++++++++++++++-- clang/Parse/ParseObjc.cpp | 4 +-- clang/include/clang/AST/DeclObjC.h | 4 +-- .../Analysis/Visitors/CFGRecStmtDeclVisitor.h | 1 - 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index ddacfa88c1b4..a52cd4511aa3 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/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(D)) { PrintTypeDefDecl(TD); - } else if (ScopedDecl *SD = dyn_cast(D)) { - fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName()); } else if (ObjcInterfaceDecl *OID = dyn_cast(D)) { PrintObjcInterfaceDecl(OID); + } else if (ObjcProtocolDecl *PID = dyn_cast(D)) { + PrintObjcProtocolDecl(PID); } else if (ObjcForwardProtocolDecl *OFPD = dyn_cast(D)) { fprintf(stderr, "@protocol "); @@ -109,8 +129,16 @@ namespace { dyn_cast(D)) { fprintf(stderr, "@implementation %s [printing todo]\n", OID->getName()); + } else if (ObjcCategoryImplDecl *OID = + dyn_cast(D)) { + PrintObjcCategoryImplDecl(OID); + } else if (ObjcCategoryDecl *OID = + dyn_cast(D)) { + PrintObjcCategoryDecl(OID); } else if (isa(D)) { fprintf(stderr, "@class [printing todo]\n"); + } else if (ScopedDecl *SD = dyn_cast(D)) { + fprintf(stderr, "Read top-level variable decl: '%s'\n", SD->getName()); } else { assert(0 && "Unknown decl type!"); } diff --git a/clang/Parse/ParseObjc.cpp b/clang/Parse/ParseObjc.cpp index cd78797e2ecd..b7ec93aacaca 100644 --- a/clang/Parse/ParseObjc.cpp +++ b/clang/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/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index b53996fb868c..b6f83322044f 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/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/clang/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h b/clang/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h index 7b93705d8499..b5858ebbb4a0 100644 --- a/clang/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h +++ b/clang/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.");