зеркало из https://github.com/microsoft/clang-1.git
Add a method prototype slot/getter to the ObjCMessageExpr AST.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43666 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
beaf299a27
Коммит
db611d556f
12
AST/Expr.cpp
12
AST/Expr.cpp
|
@ -871,9 +871,11 @@ unsigned OCUVectorElementExpr::getEncodedElementAccess() const {
|
|||
|
||||
// constructor for instance messages.
|
||||
ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
|
||||
QualType retType, SourceLocation LBrac, SourceLocation RBrac,
|
||||
QualType retType, ObjcMethodDecl *mproto,
|
||||
SourceLocation LBrac, SourceLocation RBrac,
|
||||
Expr **ArgExprs)
|
||||
: Expr(ObjCMessageExprClass, retType), SelName(selInfo), ClassName(0) {
|
||||
: Expr(ObjCMessageExprClass, retType), SelName(selInfo),
|
||||
MethodProto(mproto), ClassName(0) {
|
||||
unsigned numArgs = selInfo.getNumArgs();
|
||||
SubExprs = new Expr*[numArgs+1];
|
||||
SubExprs[RECEIVER] = receiver;
|
||||
|
@ -888,9 +890,11 @@ ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
|
|||
// constructor for class messages.
|
||||
// FIXME: clsName should be typed to ObjCInterfaceType
|
||||
ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo,
|
||||
QualType retType, SourceLocation LBrac, SourceLocation RBrac,
|
||||
QualType retType, ObjcMethodDecl *mproto,
|
||||
SourceLocation LBrac, SourceLocation RBrac,
|
||||
Expr **ArgExprs)
|
||||
: Expr(ObjCMessageExprClass, retType), SelName(selInfo), ClassName(clsName) {
|
||||
: Expr(ObjCMessageExprClass, retType), SelName(selInfo),
|
||||
MethodProto(mproto), ClassName(clsName) {
|
||||
unsigned numArgs = selInfo.getNumArgs();
|
||||
SubExprs = new Expr*[numArgs+1];
|
||||
SubExprs[RECEIVER] = 0;
|
||||
|
|
|
@ -2074,8 +2074,8 @@ Sema::ExprResult Sema::ActOnClassMessage(
|
|||
return true;
|
||||
}
|
||||
}
|
||||
return new ObjCMessageExpr(receiverName, Sel, returnType, lbrac, rbrac,
|
||||
ArgExprs);
|
||||
return new ObjCMessageExpr(receiverName, Sel, returnType, Method,
|
||||
lbrac, rbrac, ArgExprs);
|
||||
}
|
||||
|
||||
// ActOnInstanceMessage - used for both unary and keyword messages.
|
||||
|
@ -2091,9 +2091,10 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
|
|||
Expr *RExpr = static_cast<Expr *>(receiver);
|
||||
QualType receiverType = RExpr->getType();
|
||||
QualType returnType;
|
||||
ObjcMethodDecl *Method;
|
||||
|
||||
if (receiverType == Context.getObjcIdType()) {
|
||||
ObjcMethodDecl *Method = InstanceMethodPool[Sel].Method;
|
||||
Method = InstanceMethodPool[Sel].Method;
|
||||
if (!Method) {
|
||||
Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(),
|
||||
SourceRange(lbrac, rbrac));
|
||||
|
@ -2119,7 +2120,7 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
|
|||
// FIXME: consider using InstanceMethodPool, since it will be faster
|
||||
// than the following method (which can do *many* linear searches). The
|
||||
// idea is to add class info to InstanceMethodPool...
|
||||
ObjcMethodDecl *Method = ClassDecl->lookupInstanceMethod(Sel);
|
||||
Method = ClassDecl->lookupInstanceMethod(Sel);
|
||||
if (!Method) {
|
||||
Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(),
|
||||
SourceRange(lbrac, rbrac));
|
||||
|
@ -2131,5 +2132,6 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
|
|||
return true;
|
||||
}
|
||||
}
|
||||
return new ObjCMessageExpr(RExpr, Sel, returnType, lbrac, rbrac, ArgExprs);
|
||||
return new ObjCMessageExpr(RExpr, Sel, returnType, Method, lbrac, rbrac,
|
||||
ArgExprs);
|
||||
}
|
||||
|
|
|
@ -1181,6 +1181,11 @@ class ObjCMessageExpr : public Expr {
|
|||
// A unigue name for this message.
|
||||
Selector SelName;
|
||||
|
||||
// A method prototype for this message (optional).
|
||||
// FIXME: Since method decls contain the selector, and most messages have a
|
||||
// prototype, consider devising a scheme for unifying SelName/MethodProto.
|
||||
ObjcMethodDecl *MethodProto;
|
||||
|
||||
IdentifierInfo *ClassName; // optional - 0 for instance messages.
|
||||
|
||||
SourceLocation LBracloc, RBracloc;
|
||||
|
@ -1188,11 +1193,13 @@ public:
|
|||
// constructor for class messages.
|
||||
// FIXME: clsName should be typed to ObjCInterfaceType
|
||||
ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo,
|
||||
QualType retType, SourceLocation LBrac, SourceLocation RBrac,
|
||||
QualType retType, ObjcMethodDecl *methDecl,
|
||||
SourceLocation LBrac, SourceLocation RBrac,
|
||||
Expr **ArgExprs);
|
||||
// constructor for instance messages.
|
||||
ObjCMessageExpr(Expr *receiver, Selector selInfo,
|
||||
QualType retType, SourceLocation LBrac, SourceLocation RBrac,
|
||||
QualType retType, ObjcMethodDecl *methDecl,
|
||||
SourceLocation LBrac, SourceLocation RBrac,
|
||||
Expr **ArgExprs);
|
||||
~ObjCMessageExpr() {
|
||||
delete [] SubExprs;
|
||||
|
@ -1203,6 +1210,9 @@ public:
|
|||
|
||||
const Selector &getSelector() const { return SelName; }
|
||||
Selector &getSelector() { return SelName; }
|
||||
|
||||
const ObjcMethodDecl *getMethodDecl() const { return MethodProto; }
|
||||
ObjcMethodDecl *getMethodDecl() { return MethodProto; }
|
||||
|
||||
const IdentifierInfo *getClassName() const { return ClassName; }
|
||||
IdentifierInfo *getClassName() { return ClassName; }
|
||||
|
|
Загрузка…
Ссылка в новой задаче