simplify the interface to create ObjcClassDecl's.

llvm-svn: 42706
This commit is contained in:
Chris Lattner 2007-10-06 20:08:36 +00:00
parent 11eca782a3
commit ae0ec1d09f
2 changed files with 16 additions and 14 deletions

View File

@ -1372,12 +1372,11 @@ Action::DeclTy *
Sema::ActOnForwardClassDeclaration(Scope *S, SourceLocation AtClassLoc,
IdentifierInfo **IdentList, unsigned NumElts)
{
ObjcClassDecl *CDecl = new ObjcClassDecl(AtClassLoc, NumElts);
llvm::SmallVector<ObjcInterfaceDecl*, 32> Interfaces;
for (unsigned i = 0; i != NumElts; ++i) {
ObjcInterfaceDecl *IDecl;
IDecl = getObjCInterfaceDecl(IdentList[i]);
if (!IDecl) {// Already seen?
ObjcInterfaceDecl *IDecl = getObjCInterfaceDecl(IdentList[i]);
if (!IDecl) { // Not already seen? Make a forward decl.
IDecl = new ObjcInterfaceDecl(SourceLocation(), 0, IdentList[i], true);
// Chain & install the interface decl into the identifier.
IDecl->setNext(IdentList[i]->getFETokenInfo<ScopedDecl>());
@ -1385,10 +1384,11 @@ Sema::ActOnForwardClassDeclaration(Scope *S, SourceLocation AtClassLoc,
}
// Remember that this needs to be removed when the scope is popped.
S->AddDecl(IdentList[i]);
CDecl->setInterfaceDecl((int)i, IDecl);
Interfaces.push_back(IDecl);
}
return CDecl;
return new ObjcClassDecl(AtClassLoc, &Interfaces[0], Interfaces.size());
}

View File

@ -351,19 +351,21 @@ public:
/// @class NSCursor, NSImage, NSPasteboard, NSWindow;
///
class ObjcClassDecl : public TypeDecl {
ObjcInterfaceDecl **ForwardDecls; // Null if not defined.
int NumForwardDecls; // -1 if not defined.
ObjcInterfaceDecl **ForwardDecls;
unsigned NumForwardDecls;
public:
ObjcClassDecl(SourceLocation L, unsigned nElts)
ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts)
: TypeDecl(ObjcClass, L, 0, 0) {
if (nElts) {
ForwardDecls = new ObjcInterfaceDecl*[nElts];
memset(ForwardDecls, '\0', nElts*sizeof(ObjcInterfaceDecl*));
memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*));
} else {
ForwardDecls = 0;
}
NumForwardDecls = nElts;
}
void setInterfaceDecl(int idx, ObjcInterfaceDecl *OID) {
assert((idx < NumForwardDecls) && "index out of range");
void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) {
assert(idx < NumForwardDecls && "index out of range");
ForwardDecls[idx] = OID;
}
static bool classof(const Decl *D) {