]> granicus.if.org Git - clang/commitdiff
Rewrite @selector(sel).
authorSteve Naroff <snaroff@apple.com>
Mon, 5 Nov 2007 14:50:49 +0000 (14:50 +0000)
committerSteve Naroff <snaroff@apple.com>
Mon, 5 Nov 2007 14:50:49 +0000 (14:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43705 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteTest.cpp

index 58de9f60c15911147eb8cee04930f1f2815988bb..dfe3d4e93b4774ce6ba7cab0689826b9be8ce7e0 100644 (file)
@@ -85,6 +85,7 @@ namespace {
     // Expression Rewriting.
     Stmt *RewriteFunctionBody(Stmt *S);
     Stmt *RewriteAtEncode(ObjCEncodeExpr *Exp);
+    Stmt *RewriteAtSelector(ObjCSelectorExpr *Exp);
     Stmt *RewriteMessageExpr(ObjCMessageExpr *Exp);
     Stmt *RewriteObjCStringLiteral(ObjCStringLiteral *Exp);
     CallExpr *SynthesizeCallToFunctionDecl(FunctionDecl *FD, 
@@ -374,6 +375,9 @@ Stmt *RewriteTest::RewriteFunctionBody(Stmt *S) {
   // Handle specific things.
   if (ObjCEncodeExpr *AtEncode = dyn_cast<ObjCEncodeExpr>(S))
     return RewriteAtEncode(AtEncode);
+
+  if (ObjCSelectorExpr *AtSelector = dyn_cast<ObjCSelectorExpr>(S))
+    return RewriteAtSelector(AtSelector);
        
   if (ObjCStringLiteral *AtString = dyn_cast<ObjCStringLiteral>(S))
     return RewriteObjCStringLiteral(AtString);
@@ -414,6 +418,22 @@ Stmt *RewriteTest::RewriteAtEncode(ObjCEncodeExpr *Exp) {
   return Replacement;
 }
 
+Stmt *RewriteTest::RewriteAtSelector(ObjCSelectorExpr *Exp) {
+  assert(SelGetUidFunctionDecl && "Can't find sel_registerName() decl");
+  // Create a call to sel_registerName("selName").
+  llvm::SmallVector<Expr*, 8> SelExprs;
+  QualType argType = Context->getPointerType(Context->CharTy);
+  SelExprs.push_back(new StringLiteral(Exp->getSelector().getName().c_str(),
+                                       Exp->getSelector().getName().size(),
+                                       false, argType, SourceLocation(),
+                                       SourceLocation()));
+  CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
+                                                 &SelExprs[0], SelExprs.size());
+  Rewrite.ReplaceStmt(Exp, SelExp);
+  delete Exp;
+  return SelExp;
+}
+
 CallExpr *RewriteTest::SynthesizeCallToFunctionDecl(
   FunctionDecl *FD, Expr **args, unsigned nargs) {
   // Get the type, we will need to reference it in a couple spots.