forked from OSchip/llvm-project
Add IsImplicit field in ObjCMessageExpr that is true when the message
was constructed, e.g. for a property access. This allows the selector identifier locations machinery for ObjCMessageExpr to function correctly, in that there are not real locations to handle/report for such a message. llvm-svn: 148013
This commit is contained in:
parent
7e79129d15
commit
a80f1bf262
|
@ -288,7 +288,11 @@ public:
|
|||
return SourceRange(getLocation(), EndLoc);
|
||||
}
|
||||
|
||||
SourceLocation getSelectorStartLoc() const { return getSelectorLoc(0); }
|
||||
SourceLocation getSelectorStartLoc() const {
|
||||
if (isImplicit())
|
||||
return getLocStart();
|
||||
return getSelectorLoc(0);
|
||||
}
|
||||
SourceLocation getSelectorLoc(unsigned Index) const {
|
||||
assert(Index < getNumSelectorLocs() && "Index out of range!");
|
||||
if (hasStandardSelLocs())
|
||||
|
|
|
@ -487,7 +487,11 @@ class ObjCMessageExpr : public Expr {
|
|||
/// \brief Whether this message send is a "delegate init call",
|
||||
/// i.e. a call of an init method on self from within an init method.
|
||||
unsigned IsDelegateInitCall : 1;
|
||||
|
||||
|
||||
/// \brief Whether this message send was implicitly generated by
|
||||
/// the implementation rather than explicitly written by the user.
|
||||
unsigned IsImplicit : 1;
|
||||
|
||||
/// \brief Whether the locations of the selector identifiers are in a
|
||||
/// "standard" position, a enum SelectorLocationsKind.
|
||||
unsigned SelLocsKind : 2;
|
||||
|
@ -502,7 +506,7 @@ class ObjCMessageExpr : public Expr {
|
|||
|
||||
ObjCMessageExpr(EmptyShell Empty, unsigned NumArgs)
|
||||
: Expr(ObjCMessageExprClass, Empty), SelectorOrMethod(0), Kind(0),
|
||||
HasMethod(0), IsDelegateInitCall(0) {
|
||||
HasMethod(0), IsDelegateInitCall(0), IsImplicit(0), SelLocsKind(0) {
|
||||
setNumArgs(NumArgs);
|
||||
}
|
||||
|
||||
|
@ -516,7 +520,8 @@ class ObjCMessageExpr : public Expr {
|
|||
SelectorLocationsKind SelLocsK,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit);
|
||||
ObjCMessageExpr(QualType T, ExprValueKind VK,
|
||||
SourceLocation LBracLoc,
|
||||
TypeSourceInfo *Receiver,
|
||||
|
@ -525,7 +530,8 @@ class ObjCMessageExpr : public Expr {
|
|||
SelectorLocationsKind SelLocsK,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit);
|
||||
ObjCMessageExpr(QualType T, ExprValueKind VK,
|
||||
SourceLocation LBracLoc,
|
||||
Expr *Receiver,
|
||||
|
@ -534,7 +540,8 @@ class ObjCMessageExpr : public Expr {
|
|||
SelectorLocationsKind SelLocsK,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit);
|
||||
|
||||
void initArgsAndSelLocs(ArrayRef<Expr *> Args,
|
||||
ArrayRef<SourceLocation> SelLocs,
|
||||
|
@ -635,7 +642,8 @@ public:
|
|||
ArrayRef<SourceLocation> SelLocs,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit);
|
||||
|
||||
/// \brief Create a class message send.
|
||||
///
|
||||
|
@ -670,7 +678,8 @@ public:
|
|||
ArrayRef<SourceLocation> SelLocs,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit);
|
||||
|
||||
/// \brief Create an instance message send.
|
||||
///
|
||||
|
@ -705,7 +714,8 @@ public:
|
|||
ArrayRef<SourceLocation> SeLocs,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit);
|
||||
|
||||
/// \brief Create an empty Objective-C message expression, to be
|
||||
/// filled in by subsequent calls.
|
||||
|
@ -718,6 +728,11 @@ public:
|
|||
unsigned NumArgs,
|
||||
unsigned NumStoredSelLocs);
|
||||
|
||||
/// \brief Indicates whether the message send was implicitly
|
||||
/// generated by the implementation. If false, it was written explicitly
|
||||
/// in the source code.
|
||||
bool isImplicit() const { return IsImplicit; }
|
||||
|
||||
/// \brief Determine the kind of receiver that this message is being
|
||||
/// sent to.
|
||||
ReceiverKind getReceiverKind() const { return (ReceiverKind)Kind; }
|
||||
|
@ -887,7 +902,11 @@ public:
|
|||
SourceLocation getLeftLoc() const { return LBracLoc; }
|
||||
SourceLocation getRightLoc() const { return RBracLoc; }
|
||||
|
||||
SourceLocation getSelectorStartLoc() const { return getSelectorLoc(0); }
|
||||
SourceLocation getSelectorStartLoc() const {
|
||||
if (isImplicit())
|
||||
return getLocStart();
|
||||
return getSelectorLoc(0);
|
||||
}
|
||||
SourceLocation getSelectorLoc(unsigned Index) const {
|
||||
assert(Index < getNumSelectorLocs() && "Index out of range!");
|
||||
if (hasStandardSelLocs())
|
||||
|
@ -902,6 +921,8 @@ public:
|
|||
void getSelectorLocs(SmallVectorImpl<SourceLocation> &SelLocs) const;
|
||||
|
||||
unsigned getNumSelectorLocs() const {
|
||||
if (isImplicit())
|
||||
return 0;
|
||||
Selector Sel = getSelector();
|
||||
if (Sel.isUnarySelector())
|
||||
return 1;
|
||||
|
|
|
@ -5465,7 +5465,15 @@ public:
|
|||
SourceLocation LBracLoc,
|
||||
ArrayRef<SourceLocation> SelectorLocs,
|
||||
SourceLocation RBracLoc,
|
||||
MultiExprArg Args);
|
||||
MultiExprArg Args,
|
||||
bool isImplicit = false);
|
||||
|
||||
ExprResult BuildClassMessageImplicit(QualType ReceiverType,
|
||||
bool isSuperReceiver,
|
||||
SourceLocation Loc,
|
||||
Selector Sel,
|
||||
ObjCMethodDecl *Method,
|
||||
MultiExprArg Args);
|
||||
|
||||
ExprResult ActOnClassMessage(Scope *S,
|
||||
ParsedType Receiver,
|
||||
|
@ -5483,7 +5491,15 @@ public:
|
|||
SourceLocation LBracLoc,
|
||||
ArrayRef<SourceLocation> SelectorLocs,
|
||||
SourceLocation RBracLoc,
|
||||
MultiExprArg Args);
|
||||
MultiExprArg Args,
|
||||
bool isImplicit = false);
|
||||
|
||||
ExprResult BuildInstanceMessageImplicit(Expr *Receiver,
|
||||
QualType ReceiverType,
|
||||
SourceLocation Loc,
|
||||
Selector Sel,
|
||||
ObjCMethodDecl *Method,
|
||||
MultiExprArg Args);
|
||||
|
||||
ExprResult ActOnInstanceMessage(Scope *S,
|
||||
Expr *Receiver,
|
||||
|
|
|
@ -2789,7 +2789,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|||
SelectorLocationsKind SelLocsK,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc)
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit)
|
||||
: Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
|
||||
/*TypeDependent=*/false, /*ValueDependent=*/false,
|
||||
/*InstantiationDependent=*/false,
|
||||
|
@ -2797,8 +2798,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|||
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
|
||||
: Sel.getAsOpaquePtr())),
|
||||
Kind(IsInstanceSuper? SuperInstance : SuperClass),
|
||||
HasMethod(Method != 0), IsDelegateInitCall(false), SuperLoc(SuperLoc),
|
||||
LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
||||
HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit),
|
||||
SuperLoc(SuperLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
||||
{
|
||||
initArgsAndSelLocs(Args, SelLocs, SelLocsK);
|
||||
setReceiverPointer(SuperType.getAsOpaquePtr());
|
||||
|
@ -2813,14 +2814,15 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|||
SelectorLocationsKind SelLocsK,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc)
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit)
|
||||
: Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
|
||||
T->isDependentType(), T->isInstantiationDependentType(),
|
||||
T->containsUnexpandedParameterPack()),
|
||||
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
|
||||
: Sel.getAsOpaquePtr())),
|
||||
Kind(Class),
|
||||
HasMethod(Method != 0), IsDelegateInitCall(false),
|
||||
HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit),
|
||||
LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
||||
{
|
||||
initArgsAndSelLocs(Args, SelLocs, SelLocsK);
|
||||
|
@ -2836,7 +2838,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|||
SelectorLocationsKind SelLocsK,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc)
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit)
|
||||
: Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(),
|
||||
Receiver->isTypeDependent(),
|
||||
Receiver->isInstantiationDependent(),
|
||||
|
@ -2844,7 +2847,7 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|||
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
|
||||
: Sel.getAsOpaquePtr())),
|
||||
Kind(Instance),
|
||||
HasMethod(Method != 0), IsDelegateInitCall(false),
|
||||
HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit),
|
||||
LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
||||
{
|
||||
initArgsAndSelLocs(Args, SelLocs, SelLocsK);
|
||||
|
@ -2884,12 +2887,19 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|||
ArrayRef<SourceLocation> SelLocs,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc) {
|
||||
SelectorLocationsKind SelLocsK;
|
||||
ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit) {
|
||||
assert((!SelLocs.empty() || isImplicit) &&
|
||||
"No selector locs for non-implicit message");
|
||||
ObjCMessageExpr *Mem;
|
||||
SelectorLocationsKind SelLocsK = SelectorLocationsKind();
|
||||
if (isImplicit)
|
||||
Mem = alloc(Context, Args.size(), 0);
|
||||
else
|
||||
Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
||||
return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
|
||||
SuperType, Sel, SelLocs, SelLocsK,
|
||||
Method, Args, RBracLoc);
|
||||
Method, Args, RBracLoc, isImplicit);
|
||||
}
|
||||
|
||||
ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
||||
|
@ -2900,11 +2910,19 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|||
ArrayRef<SourceLocation> SelLocs,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc) {
|
||||
SelectorLocationsKind SelLocsK;
|
||||
ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit) {
|
||||
assert((!SelLocs.empty() || isImplicit) &&
|
||||
"No selector locs for non-implicit message");
|
||||
ObjCMessageExpr *Mem;
|
||||
SelectorLocationsKind SelLocsK = SelectorLocationsKind();
|
||||
if (isImplicit)
|
||||
Mem = alloc(Context, Args.size(), 0);
|
||||
else
|
||||
Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
||||
return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel,
|
||||
SelLocs, SelLocsK, Method, Args, RBracLoc);
|
||||
SelLocs, SelLocsK, Method, Args, RBracLoc,
|
||||
isImplicit);
|
||||
}
|
||||
|
||||
ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
||||
|
@ -2915,11 +2933,19 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|||
ArrayRef<SourceLocation> SelLocs,
|
||||
ObjCMethodDecl *Method,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RBracLoc) {
|
||||
SelectorLocationsKind SelLocsK;
|
||||
ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
||||
SourceLocation RBracLoc,
|
||||
bool isImplicit) {
|
||||
assert((!SelLocs.empty() || isImplicit) &&
|
||||
"No selector locs for non-implicit message");
|
||||
ObjCMessageExpr *Mem;
|
||||
SelectorLocationsKind SelLocsK = SelectorLocationsKind();
|
||||
if (isImplicit)
|
||||
Mem = alloc(Context, Args.size(), 0);
|
||||
else
|
||||
Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
||||
return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel,
|
||||
SelLocs, SelLocsK, Method, Args, RBracLoc);
|
||||
SelLocs, SelLocsK, Method, Args, RBracLoc,
|
||||
isImplicit);
|
||||
}
|
||||
|
||||
ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
|
||||
|
|
|
@ -1299,7 +1299,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *PseudoOp) {
|
|||
SelLocs,
|
||||
OldMsg->getMethodDecl(),
|
||||
RHS,
|
||||
OldMsg->getRightLoc());
|
||||
OldMsg->getRightLoc(),
|
||||
OldMsg->isImplicit());
|
||||
break;
|
||||
|
||||
case ObjCMessageExpr::Instance:
|
||||
|
@ -1311,7 +1312,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *PseudoOp) {
|
|||
SelLocs,
|
||||
OldMsg->getMethodDecl(),
|
||||
RHS,
|
||||
OldMsg->getRightLoc());
|
||||
OldMsg->getRightLoc(),
|
||||
OldMsg->isImplicit());
|
||||
break;
|
||||
|
||||
case ObjCMessageExpr::SuperClass:
|
||||
|
@ -1326,7 +1328,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *PseudoOp) {
|
|||
SelLocs,
|
||||
OldMsg->getMethodDecl(),
|
||||
RHS,
|
||||
OldMsg->getRightLoc());
|
||||
OldMsg->getRightLoc(),
|
||||
OldMsg->isImplicit());
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1372,7 +1375,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(PseudoObjectExpr *PseudoOp) {
|
|||
SelLocs,
|
||||
OldMsg->getMethodDecl(),
|
||||
Args,
|
||||
OldMsg->getRightLoc());
|
||||
OldMsg->getRightLoc(),
|
||||
OldMsg->isImplicit());
|
||||
break;
|
||||
|
||||
case ObjCMessageExpr::Instance:
|
||||
|
@ -1384,7 +1388,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(PseudoObjectExpr *PseudoOp) {
|
|||
SelLocs,
|
||||
OldMsg->getMethodDecl(),
|
||||
Args,
|
||||
OldMsg->getRightLoc());
|
||||
OldMsg->getRightLoc(),
|
||||
OldMsg->isImplicit());
|
||||
break;
|
||||
|
||||
case ObjCMessageExpr::SuperClass:
|
||||
|
@ -1399,7 +1404,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(PseudoObjectExpr *PseudoOp) {
|
|||
SelLocs,
|
||||
OldMsg->getMethodDecl(),
|
||||
Args,
|
||||
OldMsg->getRightLoc());
|
||||
OldMsg->getRightLoc(),
|
||||
OldMsg->isImplicit());
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1010,6 +1010,24 @@ ExprResult Sema::ActOnSuperMessage(Scope *S,
|
|||
LBracLoc, SelectorLocs, RBracLoc, move(Args));
|
||||
}
|
||||
|
||||
|
||||
ExprResult Sema::BuildClassMessageImplicit(QualType ReceiverType,
|
||||
bool isSuperReceiver,
|
||||
SourceLocation Loc,
|
||||
Selector Sel,
|
||||
ObjCMethodDecl *Method,
|
||||
MultiExprArg Args) {
|
||||
TypeSourceInfo *receiverTypeInfo = 0;
|
||||
if (!ReceiverType.isNull())
|
||||
receiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType);
|
||||
|
||||
return BuildClassMessage(receiverTypeInfo, ReceiverType,
|
||||
/*SuperLoc=*/isSuperReceiver ? Loc : SourceLocation(),
|
||||
Sel, Method, Loc, Loc, Loc, Args,
|
||||
/*isImplicit=*/true);
|
||||
|
||||
}
|
||||
|
||||
/// \brief Build an Objective-C class message expression.
|
||||
///
|
||||
/// This routine takes care of both normal class messages and
|
||||
|
@ -1046,7 +1064,8 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
|
|||
SourceLocation LBracLoc,
|
||||
ArrayRef<SourceLocation> SelectorLocs,
|
||||
SourceLocation RBracLoc,
|
||||
MultiExprArg ArgsIn) {
|
||||
MultiExprArg ArgsIn,
|
||||
bool isImplicit) {
|
||||
SourceLocation Loc = SuperLoc.isValid()? SuperLoc
|
||||
: ReceiverTypeInfo->getTypeLoc().getSourceRange().getBegin();
|
||||
if (LBracLoc.isInvalid()) {
|
||||
|
@ -1064,7 +1083,8 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
|
|||
return Owned(ObjCMessageExpr::Create(Context, ReceiverType,
|
||||
VK_RValue, LBracLoc, ReceiverTypeInfo,
|
||||
Sel, SelectorLocs, /*Method=*/0,
|
||||
makeArrayRef(Args, NumArgs),RBracLoc));
|
||||
makeArrayRef(Args, NumArgs),RBracLoc,
|
||||
isImplicit));
|
||||
}
|
||||
|
||||
// Find the class to which we are sending this message.
|
||||
|
@ -1130,12 +1150,12 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo,
|
|||
SuperLoc, /*IsInstanceSuper=*/false,
|
||||
ReceiverType, Sel, SelectorLocs,
|
||||
Method, makeArrayRef(Args, NumArgs),
|
||||
RBracLoc);
|
||||
RBracLoc, isImplicit);
|
||||
else
|
||||
Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
|
||||
ReceiverTypeInfo, Sel, SelectorLocs,
|
||||
Method, makeArrayRef(Args, NumArgs),
|
||||
RBracLoc);
|
||||
RBracLoc, isImplicit);
|
||||
return MaybeBindToTemporary(Result);
|
||||
}
|
||||
|
||||
|
@ -1163,6 +1183,18 @@ ExprResult Sema::ActOnClassMessage(Scope *S,
|
|||
LBracLoc, SelectorLocs, RBracLoc, move(Args));
|
||||
}
|
||||
|
||||
ExprResult Sema::BuildInstanceMessageImplicit(Expr *Receiver,
|
||||
QualType ReceiverType,
|
||||
SourceLocation Loc,
|
||||
Selector Sel,
|
||||
ObjCMethodDecl *Method,
|
||||
MultiExprArg Args) {
|
||||
return BuildInstanceMessage(Receiver, ReceiverType,
|
||||
/*SuperLoc=*/!Receiver ? Loc : SourceLocation(),
|
||||
Sel, Method, Loc, Loc, Loc, Args,
|
||||
/*isImplicit=*/true);
|
||||
}
|
||||
|
||||
/// \brief Build an Objective-C instance message expression.
|
||||
///
|
||||
/// This routine takes care of both normal instance messages and
|
||||
|
@ -1199,7 +1231,8 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
|
|||
SourceLocation LBracLoc,
|
||||
ArrayRef<SourceLocation> SelectorLocs,
|
||||
SourceLocation RBracLoc,
|
||||
MultiExprArg ArgsIn) {
|
||||
MultiExprArg ArgsIn,
|
||||
bool isImplicit) {
|
||||
// The location of the receiver.
|
||||
SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart();
|
||||
|
||||
|
@ -1232,7 +1265,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
|
|||
VK_RValue, LBracLoc, Receiver, Sel,
|
||||
SelectorLocs, /*Method=*/0,
|
||||
makeArrayRef(Args, NumArgs),
|
||||
RBracLoc));
|
||||
RBracLoc, isImplicit));
|
||||
}
|
||||
|
||||
// If necessary, apply function/array conversion to the receiver.
|
||||
|
@ -1522,11 +1555,13 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
|
|||
Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
|
||||
SuperLoc, /*IsInstanceSuper=*/true,
|
||||
ReceiverType, Sel, SelectorLocs, Method,
|
||||
makeArrayRef(Args, NumArgs), RBracLoc);
|
||||
makeArrayRef(Args, NumArgs), RBracLoc,
|
||||
isImplicit);
|
||||
else
|
||||
Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc,
|
||||
Receiver, Sel, SelectorLocs, Method,
|
||||
makeArrayRef(Args, NumArgs), RBracLoc);
|
||||
makeArrayRef(Args, NumArgs), RBracLoc,
|
||||
isImplicit);
|
||||
|
||||
if (getLangOptions().ObjCAutoRefCount) {
|
||||
// In ARC, annotate delegate init calls.
|
||||
|
|
|
@ -492,11 +492,9 @@ ExprResult ObjCPropertyOpBuilder::buildGet() {
|
|||
assert(Getter);
|
||||
|
||||
QualType receiverType;
|
||||
SourceLocation superLoc;
|
||||
if (RefExpr->isClassReceiver()) {
|
||||
receiverType = S.Context.getObjCInterfaceType(RefExpr->getClassReceiver());
|
||||
} else if (RefExpr->isSuperReceiver()) {
|
||||
superLoc = RefExpr->getReceiverLocation();
|
||||
receiverType = RefExpr->getSuperReceiverType();
|
||||
} else {
|
||||
assert(InstanceReceiver);
|
||||
|
@ -507,19 +505,14 @@ ExprResult ObjCPropertyOpBuilder::buildGet() {
|
|||
ExprResult msg;
|
||||
if (Getter->isInstanceMethod() || RefExpr->isObjectReceiver()) {
|
||||
assert(InstanceReceiver || RefExpr->isSuperReceiver());
|
||||
msg = S.BuildInstanceMessage(InstanceReceiver, receiverType, superLoc,
|
||||
Getter->getSelector(), Getter,
|
||||
GenericLoc, GenericLoc, GenericLoc,
|
||||
MultiExprArg());
|
||||
msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType,
|
||||
GenericLoc, Getter->getSelector(),
|
||||
Getter, MultiExprArg());
|
||||
} else {
|
||||
TypeSourceInfo *receiverTypeInfo = 0;
|
||||
if (!RefExpr->isSuperReceiver())
|
||||
receiverTypeInfo = S.Context.getTrivialTypeSourceInfo(receiverType);
|
||||
|
||||
msg = S.BuildClassMessage(receiverTypeInfo, receiverType, superLoc,
|
||||
Getter->getSelector(), Getter,
|
||||
GenericLoc, GenericLoc, GenericLoc,
|
||||
MultiExprArg());
|
||||
msg = S.BuildClassMessageImplicit(receiverType, RefExpr->isSuperReceiver(),
|
||||
GenericLoc,
|
||||
Getter->getSelector(), Getter,
|
||||
MultiExprArg());
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
@ -534,11 +527,9 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc,
|
|||
assert(hasSetter); (void) hasSetter;
|
||||
|
||||
QualType receiverType;
|
||||
SourceLocation superLoc;
|
||||
if (RefExpr->isClassReceiver()) {
|
||||
receiverType = S.Context.getObjCInterfaceType(RefExpr->getClassReceiver());
|
||||
} else if (RefExpr->isSuperReceiver()) {
|
||||
superLoc = RefExpr->getReceiverLocation();
|
||||
receiverType = RefExpr->getSuperReceiverType();
|
||||
} else {
|
||||
assert(InstanceReceiver);
|
||||
|
@ -570,19 +561,14 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc,
|
|||
// Build a message-send.
|
||||
ExprResult msg;
|
||||
if (Setter->isInstanceMethod() || RefExpr->isObjectReceiver()) {
|
||||
msg = S.BuildInstanceMessage(InstanceReceiver, receiverType, superLoc,
|
||||
SetterSelector, Setter,
|
||||
GenericLoc, GenericLoc, GenericLoc,
|
||||
MultiExprArg(args, 1));
|
||||
msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType,
|
||||
GenericLoc, SetterSelector, Setter,
|
||||
MultiExprArg(args, 1));
|
||||
} else {
|
||||
TypeSourceInfo *receiverTypeInfo = 0;
|
||||
if (!RefExpr->isSuperReceiver())
|
||||
receiverTypeInfo = S.Context.getTrivialTypeSourceInfo(receiverType);
|
||||
|
||||
msg = S.BuildClassMessage(receiverTypeInfo, receiverType, superLoc,
|
||||
SetterSelector, Setter,
|
||||
GenericLoc, GenericLoc, GenericLoc,
|
||||
MultiExprArg(args, 1));
|
||||
msg = S.BuildClassMessageImplicit(receiverType, RefExpr->isSuperReceiver(),
|
||||
GenericLoc,
|
||||
SetterSelector, Setter,
|
||||
MultiExprArg(args, 1));
|
||||
}
|
||||
|
||||
if (!msg.isInvalid() && captureSetValueAsResult) {
|
||||
|
|
|
@ -879,6 +879,7 @@ void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
|
|||
unsigned NumStoredSelLocs = Record[Idx++];
|
||||
E->SelLocsKind = Record[Idx++];
|
||||
E->setDelegateInitCall(Record[Idx++]);
|
||||
E->IsImplicit = Record[Idx++];
|
||||
ObjCMessageExpr::ReceiverKind Kind
|
||||
= static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
|
||||
switch (Kind) {
|
||||
|
|
|
@ -848,6 +848,7 @@ void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
|
|||
Record.push_back(E->getNumStoredSelLocs());
|
||||
Record.push_back(E->SelLocsKind);
|
||||
Record.push_back(E->isDelegateInitCall());
|
||||
Record.push_back(E->IsImplicit);
|
||||
Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
|
||||
switch (E->getReceiverKind()) {
|
||||
case ObjCMessageExpr::Instance:
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#include "IndexingContext.h"
|
||||
|
||||
#include "clang/AST/RecursiveASTVisitor.h"
|
||||
#include "clang/Analysis/Support/SaveAndRestore.h"
|
||||
|
||||
using namespace clang;
|
||||
using namespace cxindex;
|
||||
|
@ -21,14 +20,12 @@ class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> {
|
|||
IndexingContext &IndexCtx;
|
||||
const NamedDecl *Parent;
|
||||
const DeclContext *ParentDC;
|
||||
bool InPseudoObject;
|
||||
|
||||
typedef RecursiveASTVisitor<BodyIndexer> base;
|
||||
public:
|
||||
BodyIndexer(IndexingContext &indexCtx,
|
||||
const NamedDecl *Parent, const DeclContext *DC)
|
||||
: IndexCtx(indexCtx), Parent(Parent), ParentDC(DC),
|
||||
InPseudoObject(false) { }
|
||||
: IndexCtx(indexCtx), Parent(Parent), ParentDC(DC) { }
|
||||
|
||||
bool shouldWalkTypesOfTypeLocs() const { return false; }
|
||||
|
||||
|
@ -62,8 +59,8 @@ public:
|
|||
if (ObjCMethodDecl *MD = E->getMethodDecl())
|
||||
IndexCtx.handleReference(MD, E->getSelectorStartLoc(),
|
||||
Parent, ParentDC, E,
|
||||
InPseudoObject ? CXIdxEntityRef_Implicit
|
||||
: CXIdxEntityRef_Direct);
|
||||
E->isImplicit() ? CXIdxEntityRef_Implicit
|
||||
: CXIdxEntityRef_Direct);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -82,11 +79,6 @@ public:
|
|||
return true;
|
||||
}
|
||||
|
||||
bool TraversePseudoObjectExpr(PseudoObjectExpr *E) {
|
||||
SaveAndRestore<bool> InPseudo(InPseudoObject, true);
|
||||
return base::TraversePseudoObjectExpr(E);
|
||||
}
|
||||
|
||||
bool VisitCXXConstructExpr(CXXConstructExpr *E) {
|
||||
IndexCtx.handleReference(E->getConstructor(), E->getLocation(),
|
||||
Parent, ParentDC, E);
|
||||
|
|
Loading…
Reference in New Issue