Home | History | Annotate | Download | only in AST
      1 //===--- NSAPI.h - NSFoundation APIs ----------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_CLANG_AST_NSAPI_H
     11 #define LLVM_CLANG_AST_NSAPI_H
     12 
     13 #include "clang/Basic/IdentifierTable.h"
     14 #include "llvm/ADT/ArrayRef.h"
     15 #include "llvm/ADT/Optional.h"
     16 
     17 namespace clang {
     18   class ASTContext;
     19   class QualType;
     20   class Expr;
     21 
     22 // \brief Provides info and caches identifiers/selectors for NSFoundation API.
     23 class NSAPI {
     24 public:
     25   explicit NSAPI(ASTContext &Ctx);
     26 
     27   ASTContext &getASTContext() const { return Ctx; }
     28 
     29   enum NSClassIdKindKind {
     30     ClassId_NSObject,
     31     ClassId_NSString,
     32     ClassId_NSArray,
     33     ClassId_NSMutableArray,
     34     ClassId_NSDictionary,
     35     ClassId_NSMutableDictionary,
     36     ClassId_NSNumber
     37   };
     38   static const unsigned NumClassIds = 7;
     39 
     40   enum NSStringMethodKind {
     41     NSStr_stringWithString,
     42     NSStr_stringWithUTF8String,
     43     NSStr_stringWithCStringEncoding,
     44     NSStr_stringWithCString,
     45     NSStr_initWithString
     46   };
     47   static const unsigned NumNSStringMethods = 5;
     48 
     49   IdentifierInfo *getNSClassId(NSClassIdKindKind K) const;
     50 
     51   /// \brief The Objective-C NSString selectors.
     52   Selector getNSStringSelector(NSStringMethodKind MK) const;
     53 
     54   /// \brief Return NSStringMethodKind if \param Sel is such a selector.
     55   Optional<NSStringMethodKind> getNSStringMethodKind(Selector Sel) const;
     56 
     57   /// \brief Returns true if the expression \param E is a reference of
     58   /// "NSUTF8StringEncoding" enum constant.
     59   bool isNSUTF8StringEncodingConstant(const Expr *E) const {
     60     return isObjCEnumerator(E, "NSUTF8StringEncoding", NSUTF8StringEncodingId);
     61   }
     62 
     63   /// \brief Returns true if the expression \param E is a reference of
     64   /// "NSASCIIStringEncoding" enum constant.
     65   bool isNSASCIIStringEncodingConstant(const Expr *E) const {
     66     return isObjCEnumerator(E, "NSASCIIStringEncoding",NSASCIIStringEncodingId);
     67   }
     68 
     69   /// \brief Enumerates the NSArray methods used to generate literals.
     70   enum NSArrayMethodKind {
     71     NSArr_array,
     72     NSArr_arrayWithArray,
     73     NSArr_arrayWithObject,
     74     NSArr_arrayWithObjects,
     75     NSArr_arrayWithObjectsCount,
     76     NSArr_initWithArray,
     77     NSArr_initWithObjects,
     78     NSArr_objectAtIndex,
     79     NSMutableArr_replaceObjectAtIndex
     80   };
     81   static const unsigned NumNSArrayMethods = 9;
     82 
     83   /// \brief The Objective-C NSArray selectors.
     84   Selector getNSArraySelector(NSArrayMethodKind MK) const;
     85 
     86   /// \brief Return NSArrayMethodKind if \p Sel is such a selector.
     87   Optional<NSArrayMethodKind> getNSArrayMethodKind(Selector Sel);
     88 
     89   /// \brief Enumerates the NSDictionary methods used to generate literals.
     90   enum NSDictionaryMethodKind {
     91     NSDict_dictionary,
     92     NSDict_dictionaryWithDictionary,
     93     NSDict_dictionaryWithObjectForKey,
     94     NSDict_dictionaryWithObjectsForKeys,
     95     NSDict_dictionaryWithObjectsForKeysCount,
     96     NSDict_dictionaryWithObjectsAndKeys,
     97     NSDict_initWithDictionary,
     98     NSDict_initWithObjectsAndKeys,
     99     NSDict_initWithObjectsForKeys,
    100     NSDict_objectForKey,
    101     NSMutableDict_setObjectForKey
    102   };
    103   static const unsigned NumNSDictionaryMethods = 11;
    104 
    105   /// \brief The Objective-C NSDictionary selectors.
    106   Selector getNSDictionarySelector(NSDictionaryMethodKind MK) const;
    107 
    108   /// \brief Return NSDictionaryMethodKind if \p Sel is such a selector.
    109   Optional<NSDictionaryMethodKind> getNSDictionaryMethodKind(Selector Sel);
    110 
    111   /// \brief Returns selector for "objectForKeyedSubscript:".
    112   Selector getObjectForKeyedSubscriptSelector() const {
    113     return getOrInitSelector(StringRef("objectForKeyedSubscript"),
    114                              objectForKeyedSubscriptSel);
    115   }
    116 
    117   /// \brief Returns selector for "objectAtIndexedSubscript:".
    118   Selector getObjectAtIndexedSubscriptSelector() const {
    119     return getOrInitSelector(StringRef("objectAtIndexedSubscript"),
    120                              objectAtIndexedSubscriptSel);
    121   }
    122 
    123   /// \brief Returns selector for "setObject:forKeyedSubscript".
    124   Selector getSetObjectForKeyedSubscriptSelector() const {
    125     StringRef Ids[] = { "setObject", "forKeyedSubscript" };
    126     return getOrInitSelector(Ids, setObjectForKeyedSubscriptSel);
    127   }
    128 
    129   /// \brief Returns selector for "setObject:atIndexedSubscript".
    130   Selector getSetObjectAtIndexedSubscriptSelector() const {
    131     StringRef Ids[] = { "setObject", "atIndexedSubscript" };
    132     return getOrInitSelector(Ids, setObjectAtIndexedSubscriptSel);
    133   }
    134 
    135   /// \brief Returns selector for "isEqual:".
    136   Selector getIsEqualSelector() const {
    137     return getOrInitSelector(StringRef("isEqual"), isEqualSel);
    138   }
    139 
    140   /// \brief Enumerates the NSNumber methods used to generate literals.
    141   enum NSNumberLiteralMethodKind {
    142     NSNumberWithChar,
    143     NSNumberWithUnsignedChar,
    144     NSNumberWithShort,
    145     NSNumberWithUnsignedShort,
    146     NSNumberWithInt,
    147     NSNumberWithUnsignedInt,
    148     NSNumberWithLong,
    149     NSNumberWithUnsignedLong,
    150     NSNumberWithLongLong,
    151     NSNumberWithUnsignedLongLong,
    152     NSNumberWithFloat,
    153     NSNumberWithDouble,
    154     NSNumberWithBool,
    155     NSNumberWithInteger,
    156     NSNumberWithUnsignedInteger
    157   };
    158   static const unsigned NumNSNumberLiteralMethods = 15;
    159 
    160   /// \brief The Objective-C NSNumber selectors used to create NSNumber literals.
    161   /// \param Instance if true it will return the selector for the init* method
    162   /// otherwise it will return the selector for the number* method.
    163   Selector getNSNumberLiteralSelector(NSNumberLiteralMethodKind MK,
    164                                       bool Instance) const;
    165 
    166   bool isNSNumberLiteralSelector(NSNumberLiteralMethodKind MK,
    167                                  Selector Sel) const {
    168     return Sel == getNSNumberLiteralSelector(MK, false) ||
    169            Sel == getNSNumberLiteralSelector(MK, true);
    170   }
    171 
    172   /// \brief Return NSNumberLiteralMethodKind if \p Sel is such a selector.
    173   Optional<NSNumberLiteralMethodKind>
    174       getNSNumberLiteralMethodKind(Selector Sel) const;
    175 
    176   /// \brief Determine the appropriate NSNumber factory method kind for a
    177   /// literal of the given type.
    178   Optional<NSNumberLiteralMethodKind>
    179       getNSNumberFactoryMethodKind(QualType T) const;
    180 
    181   /// \brief Returns true if \param T is a typedef of "BOOL" in objective-c.
    182   bool isObjCBOOLType(QualType T) const;
    183   /// \brief Returns true if \param T is a typedef of "NSInteger" in objective-c.
    184   bool isObjCNSIntegerType(QualType T) const;
    185   /// \brief Returns true if \param T is a typedef of "NSUInteger" in objective-c.
    186   bool isObjCNSUIntegerType(QualType T) const;
    187 
    188 private:
    189   bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const;
    190   bool isObjCEnumerator(const Expr *E,
    191                         StringRef name, IdentifierInfo *&II) const;
    192   Selector getOrInitSelector(ArrayRef<StringRef> Ids, Selector &Sel) const;
    193 
    194   ASTContext &Ctx;
    195 
    196   mutable IdentifierInfo *ClassIds[NumClassIds];
    197 
    198   mutable Selector NSStringSelectors[NumNSStringMethods];
    199 
    200   /// \brief The selectors for Objective-C NSArray methods.
    201   mutable Selector NSArraySelectors[NumNSArrayMethods];
    202 
    203   /// \brief The selectors for Objective-C NSDictionary methods.
    204   mutable Selector NSDictionarySelectors[NumNSDictionaryMethods];
    205 
    206   /// \brief The Objective-C NSNumber selectors used to create NSNumber literals.
    207   mutable Selector NSNumberClassSelectors[NumNSNumberLiteralMethods];
    208   mutable Selector NSNumberInstanceSelectors[NumNSNumberLiteralMethods];
    209 
    210   mutable Selector objectForKeyedSubscriptSel, objectAtIndexedSubscriptSel,
    211                    setObjectForKeyedSubscriptSel,setObjectAtIndexedSubscriptSel,
    212                    isEqualSel;
    213 
    214   mutable IdentifierInfo *BOOLId, *NSIntegerId, *NSUIntegerId;
    215   mutable IdentifierInfo *NSASCIIStringEncodingId, *NSUTF8StringEncodingId;
    216 };
    217 
    218 }  // end namespace clang
    219 
    220 #endif // LLVM_CLANG_AST_NSAPI_H
    221