aboutsummaryrefslogtreecommitdiff
path: root/Driver/RewriteTest.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2007-11-05 14:50:49 +0000
committerSteve Naroff <snaroff@apple.com>2007-11-05 14:50:49 +0000
commitb42f8415bcfb84c208fd577458ce1bbc2cd800fe (patch)
treec3e242df0f785545a673919dad43ab2a5712386f /Driver/RewriteTest.cpp
parent352336bb0a480b044eb03e7359e73d3b173d9cdd (diff)
Rewrite @selector(sel).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Driver/RewriteTest.cpp')
-rw-r--r--Driver/RewriteTest.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index 58de9f60c1..dfe3d4e93b 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -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.