]> granicus.if.org Git - clang/commitdiff
Add IBAction attribute to keep the IBOutlet attribute company.
authorTed Kremenek <kremenek@apple.com>
Wed, 17 Feb 2010 02:37:45 +0000 (02:37 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 17 Feb 2010 02:37:45 +0000 (02:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96447 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Attr.h
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Parse/AttributeList.h
lib/AST/AttrImpl.cpp
lib/Frontend/PCHReaderDecl.cpp
lib/Frontend/PCHWriter.cpp
lib/Parse/AttributeList.cpp
lib/Sema/SemaDeclAttr.cpp

index 37225907c6def76d34e0988eeae902959600921c..10999cb4675eaed0b117e84eceae403a157bd209 100644 (file)
@@ -62,7 +62,8 @@ public:
     FormatArg,
     GNUInline,
     Hiding,
-    IBOutletKind, // Clang-specific.  Use "Kind" suffix to not conflict with
+    IBOutletKind, // Clang-specific. Use "Kind" suffix to not conflict w/ macro.
+    IBActionKind, // Clang-specific. Use "Kind" suffix to not conflict w/ macro.
     Malloc,
     NoDebug,
     NoInline,
@@ -326,6 +327,19 @@ public:
   static bool classof(const IBOutletAttr *A) { return true; }
 };
 
+class IBActionAttr : public Attr {
+public:
+  IBActionAttr() : Attr(IBActionKind) {}
+
+  virtual Attr *clone(ASTContext &C) const;
+
+    // Implement isa/cast/dyncast/etc.
+  static bool classof(const Attr *A) {
+    return A->getKind() == IBActionKind;
+  }
+  static bool classof(const IBActionAttr *A) { return true; }
+};
+
 DEF_SIMPLE_ATTR(Malloc);
 DEF_SIMPLE_ATTR(NoReturn);
 DEF_SIMPLE_ATTR(AnalyzerNoReturn);
index e2912ea3517ad005d6d57d7c761e6245fa6828e8..0ae68beac802f87119d2dfee48c5128d6774ad21 100644 (file)
@@ -846,8 +846,8 @@ def err_attribute_regparm_invalid_number : Error<
 
 
 // Clang-Specific Attributes
-def err_attribute_iboutlet : Error<
-  "'iboutlet' attribute can only be applied to instance variables or "
+def err_attribute_ib : Error<
+  "%0 attribute can only be applied to instance variables or "
   "properties">;
 def err_attribute_overloadable_not_function : Error<
   "'overloadable' attribute can only be applied to a function">;
index ecaa6aee470b7eaf70925f17768613a6747d9120..eab773e412a132adfe2804f6ccb5aff38ca5b3cf 100644 (file)
@@ -51,7 +51,8 @@ public:
                 AttributeList *Next, bool declspec = false, bool cxx0x = false);
   ~AttributeList();
 
-  enum Kind {              // Please keep this list alphabetized.
+  enum Kind {             // Please keep this list alphabetized.
+    AT_IBAction,          // Clang-specific.
     AT_IBOutlet,          // Clang-specific.
     AT_address_space,
     AT_alias,
index d81979734b3af5f58dc5e8b1594dd719b6b005c4..dd6e3564a50238796df87a0406e9c321720e6148 100644 (file)
@@ -139,6 +139,10 @@ Attr *IBOutletAttr::clone(ASTContext &C) const {
   return ::new (C) IBOutletAttr;
 }
 
+Attr *IBActionAttr::clone(ASTContext &C) const {
+  return ::new (C) IBActionAttr;
+}
+
 Attr *GNUInlineAttr::clone(ASTContext &C) const {
   return ::new (C) GNUInlineAttr;
 }
index 625997cac23239a2ea7f80f514b9fedac8b76929..f47a60f2607ed74b2c3642dba1cec709d7b606c0 100644 (file)
@@ -517,6 +517,10 @@ Attr *PCHReader::ReadAttributes() {
     SIMPLE_ATTR(GNUInline);
     SIMPLE_ATTR(Hiding);
 
+    case Attr::IBActionKind:
+      New = ::new (*Context) IBActionAttr();
+      break;
+
     case Attr::IBOutletKind:
       New = ::new (*Context) IBOutletAttr();
       break;
index 4c99dbe245048f7b780b63194ab5ea3122c1e6b9..bd6463128bcf5d572b81dee82cd0efb0b9cbf8f8 100644 (file)
@@ -1853,6 +1853,7 @@ void PCHWriter::WriteAttributeRecord(const Attr *Attr) {
     case Attr::GNUInline:
     case Attr::Hiding:
     case Attr::IBOutletKind:
+    case Attr::IBActionKind:
     case Attr::Malloc:
     case Attr::NoDebug:
     case Attr::NoReturn:
index df48e3a7861fecb261c3c304bf7282bfad0d5966..2321f1acb9d15348df6115517b89df57aa818d43 100644 (file)
@@ -82,6 +82,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
     .Case("stdcall", AT_stdcall)
     .Case("annotate", AT_annotate)
     .Case("fastcall", AT_fastcall)
+    .Case("ibaction", AT_IBAction)
     .Case("iboutlet", AT_IBOutlet)
     .Case("noreturn", AT_noreturn)
     .Case("noinline", AT_noinline)
index 02b2aa21b7375b08580bec90b2e31977fdcb97fc..e0943274dac29bbe2540b3008c8c5964f5021827 100644 (file)
@@ -225,19 +225,29 @@ static void HandlePackedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
     S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName();
 }
 
-static void HandleIBOutletAttr(Decl *d, const AttributeList &Attr, Sema &S) {
+static void HandleIBAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() > 0) {
     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
     return;
   }
 
-  // The IBOutlet attribute only applies to instance variables of Objective-C
-  // classes.
-  if (isa<ObjCIvarDecl>(d) || isa<ObjCPropertyDecl>(d))
-    d->addAttr(::new (S.Context) IBOutletAttr());
+  // The IBOutlet/IBAction attributes only apply to instance variables of
+  // Objective-C classes.
+  if (isa<ObjCIvarDecl>(d) || isa<ObjCPropertyDecl>(d)) {
+    switch (Attr.getKind()) {
+      case AttributeList::AT_IBAction:
+        d->addAttr(::new (S.Context) IBActionAttr());
+        break;
+      case AttributeList::AT_IBOutlet:
+        d->addAttr(::new (S.Context) IBOutletAttr());
+        break;
+      default:
+        llvm_unreachable("Invalid IB attribute");
+    }
+  }
   else
-    S.Diag(Attr.getLoc(), diag::err_attribute_iboutlet);
+    S.Diag(Attr.getLoc(), diag::err_attribute_ib) << Attr.getName();
 }
 
 static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
@@ -1729,7 +1739,8 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D,
     // FIXME: Try to deal with other __declspec attributes!
     return;
   switch (Attr.getKind()) {
-  case AttributeList::AT_IBOutlet:    HandleIBOutletAttr  (D, Attr, S); break;
+  case AttributeList::AT_IBAction:
+  case AttributeList::AT_IBOutlet:    HandleIBAttr          (D, Attr, S); break;
   case AttributeList::AT_address_space:
   case AttributeList::AT_objc_gc:
   case AttributeList::AT_vector_size: