summaryrefslogtreecommitdiffstats
path: root/clang/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2007-09-11 21:17:26 +0000
committerSteve Naroff <snaroff@apple.com>2007-09-11 21:17:26 +0000
commitf2fb4ad08e669dfc46baf677b7e22388114526e5 (patch)
tree6866789afd7937c6ecae350ef7a566e52f70dd9d /clang/Sema/SemaDecl.cpp
parent3e18e504aef1dd08dbc89c3533199fcef22d52a8 (diff)
downloadbcm5719-llvm-f2fb4ad08e669dfc46baf677b7e22388114526e5.tar.gz
bcm5719-llvm-f2fb4ad08e669dfc46baf677b7e22388114526e5.zip
- Add an ObjcIvarDecl AST node (a subclass of FieldDecl).
- Instantiate the node in Sema::ParseField(), based on the type of the TagDecl. - Add Sema::ObjcAddInstanceVariable(), responsible for adorning/adding the ObjcIvarDecl. llvm-svn: 41864
Diffstat (limited to 'clang/Sema/SemaDecl.cpp')
-rw-r--r--clang/Sema/SemaDecl.cpp40
1 files changed, 38 insertions, 2 deletions
diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp
index 71fc0b44710..86e052b4df3 100644
--- a/clang/Sema/SemaDecl.cpp
+++ b/clang/Sema/SemaDecl.cpp
@@ -855,6 +855,35 @@ Sema::DeclTy *Sema::ObjcStartClassInterface(SourceLocation AtInterfaceLoc,
return IDecl;
}
+void Sema::ObjcAddInstanceVariable(DeclTy *ClassDecl, DeclTy *Ivar,
+ tok::ObjCKeywordKind visibility) {
+ assert((ClassDecl && Ivar) && "missing class or instance variable");
+ ObjcInterfaceDecl *OInterface = dyn_cast<ObjcInterfaceDecl>(
+ static_cast<Decl *>(ClassDecl));
+ ObjcIvarDecl *OIvar = dyn_cast<ObjcIvarDecl>(static_cast<Decl *>(Ivar));
+
+ assert((OInterface && OIvar) && "mistyped class or instance variable");
+
+ switch (visibility) {
+ case tok::objc_private:
+ OIvar->setAccessControl(ObjcIvarDecl::Private);
+ break;
+ case tok::objc_public:
+ OIvar->setAccessControl(ObjcIvarDecl::Public);
+ break;
+ case tok::objc_protected:
+ OIvar->setAccessControl(ObjcIvarDecl::Protected);
+ break;
+ case tok::objc_package:
+ OIvar->setAccessControl(ObjcIvarDecl::Package);
+ break;
+ default:
+ OIvar->setAccessControl(ObjcIvarDecl::None);
+ break;
+ }
+ // FIXME: add to the class...
+}
+
/// ObjcClassDeclaration -
/// Scope will always be top level file scope.
Action::DeclTy *
@@ -989,7 +1018,6 @@ Sema::DeclTy *Sema::ParseField(Scope *S, DeclTy *TagDecl,
Declarator &D, ExprTy *BitfieldWidth) {
IdentifierInfo *II = D.getIdentifier();
Expr *BitWidth = (Expr*)BitfieldWidth;
-
SourceLocation Loc = DeclStart;
if (II) Loc = D.getIdentifierLoc();
@@ -1023,7 +1051,15 @@ Sema::DeclTy *Sema::ParseField(Scope *S, DeclTy *TagDecl,
InvalidDecl = true;
}
// FIXME: Chain fielddecls together.
- FieldDecl *NewFD = new FieldDecl(Loc, II, T, 0);
+ FieldDecl *NewFD;
+
+ if (isa<RecordDecl>(static_cast<Decl *>(TagDecl)))
+ NewFD = new FieldDecl(Loc, II, T, 0);
+ else if (isa<ObjcInterfaceDecl>(static_cast<Decl *>(TagDecl)))
+ NewFD = new ObjcIvarDecl(Loc, II, T, 0);
+ else
+ assert(0 && "Sema::ParseField(): Unknown TagDecl");
+
if (D.getInvalidType() || InvalidDecl)
NewFD->setInvalidDecl();
return NewFD;
OpenPOWER on IntegriCloud