Progress on message expressions...
- Add ObjcMessageExpr AST node and associated constructors.
- Add SourceLocation's to ActOnKeywordMessage/ActOnUnaryMessage API.
- Instantiate message expressions...
- Replace alloca usage with SmallString.
Next step, installing a correct type, among other tweaks...
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42116 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Expr.cpp b/AST/Expr.cpp
index 620c29b..08773e8 100644
--- a/AST/Expr.cpp
+++ b/AST/Expr.cpp
@@ -15,6 +15,8 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/StmtVisitor.h"
#include "clang/Lex/IdentifierTable.h"
+// is this bad layering? I (snaroff) don't think so. Want Chris to weigh in.
+#include "clang/Parse/DeclSpec.h"
using namespace clang;
//===----------------------------------------------------------------------===//
@@ -854,6 +856,52 @@
return Result;
}
+// constructor for unary messages.
+ObjCMessageExpr::ObjCMessageExpr(
+ IdentifierInfo *clsName, SelectorInfo &methName, QualType retType,
+ SourceLocation LBrac, SourceLocation RBrac)
+ : Expr(ObjCMessageExprClass, retType), Selector(methName) {
+ ClassName = clsName;
+ LBracloc = LBrac;
+ RBracloc = RBrac;
+}
+
+ObjCMessageExpr::ObjCMessageExpr(
+ Expr *fn, SelectorInfo &methName, QualType retType,
+ SourceLocation LBrac, SourceLocation RBrac)
+ : Expr(ObjCMessageExprClass, retType), Selector(methName), ClassName(0) {
+ SubExprs = new Expr*[1];
+ SubExprs[RECEIVER] = fn;
+ LBracloc = LBrac;
+ RBracloc = RBrac;
+}
+
+// constructor for keyword messages.
+ObjCMessageExpr::ObjCMessageExpr(
+ Expr *fn, SelectorInfo &selInfo, ObjcKeywordMessage *keys, unsigned numargs,
+ QualType retType, SourceLocation LBrac, SourceLocation RBrac)
+ : Expr(ObjCMessageExprClass, retType), Selector(selInfo), ClassName(0) {
+ SubExprs = new Expr*[numargs+1];
+ SubExprs[RECEIVER] = fn;
+ for (unsigned i = 0; i != numargs; ++i)
+ SubExprs[i+ARGS_START] = static_cast<Expr *>(keys[i].KeywordExpr);
+ LBracloc = LBrac;
+ RBracloc = RBrac;
+}
+
+ObjCMessageExpr::ObjCMessageExpr(
+ IdentifierInfo *clsName, SelectorInfo &selInfo, ObjcKeywordMessage *keys,
+ unsigned numargs, QualType retType, SourceLocation LBrac, SourceLocation RBrac)
+ : Expr(ObjCMessageExprClass, retType), Selector(selInfo), ClassName(clsName) {
+ SubExprs = new Expr*[numargs+1];
+ SubExprs[RECEIVER] = 0;
+ for (unsigned i = 0; i != numargs; ++i)
+ SubExprs[i+ARGS_START] = static_cast<Expr *>(keys[i].KeywordExpr);
+ LBracloc = LBrac;
+ RBracloc = RBrac;
+}
+
+
//===----------------------------------------------------------------------===//
// Child Iterators for iterating over subexpressions/substatements
//===----------------------------------------------------------------------===//
@@ -1023,3 +1071,11 @@
Stmt::child_iterator ObjCEncodeExpr::child_begin() { return NULL; }
Stmt::child_iterator ObjCEncodeExpr::child_end() { return NULL; }
+// ObjCMessageExpr
+Stmt::child_iterator ObjCMessageExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&SubExprs[0]);
+}
+Stmt::child_iterator ObjCMessageExpr::child_end() {
+ return reinterpret_cast<Stmt**>(&SubExprs[NumArgs+ARGS_START]);
+}
+