forked from OSchip/llvm-project
Keep track of type source information in the return type of an
Objective-C method declaration, e.g., for - (Foo *)myMethod; we now have TypeSourceInfo for the Foo*. llvm-svn: 97942
This commit is contained in:
parent
7a9ba76825
commit
12852d9521
|
@ -136,8 +136,12 @@ private:
|
|||
/// in, inout, etc.
|
||||
unsigned objcDeclQualifier : 6;
|
||||
|
||||
// Type of this method.
|
||||
// Result type of this method.
|
||||
QualType MethodDeclType;
|
||||
|
||||
// Type source information for the result type.
|
||||
TypeSourceInfo *ResultTInfo;
|
||||
|
||||
/// ParamInfo - List of pointers to VarDecls for the formal parameters of this
|
||||
/// Method.
|
||||
ObjCList<ParmVarDecl> ParamInfo;
|
||||
|
@ -158,6 +162,7 @@ private:
|
|||
|
||||
ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
|
||||
Selector SelInfo, QualType T,
|
||||
TypeSourceInfo *ResultTInfo,
|
||||
DeclContext *contextDecl,
|
||||
bool isInstance = true,
|
||||
bool isVariadic = false,
|
||||
|
@ -168,7 +173,7 @@ private:
|
|||
IsInstance(isInstance), IsVariadic(isVariadic),
|
||||
IsSynthesized(isSynthesized),
|
||||
DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
|
||||
MethodDeclType(T),
|
||||
MethodDeclType(T), ResultTInfo(ResultTInfo),
|
||||
EndLoc(endLoc), Body(0), SelfDecl(0), CmdDecl(0) {}
|
||||
|
||||
virtual ~ObjCMethodDecl() {}
|
||||
|
@ -186,7 +191,9 @@ public:
|
|||
static ObjCMethodDecl *Create(ASTContext &C,
|
||||
SourceLocation beginLoc,
|
||||
SourceLocation endLoc, Selector SelInfo,
|
||||
QualType T, DeclContext *contextDecl,
|
||||
QualType T,
|
||||
TypeSourceInfo *ResultTInfo,
|
||||
DeclContext *contextDecl,
|
||||
bool isInstance = true,
|
||||
bool isVariadic = false,
|
||||
bool isSynthesized = false,
|
||||
|
@ -220,6 +227,9 @@ public:
|
|||
QualType getResultType() const { return MethodDeclType; }
|
||||
void setResultType(QualType T) { MethodDeclType = T; }
|
||||
|
||||
TypeSourceInfo *getResultTypeSourceInfo() const { return ResultTInfo; }
|
||||
void setResultTypeSourceInfo(TypeSourceInfo *TInfo) { ResultTInfo = TInfo; }
|
||||
|
||||
// Iterator access to formal parameters.
|
||||
unsigned param_size() const { return ParamInfo.size(); }
|
||||
typedef ObjCList<ParmVarDecl>::iterator param_iterator;
|
||||
|
|
|
@ -2244,12 +2244,14 @@ Decl *ASTNodeImporter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
|
|||
if (ResultTy.isNull())
|
||||
return 0;
|
||||
|
||||
TypeSourceInfo *ResultTInfo = Importer.Import(D->getResultTypeSourceInfo());
|
||||
|
||||
ObjCMethodDecl *ToMethod
|
||||
= ObjCMethodDecl::Create(Importer.getToContext(),
|
||||
Loc,
|
||||
Importer.Import(D->getLocEnd()),
|
||||
Name.getObjCSelector(),
|
||||
ResultTy, DC,
|
||||
ResultTy, ResultTInfo, DC,
|
||||
D->isInstanceMethod(),
|
||||
D->isVariadic(),
|
||||
D->isSynthesized(),
|
||||
|
|
|
@ -304,15 +304,16 @@ ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C,
|
|||
SourceLocation beginLoc,
|
||||
SourceLocation endLoc,
|
||||
Selector SelInfo, QualType T,
|
||||
TypeSourceInfo *ResultTInfo,
|
||||
DeclContext *contextDecl,
|
||||
bool isInstance,
|
||||
bool isVariadic,
|
||||
bool isSynthesized,
|
||||
ImplementationControl impControl) {
|
||||
return new (C) ObjCMethodDecl(beginLoc, endLoc,
|
||||
SelInfo, T, contextDecl,
|
||||
isInstance,
|
||||
isVariadic, isSynthesized, impControl);
|
||||
SelInfo, T, ResultTInfo, contextDecl,
|
||||
isInstance,
|
||||
isVariadic, isSynthesized, impControl);
|
||||
}
|
||||
|
||||
void ObjCMethodDecl::Destroy(ASTContext &C) {
|
||||
|
|
|
@ -211,6 +211,7 @@ void PCHDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
|
|||
MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]);
|
||||
MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
|
||||
MD->setResultType(Reader.GetType(Record[Idx++]));
|
||||
MD->setResultTypeSourceInfo(Reader.GetTypeSourceInfo(Record, Idx));
|
||||
MD->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
unsigned NumParams = Record[Idx++];
|
||||
llvm::SmallVector<ParmVarDecl *, 16> Params;
|
||||
|
@ -690,7 +691,7 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
|
|||
break;
|
||||
case pch::DECL_OBJC_METHOD:
|
||||
D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(),
|
||||
Selector(), QualType(), 0);
|
||||
Selector(), QualType(), 0, 0);
|
||||
break;
|
||||
case pch::DECL_OBJC_INTERFACE:
|
||||
D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0);
|
||||
|
|
|
@ -210,6 +210,7 @@ void PCHDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
|
|||
// FIXME: stable encoding for in/out/inout/bycopy/byref/oneway
|
||||
Record.push_back(D->getObjCDeclQualifier());
|
||||
Writer.AddTypeRef(D->getResultType(), Record);
|
||||
Writer.AddTypeSourceInfo(D->getResultTypeSourceInfo(), Record);
|
||||
Writer.AddSourceLocation(D->getLocEnd(), Record);
|
||||
Record.push_back(D->param_size());
|
||||
for (ObjCMethodDecl::param_iterator P = D->param_begin(),
|
||||
|
|
|
@ -1681,7 +1681,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
|
|||
// for this class.
|
||||
GetterMethod = ObjCMethodDecl::Create(Context, property->getLocation(),
|
||||
property->getLocation(), property->getGetterName(),
|
||||
property->getType(), CD, true, false, true,
|
||||
property->getType(), 0, CD, true, false, true,
|
||||
(property->getPropertyImplementation() ==
|
||||
ObjCPropertyDecl::Optional) ?
|
||||
ObjCMethodDecl::Optional :
|
||||
|
@ -1703,7 +1703,7 @@ void Sema::ProcessPropertyDecl(ObjCPropertyDecl *property,
|
|||
SetterMethod = ObjCMethodDecl::Create(Context, property->getLocation(),
|
||||
property->getLocation(),
|
||||
property->getSetterName(),
|
||||
Context.VoidTy, CD, true, false, true,
|
||||
Context.VoidTy, 0, CD, true, false, true,
|
||||
(property->getPropertyImplementation() ==
|
||||
ObjCPropertyDecl::Optional) ?
|
||||
ObjCMethodDecl::Optional :
|
||||
|
@ -1992,8 +1992,9 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
|
|||
}
|
||||
QualType resultDeclType;
|
||||
|
||||
TypeSourceInfo *ResultTInfo = 0;
|
||||
if (ReturnType) {
|
||||
resultDeclType = GetTypeFromParser(ReturnType);
|
||||
resultDeclType = GetTypeFromParser(ReturnType, &ResultTInfo);
|
||||
|
||||
// Methods cannot return interface types. All ObjC objects are
|
||||
// passed by reference.
|
||||
|
@ -2007,6 +2008,7 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
|
|||
|
||||
ObjCMethodDecl* ObjCMethod =
|
||||
ObjCMethodDecl::Create(Context, MethodLoc, EndLoc, Sel, resultDeclType,
|
||||
ResultTInfo,
|
||||
cast<DeclContext>(ClassDecl),
|
||||
MethodType == tok::minus, isVariadic,
|
||||
false,
|
||||
|
|
|
@ -90,7 +90,9 @@ int main (int argc, const char * argv[]) {
|
|||
// CHECK: [31:27 - 33:9] ObjCInterfaceDecl=Baz:31:12
|
||||
// CHECK: [33:9 - 33:16] ObjCIvarDecl=_anIVar:33:9 (Definition)
|
||||
// CHECK: [33:16 - 36:1] ObjCInterfaceDecl=Baz:31:12
|
||||
// CHECK: [36:1 - 36:21] ObjCInstanceMethodDecl=bazMethod:36:1
|
||||
// CHECK: [36:1 - 36:4] ObjCInstanceMethodDecl=bazMethod:36:1
|
||||
// CHECK: [36:4 - 36:7] ObjCClassRef=Foo:3:12
|
||||
// CHECK: [36:7 - 36:21] ObjCInstanceMethodDecl=bazMethod:36:1
|
||||
// CHECK: [36:21 - 38:5] ObjCInterfaceDecl=Baz:31:12
|
||||
// CHECK: [38:5 - 40:1] Invalid Cursor => NoDeclFound
|
||||
// CHECK: [40:1 - 41:3] EnumDecl=:40:1 (Definition)
|
||||
|
|
|
@ -532,9 +532,10 @@ bool CursorVisitor::VisitVarDecl(VarDecl *D) {
|
|||
}
|
||||
|
||||
bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) {
|
||||
// FIXME: We really need a TypeLoc covering Objective-C method declarations.
|
||||
// At the moment, we don't have information about locations in the return
|
||||
// type.
|
||||
if (TypeSourceInfo *TSInfo = ND->getResultTypeSourceInfo())
|
||||
if (Visit(TSInfo->getTypeLoc()))
|
||||
return true;
|
||||
|
||||
for (ObjCMethodDecl::param_iterator P = ND->param_begin(),
|
||||
PEnd = ND->param_end();
|
||||
P != PEnd; ++P) {
|
||||
|
|
Loading…
Reference in New Issue