forked from OSchip/llvm-project
Add pch reader/writer support for ObjCContainerDecl, ObjCInterfaceDecl, & ObjCIvarDecl.
Next step: Add selector support to PCHWriter::AddDeclarationName(). llvm-svn: 69619
This commit is contained in:
parent
ddf6ca0355
commit
aac654abeb
|
@ -479,15 +479,21 @@ public:
|
|||
SourceLocation getLocEnd() const { return EndLoc; }
|
||||
void setLocEnd(SourceLocation LE) { EndLoc = LE; };
|
||||
|
||||
void setClassLoc(SourceLocation Loc) { ClassLoc = Loc; }
|
||||
SourceLocation getClassLoc() const { return ClassLoc; }
|
||||
void setSuperClassLoc(SourceLocation Loc) { SuperClassLoc = Loc; }
|
||||
SourceLocation getSuperClassLoc() const { return SuperClassLoc; }
|
||||
|
||||
/// ImplicitInterfaceDecl - check that this is an implicitely declared
|
||||
/// isImplicitInterfaceDecl - check that this is an implicitely declared
|
||||
/// ObjCInterfaceDecl node. This is for legacy objective-c @implementation
|
||||
/// declaration without an @interface declaration.
|
||||
bool ImplicitInterfaceDecl() const { return InternalInterface; }
|
||||
bool isImplicitInterfaceDecl() const { return InternalInterface; }
|
||||
void setImplicitInterfaceDecl(bool val) { InternalInterface = val; }
|
||||
|
||||
// Low-level accessor
|
||||
Type *getTypeForDecl() const { return TypeForDecl; }
|
||||
void setTypeForDecl(Type *TD) { TypeForDecl = TD; }
|
||||
|
||||
static bool classof(const Decl *D) { return D->getKind() == ObjCInterface; }
|
||||
static bool classof(const ObjCInterfaceDecl *D) { return true; }
|
||||
};
|
||||
|
|
|
@ -356,6 +356,10 @@ namespace clang {
|
|||
DECL_FUNCTION,
|
||||
/// \brief A ObjCMethodDecl record.
|
||||
DECL_OBJC_METHOD,
|
||||
/// \brief A ObjCInterfaceDecl record.
|
||||
DECL_OBJC_INTERFACE_DECL,
|
||||
/// \brief A ObjCIvarDecl record.
|
||||
DECL_OBJC_IVAR_DECL,
|
||||
/// \brief A FieldDecl record.
|
||||
DECL_FIELD,
|
||||
/// \brief A VarDecl record.
|
||||
|
|
|
@ -68,6 +68,9 @@ namespace {
|
|||
void VisitBlockDecl(BlockDecl *BD);
|
||||
std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
|
||||
void VisitObjCMethodDecl(ObjCMethodDecl *D);
|
||||
void VisitObjCContainerDecl(ObjCContainerDecl *D);
|
||||
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
|
||||
void VisitObjCIvarDecl(ObjCIvarDecl *D);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -184,6 +187,35 @@ void PCHDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
|
|||
MD->setMethodParams(Reader.getContext(), &Params[0], NumParams);
|
||||
}
|
||||
|
||||
void PCHDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
|
||||
VisitNamedDecl(CD);
|
||||
CD->setAtEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
}
|
||||
|
||||
void PCHDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
|
||||
VisitObjCContainerDecl(ID);
|
||||
ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
|
||||
ID->setSuperClass(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
unsigned NumIvars = Record[Idx++];
|
||||
llvm::SmallVector<ObjCIvarDecl *, 16> IVars;
|
||||
IVars.reserve(NumIvars);
|
||||
for (unsigned I = 0; I != NumIvars; ++I)
|
||||
IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
ID->setIVarList(&IVars[0], NumIvars, Reader.getContext());
|
||||
|
||||
ID->setForwardDecl(Record[Idx++]);
|
||||
ID->setImplicitInterfaceDecl(Record[Idx++]);
|
||||
ID->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
ID->setSuperClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
ID->setLocEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
// FIXME: add protocols, categories.
|
||||
}
|
||||
|
||||
void PCHDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {
|
||||
VisitFieldDecl(IVD);
|
||||
IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]);
|
||||
}
|
||||
|
||||
void PCHDeclReader::VisitFieldDecl(FieldDecl *FD) {
|
||||
VisitValueDecl(FD);
|
||||
FD->setMutable(Record[Idx++]);
|
||||
|
@ -1801,6 +1833,17 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
|
|||
break;
|
||||
}
|
||||
|
||||
case pch::DECL_OBJC_INTERFACE_DECL: {
|
||||
D = ObjCInterfaceDecl::Create(Context, 0, SourceLocation(), 0);
|
||||
break;
|
||||
}
|
||||
|
||||
case pch::DECL_OBJC_IVAR_DECL: {
|
||||
D = ObjCIvarDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
|
||||
ObjCIvarDecl::None);
|
||||
break;
|
||||
}
|
||||
|
||||
case pch::DECL_FIELD: {
|
||||
D = FieldDecl::Create(Context, 0, SourceLocation(), 0, QualType(), 0,
|
||||
false);
|
||||
|
|
|
@ -272,6 +272,9 @@ namespace {
|
|||
void VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset,
|
||||
uint64_t VisibleOffset);
|
||||
void VisitObjCMethodDecl(ObjCMethodDecl *D);
|
||||
void VisitObjCContainerDecl(ObjCContainerDecl *D);
|
||||
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
|
||||
void VisitObjCIvarDecl(ObjCIvarDecl *D);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -387,6 +390,36 @@ void PCHDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
|
|||
Code = pch::DECL_OBJC_METHOD;
|
||||
}
|
||||
|
||||
void PCHDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) {
|
||||
VisitNamedDecl(D);
|
||||
Writer.AddSourceLocation(D->getAtEndLoc(), Record);
|
||||
// Abstract class (no need to define a stable pch::DECL code).
|
||||
}
|
||||
|
||||
void PCHDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
|
||||
VisitObjCContainerDecl(D);
|
||||
Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record);
|
||||
Writer.AddDeclRef(D->getSuperClass(), Record);
|
||||
Record.push_back(D->ivar_size());
|
||||
for (ObjCInterfaceDecl::ivar_iterator I = D->ivar_begin(),
|
||||
IEnd = D->ivar_end(); I != IEnd; ++I)
|
||||
Writer.AddDeclRef(*I, Record);
|
||||
Record.push_back(D->isForwardDecl());
|
||||
Record.push_back(D->isImplicitInterfaceDecl());
|
||||
Writer.AddSourceLocation(D->getClassLoc(), Record);
|
||||
Writer.AddSourceLocation(D->getSuperClassLoc(), Record);
|
||||
Writer.AddSourceLocation(D->getLocEnd(), Record);
|
||||
// FIXME: add protocols, categories.
|
||||
Code = pch::DECL_OBJC_INTERFACE_DECL;
|
||||
}
|
||||
|
||||
void PCHDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
|
||||
VisitFieldDecl(D);
|
||||
// FIXME: stable encoding for @public/@private/@protected/@package
|
||||
Record.push_back(D->getAccessControl());
|
||||
Code = pch::DECL_OBJC_IVAR_DECL;
|
||||
}
|
||||
|
||||
void PCHDeclWriter::VisitFieldDecl(FieldDecl *D) {
|
||||
VisitValueDecl(D);
|
||||
Record.push_back(D->isMutable());
|
||||
|
|
|
@ -699,7 +699,7 @@ void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
|
|||
/// Check case of non-existing @interface decl.
|
||||
/// (legacy objective-c @implementation decl without an @interface decl).
|
||||
/// Add implementations's ivar to the synthesize class's ivar list.
|
||||
if (IDecl->ImplicitInterfaceDecl()) {
|
||||
if (IDecl->isImplicitInterfaceDecl()) {
|
||||
IDecl->setIVarList(ivars, numIvars, Context);
|
||||
IDecl->setLocEnd(RBrace);
|
||||
return;
|
||||
|
|
|
@ -3164,7 +3164,7 @@ void RewriteObjC::RewriteObjCClassMetaData(ObjCImplementationDecl *IDecl,
|
|||
ObjCInterfaceDecl *CDecl = IDecl->getClassInterface();
|
||||
|
||||
// Explictly declared @interface's are already synthesized.
|
||||
if (CDecl->ImplicitInterfaceDecl()) {
|
||||
if (CDecl->isImplicitInterfaceDecl()) {
|
||||
// FIXME: Implementation of a class with no @interface (legacy) doese not
|
||||
// produce correct synthesis as yet.
|
||||
SynthesizeObjCInternalStruct(CDecl, Result);
|
||||
|
|
Loading…
Reference in New Issue