clang API Documentation

Functions
RewriteObjCFoundationAPI.cpp File Reference
#include "clang/Edit/Rewriters.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/NSAPI.h"
#include "clang/AST/ParentMap.h"
#include "clang/Edit/Commit.h"
#include "clang/Lex/Lexer.h"
Include dependency graph for RewriteObjCFoundationAPI.cpp:

Go to the source code of this file.

Functions

static bool checkForLiteralCreation (const ObjCMessageExpr *Msg, IdentifierInfo *&ClassId, const LangOptions &LangOpts)
static const ObjCInterfaceDecl * maybeAdjustInterfaceForSubscriptingCheck (const ObjCInterfaceDecl *IFace, const Expr *Receiver, ASTContext &Ctx)
 Check for classes that accept 'objectForKey:' (or the other selectors that the migrator handles) but return their instances as 'id', resulting in the compiler resolving 'objectForKey:' as the method from NSDictionary.
static bool canRewriteToSubscriptSyntax (const ObjCInterfaceDecl *&IFace, const ObjCMessageExpr *Msg, ASTContext &Ctx, Selector subscriptSel)
static bool subscriptOperatorNeedsParens (const Expr *FullExpr)
static void maybePutParensOnReceiver (const Expr *Receiver, Commit &commit)
static bool rewriteToSubscriptGetCommon (const ObjCMessageExpr *Msg, Commit &commit)
static bool rewriteToArraySubscriptGet (const ObjCInterfaceDecl *IFace, const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool rewriteToDictionarySubscriptGet (const ObjCInterfaceDecl *IFace, const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool rewriteToArraySubscriptSet (const ObjCInterfaceDecl *IFace, const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool rewriteToDictionarySubscriptSet (const ObjCInterfaceDecl *IFace, const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool rewriteToArrayLiteral (const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit, const ParentMap *PMap)
static bool rewriteToDictionaryLiteral (const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool rewriteToNumberLiteral (const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool rewriteToNumericBoxedExpression (const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool rewriteToStringBoxedExpression (const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)
static bool shouldNotRewriteImmediateMessageArgs (const ObjCMessageExpr *Msg, const NSAPI &NS)
 Returns true if the immediate message arguments of Msg should not be rewritten because it will interfere with the rewrite of the parent message expression. e.g.
static void objectifyExpr (const Expr *E, Commit &commit)
 Adds an explicit cast to 'id' if the type is not objc object.
static bool getNSArrayObjects (const Expr *E, const NSAPI &NS, SmallVectorImpl< const Expr * > &Objs)
 If Msg is an NSArray creation message or literal, this gets the objects that were used to create it.
static bool rewriteToCharLiteral (const ObjCMessageExpr *Msg, const CharacterLiteral *Arg, const NSAPI &NS, Commit &commit)
static bool rewriteToBoolLiteral (const ObjCMessageExpr *Msg, const Expr *Arg, const NSAPI &NS, Commit &commit)
static bool getLiteralInfo (SourceRange literalRange, bool isFloat, bool isIntZero, ASTContext &Ctx, LiteralInfo &Info)
static bool castOperatorNeedsParens (const Expr *FullExpr)
static bool isEnumConstant (const Expr *E)
static bool doRewriteToUTF8StringBoxedExpressionHelper (const ObjCMessageExpr *Msg, const NSAPI &NS, Commit &commit)

Function Documentation

static bool canRewriteToSubscriptSyntax ( const ObjCInterfaceDecl *&  IFace,
const ObjCMessageExpr *  Msg,
ASTContext &  Ctx,
Selector  subscriptSel 
) [static]
static bool castOperatorNeedsParens ( const Expr *  FullExpr) [static]

Definition at line 911 of file RewriteObjCFoundationAPI.cpp.

References clang::Expr::IgnoreImpCasts().

Referenced by objectifyExpr().

static bool checkForLiteralCreation ( const ObjCMessageExpr *  Msg,
IdentifierInfo *&  ClassId,
const LangOptions &  LangOpts 
) [static]
static bool doRewriteToUTF8StringBoxedExpressionHelper ( const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool getLiteralInfo ( SourceRange  literalRange,
bool  isFloat,
bool  isIntZero,
ASTContext &  Ctx,
LiteralInfo &  Info 
) [static]
static bool getNSArrayObjects ( const Expr *  E,
const NSAPI &  NS,
SmallVectorImpl< const Expr * > &  Objs 
) [static]
static bool isEnumConstant ( const Expr *  E) [static]
static const ObjCInterfaceDecl* maybeAdjustInterfaceForSubscriptingCheck ( const ObjCInterfaceDecl *  IFace,
const Expr *  Receiver,
ASTContext &  Ctx 
) [static]

Check for classes that accept 'objectForKey:' (or the other selectors that the migrator handles) but return their instances as 'id', resulting in the compiler resolving 'objectForKey:' as the method from NSDictionary.

When checking if we can convert to subscripting syntax, check whether the receiver is a result of a class method from a hardcoded list of such classes. In such a case return the specific class as the interface of the receiver.

FIXME: Remove this when these classes start using 'instancetype'.

Definition at line 109 of file RewriteObjCFoundationAPI.cpp.

References clang::ObjCMessageExpr::Class, clang::Type::getAs(), clang::ObjCMessageExpr::getClassReceiver(), clang::ObjCObjectType::getInterface(), clang::NamedDecl::getName(), clang::ObjCMessageExpr::getReceiverKind(), clang::ObjCMessageExpr::getSuperType(), clang::Expr::getType(), clang::QualType::getUnqualifiedType(), clang::Expr::IgnoreParenCasts(), clang::ObjCMessageExpr::Instance, clang::QualType::isNull(), clang::ASTContext::isObjCIdType(), clang::ObjCMessageExpr::SuperClass, and clang::ObjCMessageExpr::SuperInstance.

Referenced by canRewriteToSubscriptSyntax().

static void maybePutParensOnReceiver ( const Expr *  Receiver,
Commit &  commit 
) [static]
static void objectifyExpr ( const Expr *  E,
Commit &  commit 
) [static]
static bool rewriteToArrayLiteral ( const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit,
const ParentMap *  PMap 
) [static]
static bool rewriteToArraySubscriptGet ( const ObjCInterfaceDecl *  IFace,
const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToArraySubscriptSet ( const ObjCInterfaceDecl *  IFace,
const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToBoolLiteral ( const ObjCMessageExpr *  Msg,
const Expr *  Arg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToCharLiteral ( const ObjCMessageExpr *  Msg,
const CharacterLiteral *  Arg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToDictionaryLiteral ( const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToDictionarySubscriptGet ( const ObjCInterfaceDecl *  IFace,
const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToDictionarySubscriptSet ( const ObjCInterfaceDecl *  IFace,
const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToNumberLiteral ( const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToNumericBoxedExpression ( const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]

Definition at line 973 of file RewriteObjCFoundationAPI.cpp.

References clang::CK_AddressSpaceConversion, clang::CK_AnyPointerToBlockPointerCast, clang::CK_ARCConsumeObject, clang::CK_ARCExtendBlockObject, clang::CK_ARCProduceObject, clang::CK_ARCReclaimReturnedObject, clang::CK_ArrayToPointerDecay, clang::CK_AtomicToNonAtomic, clang::CK_BaseToDerived, clang::CK_BaseToDerivedMemberPointer, clang::CK_BitCast, clang::CK_BlockPointerToObjCPointerCast, clang::CK_BuiltinFnToFnPtr, clang::CK_ConstructorConversion, clang::CK_CopyAndAutoreleaseBlockObject, clang::CK_CPointerToObjCPointerCast, clang::CK_Dependent, clang::CK_DerivedToBase, clang::CK_DerivedToBaseMemberPointer, clang::CK_Dynamic, clang::CK_FloatingCast, clang::CK_FloatingComplexCast, clang::CK_FloatingComplexToBoolean, clang::CK_FloatingComplexToIntegralComplex, clang::CK_FloatingComplexToReal, clang::CK_FloatingRealToComplex, clang::CK_FloatingToBoolean, clang::CK_FloatingToIntegral, clang::CK_FunctionToPointerDecay, clang::CK_IntegralCast, clang::CK_IntegralComplexCast, clang::CK_IntegralComplexToBoolean, clang::CK_IntegralComplexToFloatingComplex, clang::CK_IntegralComplexToReal, clang::CK_IntegralRealToComplex, clang::CK_IntegralToBoolean, clang::CK_IntegralToFloating, clang::CK_IntegralToPointer, clang::CK_LValueBitCast, clang::CK_LValueToRValue, clang::CK_MemberPointerToBoolean, clang::CK_NonAtomicToAtomic, clang::CK_NoOp, clang::CK_NullToMemberPointer, clang::CK_NullToPointer, clang::CK_ObjCObjectLValueCast, clang::CK_PointerToBoolean, clang::CK_PointerToIntegral, clang::CK_ReinterpretMemberPointer, clang::CK_ToUnion, clang::CK_ToVoid, clang::CK_UncheckedDerivedToBase, clang::CK_UserDefinedConversion, clang::CK_VectorSplat, clang::CK_ZeroToOCLEvent, clang::ObjCMessageExpr::getArg(), clang::Type::getAs(), clang::NSAPI::getASTContext(), clang::SourceRange::getBegin(), clang::DiagnosticsEngine::getCustomDiagID(), clang::ASTContext::getDiagnostics(), clang::Expr::getExprLoc(), clang::NSAPI::getNSNumberLiteralMethodKind(), clang::ObjCMessageExpr::getNumArgs(), clang::ObjCMessageExpr::getSelector(), clang::Stmt::getSourceRange(), clang::Expr::getType(), clang::ASTContext::getTypeSize(), clang::Expr::IgnoreImpCasts(), clang::edit::Commit::insertBefore(), clang::edit::Commit::insertWrap(), clang::ASTContext::IntTy, clang::Type::isBooleanType(), isEnumConstant(), clang::Type::isSignedIntegerType(), clang::Expr::isTypeDependent(), clang::NSAPI::NSNumberWithBool, clang::NSAPI::NSNumberWithInteger, clang::NSAPI::NSNumberWithUnsignedInteger, clang::edit::Commit::replaceWithInner(), clang::DiagnosticsEngine::Report(), and clang::DiagnosticsEngine::Warning.

Referenced by rewriteToBoolLiteral(), rewriteToCharLiteral(), and rewriteToNumberLiteral().

static bool rewriteToStringBoxedExpression ( const ObjCMessageExpr *  Msg,
const NSAPI &  NS,
Commit &  commit 
) [static]
static bool rewriteToSubscriptGetCommon ( const ObjCMessageExpr *  Msg,
Commit &  commit 
) [static]
static bool shouldNotRewriteImmediateMessageArgs ( const ObjCMessageExpr *  Msg,
const NSAPI &  NS 
) [static]

Returns true if the immediate message arguments of Msg should not be rewritten because it will interfere with the rewrite of the parent message expression. e.g.

   [NSDictionary dictionaryWithObjects:
                                 [NSArray arrayWithObjects:@"1", @"2", nil]
                         forKeys:[NSArray arrayWithObjects:@"A", @"B", nil]];

It will return true for this because we are going to rewrite this directly to a dictionary literal without any array literals.

Definition at line 604 of file RewriteObjCFoundationAPI.cpp.

References checkForLiteralCreation(), clang::NSAPI::ClassId_NSDictionary, clang::ObjCMessageExpr::getArg(), clang::NSAPI::getASTContext(), clang::ASTContext::getLangOpts(), getNSArrayObjects(), clang::NSAPI::getNSClassId(), clang::NSAPI::getNSDictionarySelector(), clang::ObjCMessageExpr::getNumArgs(), clang::ObjCMessageExpr::getSelector(), clang::NSAPI::NSDict_dictionaryWithObjectsForKeys, and clang::NSAPI::NSDict_initWithObjectsForKeys.

Referenced by rewriteToArrayLiteral().

static bool subscriptOperatorNeedsParens ( const Expr *  FullExpr) [static]

Definition at line 889 of file RewriteObjCFoundationAPI.cpp.

References clang::Expr::IgnoreImpCasts().

Referenced by maybePutParensOnReceiver().