r186369 - ObjC migrator: build conforming interface
Fariborz Jahanian
fjahanian at apple.com
Mon Jul 15 17:20:21 PDT 2013
Author: fjahanian
Date: Mon Jul 15 19:20:21 2013
New Revision: 186369
URL: http://llvm.org/viewvc/llvm-project?rev=186369&view=rev
Log:
ObjC migrator: build conforming interface
declaration (not yet used). wip.
Modified:
cfe/trunk/include/clang/Edit/Rewriters.h
cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp
Modified: cfe/trunk/include/clang/Edit/Rewriters.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/Rewriters.h?rev=186369&r1=186368&r2=186369&view=diff
==============================================================================
--- cfe/trunk/include/clang/Edit/Rewriters.h (original)
+++ cfe/trunk/include/clang/Edit/Rewriters.h Mon Jul 15 19:20:21 2013
@@ -9,10 +9,13 @@
#ifndef LLVM_CLANG_EDIT_REWRITERS_H
#define LLVM_CLANG_EDIT_REWRITERS_H
+#include "llvm/ADT/SmallVector.h"
namespace clang {
class ObjCMessageExpr;
class ObjCMethodDecl;
+ class ObjCInterfaceDecl;
+ class ObjCProtocolDecl;
class NSAPI;
class ParentMap;
@@ -29,6 +32,9 @@ bool rewriteToObjCLiteralSyntax(const Ob
bool rewriteToObjCProperty(const ObjCMethodDecl *Getter,
const ObjCMethodDecl *Setter,
const NSAPI &NS, Commit &commit);
+bool rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl,
+ llvm::SmallVectorImpl<ObjCProtocolDecl*> &Protocols,
+ const NSAPI &NS, Commit &commit);
bool rewriteToObjCSubscriptSyntax(const ObjCMessageExpr *Msg,
const NSAPI &NS, Commit &commit);
Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=186369&r1=186368&r2=186369&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Mon Jul 15 19:20:21 2013
@@ -250,6 +250,8 @@ ClassImplementsAllMethodsAndProperties(A
if (Property->getPropertyImplementation() == ObjCPropertyDecl::Optional)
continue;
DeclContext::lookup_const_result R = IDecl->lookup(Property->getDeclName());
+ if (R.size() == 0)
+ return false;
for (unsigned I = 0, N = R.size(); I != N; ++I) {
if (ObjCPropertyDecl *ClassProperty = dyn_cast<ObjCPropertyDecl>(R[0])) {
if (ClassProperty->getPropertyAttributes()
@@ -263,14 +265,20 @@ ClassImplementsAllMethodsAndProperties(A
// At this point, all required properties in this protocol conform to those
// declared in the class.
// Check that class implements the required methods of the protocol too.
- if (const ObjCProtocolDecl *PDecl = Protocol->getDefinition())
+ if (const ObjCProtocolDecl *PDecl = Protocol->getDefinition()) {
+ if (PDecl->meth_begin() == PDecl->meth_end())
+ return false;
for (ObjCContainerDecl::method_iterator M = PDecl->meth_begin(),
MEnd = PDecl->meth_end(); M != MEnd; ++M) {
ObjCMethodDecl *MD = (*M);
+ if (MD->isImplicit())
+ continue;
if (MD->getImplementationControl() == ObjCMethodDecl::Optional)
continue;
bool match = false;
DeclContext::lookup_const_result R = ImpDecl->lookup(MD->getDeclName());
+ if (R.size() == 0)
+ return false;
for (unsigned I = 0, N = R.size(); I != N; ++I)
if (ObjCMethodDecl *ImpMD = dyn_cast<ObjCMethodDecl>(R[0]))
if (Ctx.ObjCMethodsAreEqual(MD, ImpMD)) {
@@ -280,6 +288,7 @@ ClassImplementsAllMethodsAndProperties(A
if (!match)
return false;
}
+ }
return true;
}
@@ -312,6 +321,12 @@ void ObjCMigrateASTConsumer::migrateProt
if (ClassImplementsAllMethodsAndProperties(Ctx, ImpDecl, IDecl,
PotentialImplicitProtocols[i]))
ConformingProtocols.push_back(PotentialImplicitProtocols[i]);
+
+ if (ConformingProtocols.empty())
+ return;
+ edit::Commit commit(*Editor);
+ edit::rewriteToObjCInterfaceDecl(IDecl, ConformingProtocols, *NSAPIObj, commit);
+ Editor->commit(commit);
}
namespace {
Modified: cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp?rev=186369&r1=186368&r2=186369&view=diff
==============================================================================
--- cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp (original)
+++ cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp Mon Jul 15 19:20:21 2013
@@ -402,6 +402,38 @@ bool edit::rewriteToObjCProperty(const O
return true;
}
+bool edit::rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl,
+ llvm::SmallVectorImpl<ObjCProtocolDecl*> &ConformingProtocols,
+ const NSAPI &NS, Commit &commit) {
+ const ObjCList<ObjCProtocolDecl> &Protocols = IDecl->getReferencedProtocols();
+
+ // ASTContext &Context = NS.getASTContext();
+ std::string ClassString = "@interface ";
+ ClassString += IDecl->getNameAsString();
+
+ if (IDecl->getSuperClass()) {
+ ClassString += " : ";
+ ClassString += IDecl->getSuperClass()->getNameAsString();
+ }
+ if (Protocols.empty())
+ ClassString += '<';
+
+ for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
+ E = Protocols.end(); I != E; ++I) {
+ ClassString += (I == Protocols.begin() ? '<' : ',');
+ ClassString += (*I)->getNameAsString();
+ }
+ if (!Protocols.empty())
+ ClassString += ',';
+ for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) {
+ ClassString += ConformingProtocols[i]->getNameAsString();
+ if (i != (e-1))
+ ClassString += ',';
+ }
+ ClassString += "> ";
+ return true;
+}
+
/// \brief Returns true if the immediate message arguments of \c Msg should not
/// be rewritten because it will interfere with the rewrite of the parent
/// message expression. e.g.
More information about the cfe-commits
mailing list