[cfe-commits] r152141 - in /cfe/trunk: include/clang-c/ include/clang/ARCMigrate/ include/clang/Basic/ include/clang/Driver/ include/clang/Edit/ include/clang/Frontend/ include/clang/Rewrite/ lib/ lib/ARCMigrate/ lib/Basic/ lib/Driver/ lib/Edit/ lib/Frontend/ lib/FrontendTool/ lib/Rewrite/ test/ARCMT/ tools/arcmt-test/ tools/c-arcmt-test/ tools/driver/ tools/libclang/ unittests/Frontend/ unittests/Lex/

Argyrios Kyrtzidis akyrtzi at gmail.com
Mon Jan 7 18:29:33 PST 2013


On Jan 6, 2013, at 8:57 PM, Nico Weber <thakis at chromium.org> wrote:

> On Tue, Mar 6, 2012 at 12:06 PM, Ted Kremenek <kremenek at apple.com> wrote:
>> Author: kremenek
>> Date: Tue Mar  6 14:06:33 2012
>> New Revision: 152141
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=152141&view=rev
>> Log:
>> Add new code migrator support for migrating existing Objective-C code to use
>> the new Objective-C NSArray/NSDictionary/NSNumber literal syntax.
>> 
>> This introduces a new library, libEdit, which provides a new way to support
>> migration of code that improves on the original ARC migrator.  We now believe
>> that most of its functionality can be refactored into the existing libraries,
>> and thus this new library may shortly disappear.
> 
> Is this still the plan?

Not sure, now Sema depends on it, it is used in "SemaExprObjC.cpp" for creating fixits for the "diag::warn_objc_redundant_literal_use" diagnostic.
Possibly move it to RewriteCore and have Sema depend on RewriteCore ? I don't find it ideal, we could also leave it as is..

-Argyrios

> 
>> 
>> Added:
>>    cfe/trunk/include/clang/Edit/
>>    cfe/trunk/include/clang/Edit/Commit.h
>>    cfe/trunk/include/clang/Edit/EditedSource.h
>>    cfe/trunk/include/clang/Edit/EditsReceiver.h
>>    cfe/trunk/include/clang/Edit/FileOffset.h
>>    cfe/trunk/include/clang/Edit/Rewriters.h
>>    cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
>>    cfe/trunk/lib/Edit/
>>    cfe/trunk/lib/Edit/CMakeLists.txt
>>    cfe/trunk/lib/Edit/Commit.cpp
>>    cfe/trunk/lib/Edit/EditedSource.cpp
>>    cfe/trunk/lib/Edit/Makefile   (contents, props changed)
>>      - copied, changed from r152140, cfe/trunk/lib/Makefile
>>    cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp
>>    cfe/trunk/test/ARCMT/dispatch.m
>>    cfe/trunk/test/ARCMT/dispatch.m.result
>>    cfe/trunk/test/ARCMT/objcmt-numeric-literals.m
>>    cfe/trunk/test/ARCMT/objcmt-numeric-literals.m.result
>>    cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m
>>    cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result
>> Modified:
>>    cfe/trunk/include/clang-c/Index.h
>>    cfe/trunk/include/clang/ARCMigrate/ARCMT.h
>>    cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h
>>    cfe/trunk/include/clang/ARCMigrate/FileRemapper.h
>>    cfe/trunk/include/clang/Basic/Diagnostic.h
>>    cfe/trunk/include/clang/Driver/Action.h
>>    cfe/trunk/include/clang/Driver/CC1Options.td
>>    cfe/trunk/include/clang/Driver/Options.td
>>    cfe/trunk/include/clang/Driver/Types.def
>>    cfe/trunk/include/clang/Frontend/FrontendOptions.h
>>    cfe/trunk/include/clang/Rewrite/FixItRewriter.h
>>    cfe/trunk/lib/ARCMigrate/ARCMT.cpp
>>    cfe/trunk/lib/ARCMigrate/CMakeLists.txt
>>    cfe/trunk/lib/ARCMigrate/FileRemapper.cpp
>>    cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
>>    cfe/trunk/lib/Basic/DiagnosticIDs.cpp
>>    cfe/trunk/lib/CMakeLists.txt
>>    cfe/trunk/lib/Driver/Action.cpp
>>    cfe/trunk/lib/Driver/Driver.cpp
>>    cfe/trunk/lib/Driver/ToolChain.cpp
>>    cfe/trunk/lib/Driver/ToolChains.cpp
>>    cfe/trunk/lib/Driver/Tools.cpp
>>    cfe/trunk/lib/Driver/WindowsToolChain.cpp
>>    cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>>    cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp
>>    cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
>>    cfe/trunk/lib/Makefile
>>    cfe/trunk/lib/Rewrite/FixItRewriter.cpp
>>    cfe/trunk/test/ARCMT/driver-migrate.m
>>    cfe/trunk/test/ARCMT/migrate-emit-errors.m
>>    cfe/trunk/test/ARCMT/migrate-plist-output.m
>>    cfe/trunk/test/ARCMT/migrate-space-in-path.m
>>    cfe/trunk/test/ARCMT/migrate.m
>>    cfe/trunk/test/ARCMT/with-arc-mode-migrate.m
>>    cfe/trunk/test/ARCMT/with-arc-mode-migrate.m.result
>>    cfe/trunk/tools/arcmt-test/CMakeLists.txt
>>    cfe/trunk/tools/arcmt-test/Makefile
>>    cfe/trunk/tools/arcmt-test/arcmt-test.cpp
>>    cfe/trunk/tools/c-arcmt-test/c-arcmt-test.c
>>    cfe/trunk/tools/driver/CMakeLists.txt
>>    cfe/trunk/tools/driver/Makefile
>>    cfe/trunk/tools/libclang/ARCMigrate.cpp
>>    cfe/trunk/tools/libclang/CMakeLists.txt
>>    cfe/trunk/tools/libclang/Makefile
>>    cfe/trunk/tools/libclang/libclang.exports
>>    cfe/trunk/unittests/Frontend/Makefile
>>    cfe/trunk/unittests/Lex/LexerTest.cpp
>> 
>> Modified: cfe/trunk/include/clang-c/Index.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang-c/Index.h (original)
>> +++ cfe/trunk/include/clang-c/Index.h Tue Mar  6 14:06:33 2012
>> @@ -3983,6 +3983,20 @@
>> CINDEX_LINKAGE CXRemapping clang_getRemappings(const char *path);
>> 
>> /**
>> + * \brief Retrieve a remapping.
>> + *
>> + * \param filePaths pointer to an array of file paths containing remapping info.
>> + *
>> + * \param numFiles number of file paths.
>> + *
>> + * \returns the requested remapping. This remapping must be freed
>> + * via a call to \c clang_remap_dispose(). Can return NULL if an error occurred.
>> + */
>> +CINDEX_LINKAGE
>> +CXRemapping clang_getRemappingsFromFileList(const char **filePaths,
>> +                                            unsigned numFiles);
>> +
>> +/**
>>  * \brief Determine the number of remappings.
>>  */
>> CINDEX_LINKAGE unsigned clang_remap_getNumFiles(CXRemapping);
>> 
>> Modified: cfe/trunk/include/clang/ARCMigrate/ARCMT.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ARCMigrate/ARCMT.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/ARCMigrate/ARCMT.h (original)
>> +++ cfe/trunk/include/clang/ARCMigrate/ARCMT.h Tue Mar  6 14:06:33 2012
>> @@ -76,6 +76,15 @@
>>                        StringRef outputDir,
>>                        DiagnosticConsumer *DiagClient);
>> 
>> +/// \brief Get the set of file remappings from a list of files with remapping
>> +/// info.
>> +///
>> +/// \returns false if no error is produced, true otherwise.
>> +bool getFileRemappingsFromFileList(
>> +                        std::vector<std::pair<std::string,std::string> > &remap,
>> +                        ArrayRef<StringRef> remapFiles,
>> +                        DiagnosticConsumer *DiagClient);
>> +
>> typedef void (*TransformFn)(MigrationPass &pass);
>> 
>> std::vector<TransformFn> getAllTransformations(LangOptions::GCMode OrigGCMode,
>> 
>> Modified: cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h (original)
>> +++ cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h Tue Mar  6 14:06:33 2012
>> @@ -11,6 +11,7 @@
>> #define LLVM_CLANG_ARCMIGRATE_ARCMT_ACTION_H
>> 
>> #include "clang/Frontend/FrontendAction.h"
>> +#include "clang/ARCMigrate/FileRemapper.h"
>> #include "llvm/ADT/OwningPtr.h"
>> 
>> namespace clang {
>> @@ -32,6 +33,14 @@
>>   ModifyAction(FrontendAction *WrappedAction);
>> };
>> 
>> +class MigrateSourceAction : public ASTFrontendAction {
>> +  FileRemapper Remapper;
>> +protected:
>> +  virtual bool BeginInvocation(CompilerInstance &CI);
>> +  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
>> +                                         StringRef InFile);
>> +};
>> +
>> class MigrateAction : public WrapperFrontendAction {
>>   std::string MigrateDir;
>>   std::string PlistOut;
>> @@ -45,6 +54,23 @@
>>                 bool emitPremigrationARCErrors);
>> };
>> 
>> +/// \brief Migrates to modern ObjC syntax.
>> +class ObjCMigrateAction : public WrapperFrontendAction {
>> +  std::string MigrateDir;
>> +  bool MigrateLiterals;
>> +  bool MigrateSubscripting;
>> +  FileRemapper Remapper;
>> +  CompilerInstance *CompInst;
>> +public:
>> +  ObjCMigrateAction(FrontendAction *WrappedAction, StringRef migrateDir,
>> +                    bool migrateLiterals,
>> +                    bool migrateSubscripting);
>> +
>> +protected:
>> +  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,StringRef InFile);
>> +  virtual bool BeginInvocation(CompilerInstance &CI);
>> +};
>> +
>> }
>> }
>> 
>> 
>> Modified: cfe/trunk/include/clang/ARCMigrate/FileRemapper.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ARCMigrate/FileRemapper.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/ARCMigrate/FileRemapper.h (original)
>> +++ cfe/trunk/include/clang/ARCMigrate/FileRemapper.h Tue Mar  6 14:06:33 2012
>> @@ -24,7 +24,7 @@
>>   class FileManager;
>>   class FileEntry;
>>   class DiagnosticsEngine;
>> -  class CompilerInvocation;
>> +  class PreprocessorOptions;
>> 
>> namespace arcmt {
>> 
>> @@ -44,7 +44,10 @@
>> 
>>   bool initFromDisk(StringRef outputDir, DiagnosticsEngine &Diag,
>>                     bool ignoreIfFilesChanged);
>> +  bool initFromFile(StringRef filePath, DiagnosticsEngine &Diag,
>> +                    bool ignoreIfFilesChanged);
>>   bool flushToDisk(StringRef outputDir, DiagnosticsEngine &Diag);
>> +  bool flushToFile(StringRef outputPath, DiagnosticsEngine &Diag);
>> 
>>   bool overwriteOriginal(DiagnosticsEngine &Diag,
>>                          StringRef outputDir = StringRef());
>> @@ -52,9 +55,9 @@
>>   void remap(StringRef filePath, llvm::MemoryBuffer *memBuf);
>>   void remap(StringRef filePath, StringRef newPath);
>> 
>> -  void applyMappings(CompilerInvocation &CI) const;
>> +  void applyMappings(PreprocessorOptions &PPOpts) const;
>> 
>> -  void transferMappingsAndClear(CompilerInvocation &CI);
>> +  void transferMappingsAndClear(PreprocessorOptions &PPOpts);
>> 
>>   void clear(StringRef outputDir = StringRef());
>> 
>> 
>> Modified: cfe/trunk/include/clang/Basic/Diagnostic.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/Diagnostic.h (original)
>> +++ cfe/trunk/include/clang/Basic/Diagnostic.h Tue Mar  6 14:06:33 2012
>> @@ -50,13 +50,19 @@
>>   /// insertion hint.
>>   CharSourceRange RemoveRange;
>> 
>> +  /// \brief Code in the specific range that should be inserted in the insertion
>> +  /// location.
>> +  CharSourceRange InsertFromRange;
>> +
>>   /// \brief The actual code to insert at the insertion location, as a
>>   /// string.
>>   std::string CodeToInsert;
>> 
>> +  bool BeforePreviousInsertions;
>> +
>>   /// \brief Empty code modification hint, indicating that no code
>>   /// modification is known.
>> -  FixItHint() : RemoveRange() { }
>> +  FixItHint() : BeforePreviousInsertions(false) { }
>> 
>>   bool isNull() const {
>>     return !RemoveRange.isValid();
>> @@ -65,11 +71,26 @@
>>   /// \brief Create a code modification hint that inserts the given
>>   /// code string at a specific location.
>>   static FixItHint CreateInsertion(SourceLocation InsertionLoc,
>> -                                   StringRef Code) {
>> +                                   StringRef Code,
>> +                                   bool BeforePreviousInsertions = false) {
>>     FixItHint Hint;
>>     Hint.RemoveRange =
>>       CharSourceRange(SourceRange(InsertionLoc, InsertionLoc), false);
>>     Hint.CodeToInsert = Code;
>> +    Hint.BeforePreviousInsertions = BeforePreviousInsertions;
>> +    return Hint;
>> +  }
>> +
>> +  /// \brief Create a code modification hint that inserts the given
>> +  /// code from \arg FromRange at a specific location.
>> +  static FixItHint CreateInsertionFromRange(SourceLocation InsertionLoc,
>> +                                            CharSourceRange FromRange,
>> +                                        bool BeforePreviousInsertions = false) {
>> +    FixItHint Hint;
>> +    Hint.RemoveRange =
>> +      CharSourceRange(SourceRange(InsertionLoc, InsertionLoc), false);
>> +    Hint.InsertFromRange = FromRange;
>> +    Hint.BeforePreviousInsertions = BeforePreviousInsertions;
>>     return Hint;
>>   }
>> 
>> 
>> Modified: cfe/trunk/include/clang/Driver/Action.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Action.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/Action.h (original)
>> +++ cfe/trunk/include/clang/Driver/Action.h Tue Mar  6 14:06:33 2012
>> @@ -39,6 +39,7 @@
>>     PreprocessJobClass,
>>     PrecompileJobClass,
>>     AnalyzeJobClass,
>> +    MigrateJobClass,
>>     CompileJobClass,
>>     AssembleJobClass,
>>     LinkJobClass,
>> @@ -171,6 +172,17 @@
>>   static bool classof(const AnalyzeJobAction *) { return true; }
>> };
>> 
>> +class MigrateJobAction : public JobAction {
>> +  virtual void anchor();
>> +public:
>> +  MigrateJobAction(Action *Input, types::ID OutputType);
>> +
>> +  static bool classof(const Action *A) {
>> +    return A->getKind() == MigrateJobClass;
>> +  }
>> +  static bool classof(const MigrateJobAction *) { return true; }
>> +};
>> +
>> class CompileJobAction : public JobAction {
>>   virtual void anchor();
>> public:
>> 
>> Modified: cfe/trunk/include/clang/Driver/CC1Options.td
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
>> +++ cfe/trunk/include/clang/Driver/CC1Options.td Tue Mar  6 14:06:33 2012
>> @@ -433,21 +433,28 @@
>>   HelpText<"Rewrite ObjC into C (code rewriter example)">;
>> def rewrite_macros : Flag<"-rewrite-macros">,
>>   HelpText<"Expand macros without full preprocessing">;
>> +def migrate : Flag<"-migrate">,
>> +  HelpText<"Migrate source code">;
>> }
>> 
>> +def mt_migrate_directory : Separate<"-mt-migrate-directory">,
>> +  HelpText<"Directory for temporary files produced during ARC or ObjC migration">;
>> def arcmt_check : Flag<"-arcmt-check">,
>>   HelpText<"Check for ARC migration issues that need manual handling">;
>> def arcmt_modify : Flag<"-arcmt-modify">,
>>   HelpText<"Apply modifications to files to conform to ARC">;
>> def arcmt_migrate : Flag<"-arcmt-migrate">,
>>   HelpText<"Apply modifications and produces temporary files that conform to ARC">;
>> -def arcmt_migrate_directory : Separate<"-arcmt-migrate-directory">,
>> -  HelpText<"Directory for temporary files produced during ARC migration">;
>> def arcmt_migrate_report_output : Separate<"-arcmt-migrate-report-output">,
>>   HelpText<"Output path for the plist report">;
>> def arcmt_migrate_emit_arc_errors : Flag<"-arcmt-migrate-emit-errors">,
>>   HelpText<"Emit ARC errors even if the migrator can fix them">;
>> 
>> +def objcmt_migrate_literals : Flag<"-objcmt-migrate-literals">,
>> +  HelpText<"Enable migration to modern ObjC literals">;
>> +def objcmt_migrate_subscripting : Flag<"-objcmt-migrate-subscripting">,
>> +  HelpText<"Enable migration to modern ObjC subscripting">;
>> +
>> def working_directory : JoinedOrSeparate<"-working-directory">,
>>   HelpText<"Resolve file paths relative to the specified directory">;
>> def working_directory_EQ : Joined<"-working-directory=">,
>> 
>> Modified: cfe/trunk/include/clang/Driver/Options.td
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/Options.td (original)
>> +++ cfe/trunk/include/clang/Driver/Options.td Tue Mar  6 14:06:33 2012
>> @@ -118,13 +118,21 @@
>> def ccc_arrmt_modify : Flag<"-ccc-arrmt-modify">, Alias<ccc_arcmt_modify>;
>> def ccc_arcmt_migrate : Separate<"-ccc-arcmt-migrate">, CCCDriverOpt,
>>   HelpText<"Apply modifications and produces temporary files that conform to ARC">;
>> -def ccc_arcmt_migrate_EQ : Joined<"-ccc-arcmt-migrate=">, CCCDriverOpt,
>> -  Alias<ccc_arcmt_migrate>;
>> def arcmt_migrate_report_output : Separate<"-arcmt-migrate-report-output">,
>>   HelpText<"Output path for the plist report">;
>> def arcmt_migrate_emit_arc_errors : Flag<"-arcmt-migrate-emit-errors">,
>>   HelpText<"Emit ARC errors even if the migrator can fix them">;
>> 
>> +def _migrate : Flag<"--migrate">, Flags<[DriverOption]>,
>> +  HelpText<"Run the migrator">;
>> +def ccc_objcmt_migrate : Separate<"-ccc-objcmt-migrate">, CCCDriverOpt,
>> +  HelpText<"Apply modifications and produces temporary files to migrate to "
>> +   "modern ObjC syntax">;
>> +def objcmt_migrate_literals : Flag<"-objcmt-migrate-literals">,
>> +  HelpText<"Enable migration to modern ObjC literals">;
>> +def objcmt_migrate_subscripting : Flag<"-objcmt-migrate-subscripting">,
>> +  HelpText<"Enable migration to modern ObjC subscripting">;
>> +
>> // Make sure all other -ccc- options are rejected.
>> def ccc_ : Joined<"-ccc-">, Group<ccc_Group>, Flags<[Unsupported]>;
>> 
>> 
>> Modified: cfe/trunk/include/clang/Driver/Types.def
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Types.def?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/Types.def (original)
>> +++ cfe/trunk/include/clang/Driver/Types.def Tue Mar  6 14:06:33 2012
>> @@ -82,6 +82,7 @@
>> TYPE("ast",                      AST,          INVALID,         "ast",   "u")
>> TYPE("plist",                    Plist,        INVALID,         "plist", "")
>> TYPE("rewritten-objc",           RewrittenObjC,INVALID,         "cpp",   "")
>> +TYPE("remap",                    Remap,        INVALID,         "remap", "")
>> TYPE("precompiled-header",       PCH,          INVALID,         "gch",   "A")
>> TYPE("object",                   Object,       INVALID,         "o",     "")
>> TYPE("treelang",                 Treelang,     INVALID,         0,       "u")
>> 
>> Added: cfe/trunk/include/clang/Edit/Commit.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/Commit.h?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/include/clang/Edit/Commit.h (added)
>> +++ cfe/trunk/include/clang/Edit/Commit.h Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,140 @@
>> +//===----- Commit.h - A unit of edits ---------------------------*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_CLANG_EDIT_COMMIT_H
>> +#define LLVM_CLANG_EDIT_COMMIT_H
>> +
>> +#include "clang/Edit/FileOffset.h"
>> +#include "llvm/ADT/StringRef.h"
>> +#include "llvm/ADT/SmallVector.h"
>> +
>> +namespace clang {
>> +  class LangOptions;
>> +  class PreprocessingRecord;
>> +
>> +namespace edit {
>> +  class EditedSource;
>> +
>> +class Commit {
>> +public:
>> +  enum EditKind {
>> +    Act_Insert,
>> +    Act_InsertFromRange,
>> +    Act_Remove
>> +  };
>> +
>> +  struct Edit {
>> +    EditKind Kind;
>> +    StringRef Text;
>> +    SourceLocation OrigLoc;
>> +    FileOffset Offset;
>> +    FileOffset InsertFromRangeOffs;
>> +    unsigned Length;
>> +    bool BeforePrev;
>> +
>> +    SourceLocation getFileLocation(SourceManager &SM) const;
>> +    CharSourceRange getFileRange(SourceManager &SM) const;
>> +    CharSourceRange getInsertFromRange(SourceManager &SM) const;
>> +  };
>> +
>> +private:
>> +  const SourceManager &SourceMgr;
>> +  const LangOptions &LangOpts;
>> +  const PreprocessingRecord *PPRec;
>> +  EditedSource *Editor;
>> +
>> +  bool IsCommitable;
>> +  SmallVector<Edit, 8> CachedEdits;
>> +
>> +public:
>> +  explicit Commit(EditedSource &Editor);
>> +  Commit(const SourceManager &SM, const LangOptions &LangOpts,
>> +         const PreprocessingRecord *PPRec = 0)
>> +    : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec), Editor(0),
>> +      IsCommitable(true) { }
>> +
>> +  bool isCommitable() const { return IsCommitable; }
>> +
>> +  bool insert(SourceLocation loc, StringRef text, bool afterToken = false,
>> +              bool beforePreviousInsertions = false);
>> +  bool insertAfterToken(SourceLocation loc, StringRef text,
>> +                        bool beforePreviousInsertions = false) {
>> +    return insert(loc, text, /*afterToken=*/true, beforePreviousInsertions);
>> +  }
>> +  bool insertBefore(SourceLocation loc, StringRef text) {
>> +    return insert(loc, text, /*afterToken=*/false,
>> +                  /*beforePreviousInsertions=*/true);
>> +  }
>> +  bool insertFromRange(SourceLocation loc, CharSourceRange range,
>> +                       bool afterToken = false,
>> +                       bool beforePreviousInsertions = false);
>> +  bool insertWrap(StringRef before, CharSourceRange range, StringRef after);
>> +
>> +  bool remove(CharSourceRange range);
>> +
>> +  bool replace(CharSourceRange range, StringRef text);
>> +  bool replaceWithInner(CharSourceRange range, CharSourceRange innerRange);
>> +  bool replaceText(SourceLocation loc, StringRef text,
>> +                   StringRef replacementText);
>> +
>> +  bool insertFromRange(SourceLocation loc, SourceRange TokenRange,
>> +                       bool afterToken = false,
>> +                       bool beforePreviousInsertions = false) {
>> +    return insertFromRange(loc, CharSourceRange::getTokenRange(TokenRange),
>> +                           afterToken, beforePreviousInsertions);
>> +  }
>> +  bool insertWrap(StringRef before, SourceRange TokenRange, StringRef after) {
>> +    return insertWrap(before, CharSourceRange::getTokenRange(TokenRange), after);
>> +  }
>> +  bool remove(SourceRange TokenRange) {
>> +    return remove(CharSourceRange::getTokenRange(TokenRange));
>> +  }
>> +  bool replace(SourceRange TokenRange, StringRef text) {
>> +    return replace(CharSourceRange::getTokenRange(TokenRange), text);
>> +  }
>> +  bool replaceWithInner(SourceRange TokenRange, SourceRange TokenInnerRange) {
>> +    return replaceWithInner(CharSourceRange::getTokenRange(TokenRange),
>> +                            CharSourceRange::getTokenRange(TokenInnerRange));
>> +  }
>> +
>> +  typedef SmallVector<Edit, 8>::const_iterator edit_iterator;
>> +  edit_iterator edit_begin() const { return CachedEdits.begin(); }
>> +  edit_iterator edit_end() const { return CachedEdits.end(); }
>> +
>> +private:
>> +  void addInsert(SourceLocation OrigLoc,
>> +                FileOffset Offs, StringRef text, bool beforePreviousInsertions);
>> +  void addInsertFromRange(SourceLocation OrigLoc, FileOffset Offs,
>> +                          FileOffset RangeOffs, unsigned RangeLen,
>> +                          bool beforePreviousInsertions);
>> +  void addRemove(SourceLocation OrigLoc, FileOffset Offs, unsigned Len);
>> +
>> +  bool canInsert(SourceLocation loc, FileOffset &Offset);
>> +  bool canInsertAfterToken(SourceLocation loc, FileOffset &Offset,
>> +                           SourceLocation &AfterLoc);
>> +  bool canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs);
>> +  bool canRemoveRange(CharSourceRange range, FileOffset &Offs, unsigned &Len);
>> +  bool canReplaceText(SourceLocation loc, StringRef text,
>> +                      FileOffset &Offs, unsigned &Len);
>> +
>> +  void commitInsert(FileOffset offset, StringRef text,
>> +                    bool beforePreviousInsertions);
>> +  void commitRemove(FileOffset offset, unsigned length);
>> +
>> +  bool isAtStartOfMacroExpansion(SourceLocation loc,
>> +                                 SourceLocation *MacroBegin = 0) const;
>> +  bool isAtEndOfMacroExpansion(SourceLocation loc,
>> +                               SourceLocation *MacroEnd = 0) const;
>> +};
>> +
>> +}
>> +
>> +} // end namespace clang
>> +
>> +#endif
>> 
>> Added: cfe/trunk/include/clang/Edit/EditedSource.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/EditedSource.h?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/include/clang/Edit/EditedSource.h (added)
>> +++ cfe/trunk/include/clang/Edit/EditedSource.h Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,87 @@
>> +//===----- EditedSource.h - Collection of source edits ----------*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_CLANG_EDIT_EDITEDSOURCE_H
>> +#define LLVM_CLANG_EDIT_EDITEDSOURCE_H
>> +
>> +#include "clang/Edit/FileOffset.h"
>> +#include "llvm/Support/Allocator.h"
>> +#include "llvm/ADT/DenseMap.h"
>> +#include "llvm/ADT/StringRef.h"
>> +#include <map>
>> +
>> +namespace clang {
>> +  class LangOptions;
>> +  class PreprocessingRecord;
>> +
>> +namespace edit {
>> +  class Commit;
>> +  class EditsReceiver;
>> +
>> +class EditedSource {
>> +  const SourceManager &SourceMgr;
>> +  const LangOptions &LangOpts;
>> +  const PreprocessingRecord *PPRec;
>> +
>> +  struct FileEdit {
>> +    StringRef Text;
>> +    unsigned RemoveLen;
>> +
>> +    FileEdit() : RemoveLen(0) {}
>> +  };
>> +
>> +  typedef std::map<FileOffset, FileEdit> FileEditsTy;
>> +  FileEditsTy FileEdits;
>> +
>> +  llvm::DenseMap<unsigned, SourceLocation> ExpansionToArgMap;
>> +
>> +  llvm::BumpPtrAllocator StrAlloc;
>> +
>> +public:
>> +  EditedSource(const SourceManager &SM, const LangOptions &LangOpts,
>> +               const PreprocessingRecord *PPRec = 0)
>> +    : SourceMgr(SM), LangOpts(LangOpts), PPRec(PPRec),
>> +      StrAlloc(/*size=*/512) { }
>> +
>> +  const SourceManager &getSourceManager() const { return SourceMgr; }
>> +  const LangOptions &getLangOptions() const { return LangOpts; }
>> +  const PreprocessingRecord *getPreprocessingRecord() const { return PPRec; }
>> +
>> +  bool canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs);
>> +
>> +  bool commit(const Commit &commit);
>> +
>> +  void applyRewrites(EditsReceiver &receiver);
>> +  void clearRewrites();
>> +
>> +  StringRef copyString(StringRef str) {
>> +    char *buf = StrAlloc.Allocate<char>(str.size());
>> +    std::uninitialized_copy(str.begin(), str.end(), buf);
>> +    return StringRef(buf, str.size());
>> +  }
>> +  StringRef copyString(const Twine &twine);
>> +
>> +private:
>> +  bool commitInsert(SourceLocation OrigLoc, FileOffset Offs, StringRef text,
>> +                    bool beforePreviousInsertions);
>> +  bool commitInsertFromRange(SourceLocation OrigLoc, FileOffset Offs,
>> +                             FileOffset InsertFromRangeOffs, unsigned Len,
>> +                             bool beforePreviousInsertions);
>> +  void commitRemove(SourceLocation OrigLoc, FileOffset BeginOffs, unsigned Len);
>> +
>> +  StringRef getSourceText(FileOffset BeginOffs, FileOffset EndOffs,
>> +                          bool &Invalid);
>> +  FileEditsTy::iterator getActionForOffset(FileOffset Offs);
>> +};
>> +
>> +}
>> +
>> +} // end namespace clang
>> +
>> +#endif
>> 
>> Added: cfe/trunk/include/clang/Edit/EditsReceiver.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/EditsReceiver.h?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/include/clang/Edit/EditsReceiver.h (added)
>> +++ cfe/trunk/include/clang/Edit/EditsReceiver.h Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,35 @@
>> +//===----- EditedSource.h - Collection of source edits ----------*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_CLANG_EDIT_EDITSRECEIVER_H
>> +#define LLVM_CLANG_EDIT_EDITSRECEIVER_H
>> +
>> +#include "clang/Basic/LLVM.h"
>> +
>> +namespace clang {
>> +  class SourceLocation;
>> +  class CharSourceRange;
>> +
>> +namespace edit {
>> +
>> +class EditsReceiver {
>> +public:
>> +  virtual ~EditsReceiver() { }
>> +
>> +  virtual void insert(SourceLocation loc, StringRef text) = 0;
>> +  virtual void replace(CharSourceRange range, StringRef text) = 0;
>> +  /// \brief By default it calls replace with an empty string.
>> +  virtual void remove(CharSourceRange range);
>> +};
>> +
>> +}
>> +
>> +} // end namespace clang
>> +
>> +#endif
>> 
>> Added: cfe/trunk/include/clang/Edit/FileOffset.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/FileOffset.h?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/include/clang/Edit/FileOffset.h (added)
>> +++ cfe/trunk/include/clang/Edit/FileOffset.h Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,65 @@
>> +//===----- FileOffset.h - Offset in a file ----------------------*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_CLANG_EDIT_FILEOFFSET_H
>> +#define LLVM_CLANG_EDIT_FILEOFFSET_H
>> +
>> +#include "clang/Basic/SourceLocation.h"
>> +
>> +namespace clang {
>> +
>> +namespace edit {
>> +
>> +class FileOffset {
>> +  FileID FID;
>> +  unsigned Offs;
>> +public:
>> +  FileOffset() : Offs(0) { }
>> +  FileOffset(FileID fid, unsigned offs) : FID(fid), Offs(offs) { }
>> +
>> +  bool isInvalid() const { return FID.isInvalid(); }
>> +
>> +  FileID getFID() const { return FID; }
>> +  unsigned getOffset() const { return Offs; }
>> +
>> +  FileOffset getWithOffset(unsigned offset) const {
>> +    FileOffset NewOffs = *this;
>> +    NewOffs.Offs += offset;
>> +    return NewOffs;
>> +  }
>> +
>> +  friend bool operator==(FileOffset LHS, FileOffset RHS) {
>> +    return LHS.FID == RHS.FID && LHS.Offs == RHS.Offs;
>> +  }
>> +  friend bool operator!=(FileOffset LHS, FileOffset RHS) {
>> +    return !(LHS == RHS);
>> +  }
>> +  friend bool operator<(FileOffset LHS, FileOffset RHS) {
>> +    if (LHS.FID != RHS.FID)
>> +      return LHS.FID < RHS.FID;
>> +    return LHS.Offs < RHS.Offs;
>> +  }
>> +  friend bool operator>(FileOffset LHS, FileOffset RHS) {
>> +    if (LHS.FID != RHS.FID)
>> +      return LHS.FID > RHS.FID;
>> +    return LHS.Offs > RHS.Offs;
>> +  }
>> +  friend bool operator>=(FileOffset LHS, FileOffset RHS) {
>> +    return LHS > RHS || LHS == RHS;
>> +  }
>> +  friend bool operator<=(FileOffset LHS, FileOffset RHS) {
>> +    return LHS < RHS || LHS == RHS;
>> +  }
>> +};
>> +
>> +}
>> +
>> +} // end namespace clang
>> +
>> +#endif
>> 
>> Added: cfe/trunk/include/clang/Edit/Rewriters.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Edit/Rewriters.h?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/include/clang/Edit/Rewriters.h (added)
>> +++ cfe/trunk/include/clang/Edit/Rewriters.h Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,33 @@
>> +//===--- Rewriters.h - Rewritings     ---------------------------*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_CLANG_EDIT_REWRITERS_H
>> +#define LLVM_CLANG_EDIT_REWRITERS_H
>> +
>> +namespace clang {
>> +  class ObjCMessageExpr;
>> +  class NSAPI;
>> +
>> +namespace edit {
>> +  class Commit;
>> +
>> +bool rewriteObjCRedundantCallWithLiteral(const ObjCMessageExpr *Msg,
>> +                                         const NSAPI &NS, Commit &commit);
>> +
>> +bool rewriteToObjCLiteralSyntax(const ObjCMessageExpr *Msg,
>> +                                const NSAPI &NS, Commit &commit);
>> +
>> +bool rewriteToObjCSubscriptSyntax(const ObjCMessageExpr *Msg,
>> +                                  const NSAPI &NS, Commit &commit);
>> +
>> +}
>> +
>> +}  // end namespace clang
>> +
>> +#endif
>> 
>> Modified: cfe/trunk/include/clang/Frontend/FrontendOptions.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendOptions.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Frontend/FrontendOptions.h (original)
>> +++ cfe/trunk/include/clang/Frontend/FrontendOptions.h Tue Mar  6 14:06:33 2012
>> @@ -46,6 +46,7 @@
>>     RewriteObjC,            ///< ObjC->C Rewriter.
>>     RewriteTest,            ///< Rewriter playground
>>     RunAnalysis,            ///< Run one or more source code analyses.
>> +    MigrateSource,          ///< Run migrator.
>>     RunPreprocessorOnly     ///< Just lex, no output.
>>   };
>> }
>> @@ -118,7 +119,16 @@
>>     ARCMT_Migrate
>>   } ARCMTAction;
>> 
>> -  std::string ARCMTMigrateDir;
>> +  enum {
>> +    ObjCMT_None = 0,
>> +    /// \brief Enable migration to modern ObjC literals.
>> +    ObjCMT_Literals = 0x1,
>> +    /// \brief Enable migration to modern ObjC subscripting.
>> +    ObjCMT_Subscripting = 0x2
>> +  };
>> +  unsigned ObjCMTAction;
>> +
>> +  std::string MTMigrateDir;
>>   std::string ARCMTMigrateReportOut;
>> 
>>   /// The input files and their types.
>> @@ -177,6 +187,7 @@
>>     ShowVersion = 0;
>>     ARCMTAction = ARCMT_None;
>>     ARCMTMigrateEmitARCErrors = 0;
>> +    ObjCMTAction = ObjCMT_None;
>>   }
>> 
>>   /// getInputKindForExtension - Return the appropriate input kind for a file
>> 
>> Modified: cfe/trunk/include/clang/Rewrite/FixItRewriter.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Rewrite/FixItRewriter.h?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Rewrite/FixItRewriter.h (original)
>> +++ cfe/trunk/include/clang/Rewrite/FixItRewriter.h Tue Mar  6 14:06:33 2012
>> @@ -18,6 +18,7 @@
>> #include "clang/Basic/Diagnostic.h"
>> #include "clang/Basic/SourceLocation.h"
>> #include "clang/Rewrite/Rewriter.h"
>> +#include "clang/Edit/EditedSource.h"
>> 
>> namespace clang {
>> 
>> @@ -56,6 +57,8 @@
>>   /// \brief The diagnostics machinery.
>>   DiagnosticsEngine &Diags;
>> 
>> +  edit::EditedSource Editor;
>> +
>>   /// \brief The rewriter used to perform the various code
>>   /// modifications.
>>   Rewriter Rewrite;
>> 
>> Modified: cfe/trunk/lib/ARCMigrate/ARCMT.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ARCMT.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/ARCMigrate/ARCMT.cpp (original)
>> +++ cfe/trunk/lib/ARCMigrate/ARCMT.cpp Tue Mar  6 14:06:33 2012
>> @@ -398,13 +398,51 @@
>>   if (err)
>>     return true;
>> 
>> -  CompilerInvocation CI;
>> -  remapper.applyMappings(CI);
>> -  remap = CI.getPreprocessorOpts().RemappedFiles;
>> +  PreprocessorOptions PPOpts;
>> +  remapper.applyMappings(PPOpts);
>> +  remap = PPOpts.RemappedFiles;
>> 
>>   return false;
>> }
>> 
>> +bool arcmt::getFileRemappingsFromFileList(
>> +                        std::vector<std::pair<std::string,std::string> > &remap,
>> +                        ArrayRef<StringRef> remapFiles,
>> +                        DiagnosticConsumer *DiagClient) {
>> +  bool hasErrorOccurred = false;
>> +  llvm::StringMap<bool> Uniquer;
>> +
>> +  llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
>> +  llvm::IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
>> +      new DiagnosticsEngine(DiagID, DiagClient, /*ShouldOwnClient=*/false));
>> +
>> +  for (ArrayRef<StringRef>::iterator
>> +         I = remapFiles.begin(), E = remapFiles.end(); I != E; ++I) {
>> +    StringRef file = *I;
>> +
>> +    FileRemapper remapper;
>> +    bool err = remapper.initFromFile(file, *Diags,
>> +                                     /*ignoreIfFilesChanged=*/true);
>> +    hasErrorOccurred = hasErrorOccurred || err;
>> +    if (err)
>> +      continue;
>> +
>> +    PreprocessorOptions PPOpts;
>> +    remapper.applyMappings(PPOpts);
>> +    for (PreprocessorOptions::remapped_file_iterator
>> +           RI = PPOpts.remapped_file_begin(), RE = PPOpts.remapped_file_end();
>> +           RI != RE; ++RI) {
>> +      bool &inserted = Uniquer[RI->first];
>> +      if (inserted)
>> +        continue;
>> +      inserted = true;
>> +      remap.push_back(*RI);
>> +    }
>> +  }
>> +
>> +  return hasErrorOccurred;
>> +}
>> +
>> //===----------------------------------------------------------------------===//
>> // CollectTransformActions.
>> //===----------------------------------------------------------------------===//
>> @@ -504,7 +542,7 @@
>>   CInvok.reset(createInvocationForMigration(OrigCI));
>>   CInvok->getDiagnosticOpts().IgnoreWarnings = true;
>> 
>> -  Remapper.applyMappings(*CInvok);
>> +  Remapper.applyMappings(CInvok->getPreprocessorOpts());
>> 
>>   CapturedDiagList capturedDiags;
>>   std::vector<SourceLocation> ARCMTMacroLocs;
>> 
>> Modified: cfe/trunk/lib/ARCMigrate/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/CMakeLists.txt?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/ARCMigrate/CMakeLists.txt (original)
>> +++ cfe/trunk/lib/ARCMigrate/CMakeLists.txt Tue Mar  6 14:06:33 2012
>> @@ -4,6 +4,7 @@
>>   ARCMT.cpp
>>   ARCMTActions.cpp
>>   FileRemapper.cpp
>> +  ObjCMT.cpp
>>   PlistReporter.cpp
>>   TransAPIUses.cpp
>>   TransARCAssign.cpp
>> 
>> Modified: cfe/trunk/lib/ARCMigrate/FileRemapper.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/FileRemapper.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/ARCMigrate/FileRemapper.cpp (original)
>> +++ cfe/trunk/lib/ARCMigrate/FileRemapper.cpp Tue Mar  6 14:06:33 2012
>> @@ -8,8 +8,9 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/ARCMigrate/FileRemapper.h"
>> -#include "clang/Frontend/CompilerInvocation.h"
>> +#include "clang/Frontend/PreprocessorOptions.h"
>> #include "clang/Basic/FileManager.h"
>> +#include "clang/Basic/Diagnostic.h"
>> #include "llvm/Support/MemoryBuffer.h"
>> #include "llvm/Support/Path.h"
>> #include "llvm/Support/FileSystem.h"
>> @@ -50,9 +51,15 @@
>> 
>> bool FileRemapper::initFromDisk(StringRef outputDir, DiagnosticsEngine &Diag,
>>                                 bool ignoreIfFilesChanged) {
>> +  std::string infoFile = getRemapInfoFile(outputDir);
>> +  return initFromFile(infoFile, Diag, ignoreIfFilesChanged);
>> +}
>> +
>> +bool FileRemapper::initFromFile(StringRef filePath, DiagnosticsEngine &Diag,
>> +                                bool ignoreIfFilesChanged) {
>>   assert(FromToMappings.empty() &&
>>          "initFromDisk should be called before any remap calls");
>> -  std::string infoFile = getRemapInfoFile(outputDir);
>> +  std::string infoFile = filePath;
>>   bool fileExists = false;
>>   llvm::sys::fs::exists(infoFile, fileExists);
>>   if (!fileExists)
>> @@ -108,8 +115,15 @@
>>   if (fs::create_directory(outputDir, existed) != llvm::errc::success)
>>     return report("Could not create directory: " + outputDir, Diag);
>> 
>> -  std::string errMsg;
>>   std::string infoFile = getRemapInfoFile(outputDir);
>> +  return flushToFile(infoFile, Diag);
>> +}
>> +
>> +bool FileRemapper::flushToFile(StringRef outputPath, DiagnosticsEngine &Diag) {
>> +  using namespace llvm::sys;
>> +
>> +  std::string errMsg;
>> +  std::string infoFile = outputPath;
>>   llvm::raw_fd_ostream infoOut(infoFile.c_str(), errMsg,
>>                                llvm::raw_fd_ostream::F_Binary);
>>   if (!errMsg.empty())
>> @@ -189,8 +203,7 @@
>>   return false;
>> }
>> 
>> -void FileRemapper::applyMappings(CompilerInvocation &CI) const {
>> -  PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
>> +void FileRemapper::applyMappings(PreprocessorOptions &PPOpts) const {
>>   for (MappingsTy::const_iterator
>>          I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) {
>>     if (const FileEntry *FE = I->second.dyn_cast<const FileEntry *>()) {
>> @@ -204,8 +217,7 @@
>>   PPOpts.RetainRemappedFileBuffers = true;
>> }
>> 
>> -void FileRemapper::transferMappingsAndClear(CompilerInvocation &CI) {
>> -  PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
>> +void FileRemapper::transferMappingsAndClear(PreprocessorOptions &PPOpts) {
>>   for (MappingsTy::iterator
>>          I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) {
>>     if (const FileEntry *FE = I->second.dyn_cast<const FileEntry *>()) {
>> 
>> Added: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (added)
>> +++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,226 @@
>> +//===--- ObjCMT.cpp - ObjC Migrate Tool -----------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "clang/ARCMigrate/ARCMTActions.h"
>> +#include "clang/Frontend/CompilerInstance.h"
>> +#include "clang/Frontend/MultiplexConsumer.h"
>> +#include "clang/AST/RecursiveASTVisitor.h"
>> +#include "clang/AST/NSAPI.h"
>> +#include "clang/AST/ASTConsumer.h"
>> +#include "clang/Edit/Rewriters.h"
>> +#include "clang/Edit/EditedSource.h"
>> +#include "clang/Edit/Commit.h"
>> +#include "clang/Edit/EditsReceiver.h"
>> +#include "clang/Rewrite/Rewriter.h"
>> +#include "clang/Lex/Preprocessor.h"
>> +#include "clang/Basic/FileManager.h"
>> +#include "llvm/ADT/SmallString.h"
>> +
>> +using namespace clang;
>> +using namespace arcmt;
>> +
>> +namespace {
>> +
>> +class ObjCMigrateASTConsumer : public ASTConsumer {
>> +  void migrateDecl(Decl *D);
>> +
>> +public:
>> +  std::string MigrateDir;
>> +  bool MigrateLiterals;
>> +  bool MigrateSubscripting;
>> +  llvm::OwningPtr<NSAPI> NSAPIObj;
>> +  llvm::OwningPtr<edit::EditedSource> Editor;
>> +  FileRemapper &Remapper;
>> +  FileManager &FileMgr;
>> +  const PreprocessingRecord *PPRec;
>> +  bool IsOutputFile;
>> +
>> +  ObjCMigrateASTConsumer(StringRef migrateDir,
>> +                         bool migrateLiterals,
>> +                         bool migrateSubscripting,
>> +                         FileRemapper &remapper,
>> +                         FileManager &fileMgr,
>> +                         const PreprocessingRecord *PPRec,
>> +                         bool isOutputFile = false)
>> +  : MigrateDir(migrateDir),
>> +    MigrateLiterals(migrateLiterals),
>> +    MigrateSubscripting(migrateSubscripting),
>> +    Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec),
>> +    IsOutputFile(isOutputFile) { }
>> +
>> +protected:
>> +  virtual void Initialize(ASTContext &Context) {
>> +    NSAPIObj.reset(new NSAPI(Context));
>> +    Editor.reset(new edit::EditedSource(Context.getSourceManager(),
>> +                                        Context.getLangOptions(),
>> +                                        PPRec));
>> +  }
>> +
>> +  virtual bool HandleTopLevelDecl(DeclGroupRef DG) {
>> +    for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
>> +      migrateDecl(*I);
>> +    return true;
>> +  }
>> +  virtual void HandleInterestingDecl(DeclGroupRef DG) {
>> +    // Ignore decls from the PCH.
>> +  }
>> +  virtual void HandleTopLevelDeclInObjCContainer(DeclGroupRef DG) {
>> +    ObjCMigrateASTConsumer::HandleTopLevelDecl(DG);
>> +  }
>> +
>> +  virtual void HandleTranslationUnit(ASTContext &Ctx);
>> +};
>> +
>> +}
>> +
>> +ObjCMigrateAction::ObjCMigrateAction(FrontendAction *WrappedAction,
>> +                             StringRef migrateDir,
>> +                             bool migrateLiterals,
>> +                             bool migrateSubscripting)
>> +  : WrapperFrontendAction(WrappedAction), MigrateDir(migrateDir),
>> +    MigrateLiterals(migrateLiterals), MigrateSubscripting(migrateSubscripting),
>> +    CompInst(0) {
>> +  if (MigrateDir.empty())
>> +    MigrateDir = "."; // user current directory if none is given.
>> +}
>> +
>> +ASTConsumer *ObjCMigrateAction::CreateASTConsumer(CompilerInstance &CI,
>> +                                                  StringRef InFile) {
>> +  ASTConsumer *
>> +    WrappedConsumer = WrapperFrontendAction::CreateASTConsumer(CI, InFile);
>> +  ASTConsumer *MTConsumer = new ObjCMigrateASTConsumer(MigrateDir,
>> +                                                       MigrateLiterals,
>> +                                                       MigrateSubscripting,
>> +                                                       Remapper,
>> +                                                    CompInst->getFileManager(),
>> +                          CompInst->getPreprocessor().getPreprocessingRecord());
>> +  ASTConsumer *Consumers[] = { MTConsumer, WrappedConsumer };
>> +  return new MultiplexConsumer(Consumers);
>> +}
>> +
>> +bool ObjCMigrateAction::BeginInvocation(CompilerInstance &CI) {
>> +  Remapper.initFromDisk(MigrateDir, CI.getDiagnostics(),
>> +                        /*ignoreIfFilesChanges=*/true);
>> +  CompInst = &CI;
>> +  CI.getDiagnostics().setIgnoreAllWarnings(true);
>> +  CI.getPreprocessorOpts().DetailedRecord = true;
>> +  CI.getPreprocessorOpts().DetailedRecordConditionalDirectives = true;
>> +  return true;
>> +}
>> +
>> +namespace {
>> +class ObjCMigrator : public RecursiveASTVisitor<ObjCMigrator> {
>> +  ObjCMigrateASTConsumer &Consumer;
>> +
>> +public:
>> +  ObjCMigrator(ObjCMigrateASTConsumer &consumer) : Consumer(consumer) { }
>> +
>> +  bool shouldVisitTemplateInstantiations() const { return false; }
>> +  bool shouldWalkTypesOfTypeLocs() const { return false; }
>> +
>> +  bool VisitObjCMessageExpr(ObjCMessageExpr *E) {
>> +    if (Consumer.MigrateLiterals) {
>> +      edit::Commit commit(*Consumer.Editor);
>> +      edit::rewriteToObjCLiteralSyntax(E, *Consumer.NSAPIObj, commit);
>> +      Consumer.Editor->commit(commit);
>> +    }
>> +
>> +    if (Consumer.MigrateSubscripting) {
>> +      edit::Commit commit(*Consumer.Editor);
>> +      edit::rewriteToObjCSubscriptSyntax(E, *Consumer.NSAPIObj, commit);
>> +      Consumer.Editor->commit(commit);
>> +    }
>> +
>> +    return true;
>> +  }
>> +
>> +  bool TraverseObjCMessageExpr(ObjCMessageExpr *E) {
>> +    // Do depth first; we want to rewrite the subexpressions first so that if
>> +    // we have to move expressions we will move them already rewritten.
>> +    for (Stmt::child_range range = E->children(); range; ++range)
>> +      if (!TraverseStmt(*range))
>> +        return false;
>> +
>> +    return WalkUpFromObjCMessageExpr(E);
>> +  }
>> +};
>> +}
>> +
>> +void ObjCMigrateASTConsumer::migrateDecl(Decl *D) {
>> +  if (!D)
>> +    return;
>> +  if (isa<ObjCMethodDecl>(D))
>> +    return; // Wait for the ObjC container declaration.
>> +
>> +  ObjCMigrator(*this).TraverseDecl(D);
>> +}
>> +
>> +namespace {
>> +
>> +class RewritesReceiver : public edit::EditsReceiver {
>> +  Rewriter &Rewrite;
>> +
>> +public:
>> +  RewritesReceiver(Rewriter &Rewrite) : Rewrite(Rewrite) { }
>> +
>> +  virtual void insert(SourceLocation loc, StringRef text) {
>> +    Rewrite.InsertText(loc, text);
>> +  }
>> +  virtual void replace(CharSourceRange range, StringRef text) {
>> +    Rewrite.ReplaceText(range.getBegin(), Rewrite.getRangeSize(range), text);
>> +  }
>> +};
>> +
>> +}
>> +
>> +void ObjCMigrateASTConsumer::HandleTranslationUnit(ASTContext &Ctx) {
>> +  Rewriter rewriter(Ctx.getSourceManager(), Ctx.getLangOptions());
>> +  RewritesReceiver Rec(rewriter);
>> +  Editor->applyRewrites(Rec);
>> +
>> +  for (Rewriter::buffer_iterator
>> +        I = rewriter.buffer_begin(), E = rewriter.buffer_end(); I != E; ++I) {
>> +    FileID FID = I->first;
>> +    RewriteBuffer &buf = I->second;
>> +    const FileEntry *file = Ctx.getSourceManager().getFileEntryForID(FID);
>> +    assert(file);
>> +    llvm::SmallString<512> newText;
>> +    llvm::raw_svector_ostream vecOS(newText);
>> +    buf.write(vecOS);
>> +    vecOS.flush();
>> +    llvm::MemoryBuffer *memBuf = llvm::MemoryBuffer::getMemBufferCopy(
>> +                   StringRef(newText.data(), newText.size()), file->getName());
>> +    llvm::SmallString<64> filePath(file->getName());
>> +    FileMgr.FixupRelativePath(filePath);
>> +    Remapper.remap(filePath.str(), memBuf);
>> +  }
>> +
>> +  if (IsOutputFile) {
>> +    Remapper.flushToFile(MigrateDir, Ctx.getDiagnostics());
>> +  } else {
>> +    Remapper.flushToDisk(MigrateDir, Ctx.getDiagnostics());
>> +  }
>> +}
>> +
>> +bool MigrateSourceAction::BeginInvocation(CompilerInstance &CI) {
>> +  CI.getPreprocessorOpts().DetailedRecord = true;
>> +  CI.getPreprocessorOpts().DetailedRecordConditionalDirectives = true;
>> +  return true;
>> +}
>> +
>> +ASTConsumer *MigrateSourceAction::CreateASTConsumer(CompilerInstance &CI,
>> +                                                  StringRef InFile) {
>> +  return new ObjCMigrateASTConsumer(CI.getFrontendOpts().OutputFile,
>> +                                    /*MigrateLiterals=*/true,
>> +                                    /*MigrateSubscripting=*/true,
>> +                                    Remapper,
>> +                                    CI.getFileManager(),
>> +                                  CI.getPreprocessor().getPreprocessingRecord(),
>> +                                    /*isOutputFile=*/true);
>> +}
>> 
>> Modified: cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp (original)
>> +++ cfe/trunk/lib/ARCMigrate/TransRetainReleaseDealloc.cpp Tue Mar  6 14:06:33 2012
>> @@ -21,6 +21,8 @@
>> #include "Internals.h"
>> #include "clang/Sema/SemaDiagnostic.h"
>> #include "clang/AST/ParentMap.h"
>> +#include "clang/Lex/Lexer.h"
>> +#include "clang/Basic/SourceManager.h"
>> 
>> using namespace clang;
>> using namespace arcmt;
>> @@ -128,27 +130,105 @@
>>     Transaction Trans(Pass.TA);
>>     clearDiagnostics(rec->getExprLoc());
>> 
>> -    if (E->getMethodFamily() == OMF_release &&
>> -        isRemovable(E) && isInAtFinally(E)) {
>> +    ObjCMessageExpr *Msg = E;
>> +    Expr *RecContainer = Msg;
>> +    SourceRange RecRange = rec->getSourceRange();
>> +    checkForGCDOrXPC(Msg, RecContainer, rec, RecRange);
>> +
>> +    if (Msg->getMethodFamily() == OMF_release &&
>> +        isRemovable(RecContainer) && isInAtFinally(RecContainer)) {
>>       // Change the -release to "receiver = nil" in a finally to avoid a leak
>>       // when an exception is thrown.
>> -      Pass.TA.replace(E->getSourceRange(), rec->getSourceRange());
>> +      Pass.TA.replace(RecContainer->getSourceRange(), RecRange);
>>       std::string str = " = ";
>>       str += getNilString(Pass.Ctx);
>> -      Pass.TA.insertAfterToken(rec->getLocEnd(), str);
>> +      Pass.TA.insertAfterToken(RecRange.getEnd(), str);
>>       return true;
>>     }
>> 
>> -    if (!hasSideEffects(E, Pass.Ctx)) {
>> -      if (tryRemoving(E))
>> +    if (!hasSideEffects(rec, Pass.Ctx)) {
>> +      if (tryRemoving(RecContainer))
>>         return true;
>>     }
>> -    Pass.TA.replace(E->getSourceRange(), rec->getSourceRange());
>> +    Pass.TA.replace(RecContainer->getSourceRange(), RecRange);
>> 
>>     return true;
>>   }
>> 
>> private:
>> +  /// \brief Check if the retain/release is due to a GCD/XPC macro that are
>> +  /// defined as:
>> +  ///
>> +  /// #define dispatch_retain(object) ({ dispatch_object_t _o = (object); _dispatch_object_validate(_o); (void)[_o retain]; })
>> +  /// #define dispatch_release(object) ({ dispatch_object_t _o = (object); _dispatch_object_validate(_o); [_o release]; })
>> +  /// #define xpc_retain(object) ({ xpc_object_t _o = (object); _xpc_object_validate(_o); [_o retain]; })
>> +  /// #define xpc_release(object) ({ xpc_object_t _o = (object); _xpc_object_validate(_o); [_o release]; })
>> +  ///
>> +  /// and return the top container which is the StmtExpr and the macro argument
>> +  /// expression.
>> +  void checkForGCDOrXPC(ObjCMessageExpr *Msg, Expr *&RecContainer,
>> +                        Expr *&Rec, SourceRange &RecRange) {
>> +    SourceLocation Loc = Msg->getExprLoc();
>> +    if (!Loc.isMacroID())
>> +      return;
>> +    SourceManager &SM = Pass.Ctx.getSourceManager();
>> +    StringRef MacroName = Lexer::getImmediateMacroName(Loc, SM,
>> +                                                     Pass.Ctx.getLangOptions());
>> +    bool isGCDOrXPC = llvm::StringSwitch<bool>(MacroName)
>> +        .Case("dispatch_retain", true)
>> +        .Case("dispatch_release", true)
>> +        .Case("xpc_retain", true)
>> +        .Case("xpc_release", true)
>> +        .Default(false);
>> +    if (!isGCDOrXPC)
>> +      return;
>> +
>> +    StmtExpr *StmtE = 0;
>> +    Stmt *S = Msg;
>> +    while (S) {
>> +      if (StmtExpr *SE = dyn_cast<StmtExpr>(S)) {
>> +        StmtE = SE;
>> +        break;
>> +      }
>> +      S = StmtMap->getParent(S);
>> +    }
>> +
>> +    if (!StmtE)
>> +      return;
>> +
>> +    Stmt::child_range StmtExprChild = StmtE->children();
>> +    if (!StmtExprChild)
>> +      return;
>> +    CompoundStmt *CompS = dyn_cast_or_null<CompoundStmt>(*StmtExprChild);
>> +    if (!CompS)
>> +      return;
>> +
>> +    Stmt::child_range CompStmtChild = CompS->children();
>> +    if (!CompStmtChild)
>> +      return;
>> +    DeclStmt *DeclS = dyn_cast_or_null<DeclStmt>(*CompStmtChild);
>> +    if (!DeclS)
>> +      return;
>> +    if (!DeclS->isSingleDecl())
>> +      return;
>> +    VarDecl *VD = dyn_cast_or_null<VarDecl>(DeclS->getSingleDecl());
>> +    if (!VD)
>> +      return;
>> +    Expr *Init = VD->getInit();
>> +    if (!Init)
>> +      return;
>> +
>> +    RecContainer = StmtE;
>> +    Rec = Init->IgnoreParenImpCasts();
>> +    if (ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(Rec))
>> +      Rec = EWC->getSubExpr()->IgnoreParenImpCasts();
>> +    RecRange = Rec->getSourceRange();
>> +    if (SM.isMacroArgExpansion(RecRange.getBegin()))
>> +      RecRange.setBegin(SM.getImmediateSpellingLoc(RecRange.getBegin()));
>> +    if (SM.isMacroArgExpansion(RecRange.getEnd()))
>> +      RecRange.setEnd(SM.getImmediateSpellingLoc(RecRange.getEnd()));
>> +  }
>> +
>>   void clearDiagnostics(SourceLocation loc) const {
>>     Pass.TA.clearDiagnostic(diag::err_arc_illegal_explicit_message,
>>                             diag::err_unavailable,
>> 
>> Modified: cfe/trunk/lib/Basic/DiagnosticIDs.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/DiagnosticIDs.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/DiagnosticIDs.cpp (original)
>> +++ cfe/trunk/lib/Basic/DiagnosticIDs.cpp Tue Mar  6 14:06:33 2012
>> @@ -657,19 +657,6 @@
>>     }
>>   }
>> 
>> -  // If we have any Fix-Its, make sure that all of the Fix-Its point into
>> -  // source locations that aren't macro expansions. If any point into macro
>> -  // expansions, remove all of the Fix-Its.
>> -  for (unsigned I = 0, N = Diag.FixItHints.size(); I != N; ++I) {
>> -    const FixItHint &FixIt = Diag.FixItHints[I];
>> -    if (FixIt.RemoveRange.isInvalid() ||
>> -        FixIt.RemoveRange.getBegin().isMacroID() ||
>> -        FixIt.RemoveRange.getEnd().isMacroID()) {
>> -      Diag.FixItHints.clear();
>> -      break;
>> -    }
>> -  }
>> -
>>   // Finally, report it.
>>   Diag.Client->HandleDiagnostic((DiagnosticsEngine::Level)DiagLevel, Info);
>>   if (Diag.Client->IncludeInDiagnosticCounts()) {
>> 
>> Modified: cfe/trunk/lib/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CMakeLists.txt?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CMakeLists.txt (original)
>> +++ cfe/trunk/lib/CMakeLists.txt Tue Mar  6 14:06:33 2012
>> @@ -6,6 +6,7 @@
>> add_subdirectory(Sema)
>> add_subdirectory(CodeGen)
>> add_subdirectory(Analysis)
>> +add_subdirectory(Edit)
>> add_subdirectory(Rewrite)
>> add_subdirectory(ARCMigrate)
>> add_subdirectory(Driver)
>> 
>> Modified: cfe/trunk/lib/Driver/Action.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Action.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Action.cpp (original)
>> +++ cfe/trunk/lib/Driver/Action.cpp Tue Mar  6 14:06:33 2012
>> @@ -27,6 +27,7 @@
>>   case PreprocessJobClass: return "preprocessor";
>>   case PrecompileJobClass: return "precompiler";
>>   case AnalyzeJobClass: return "analyzer";
>> +  case MigrateJobClass: return "migrator";
>>   case CompileJobClass: return "compiler";
>>   case AssembleJobClass: return "assembler";
>>   case LinkJobClass: return "linker";
>> @@ -78,6 +79,12 @@
>>   : JobAction(AnalyzeJobClass, Input, OutputType) {
>> }
>> 
>> +void MigrateJobAction::anchor() {}
>> +
>> +MigrateJobAction::MigrateJobAction(Action *Input, types::ID OutputType)
>> +  : JobAction(MigrateJobClass, Input, OutputType) {
>> +}
>> +
>> void CompileJobAction::anchor() {}
>> 
>> CompileJobAction::CompileJobAction(Action *Input, types::ID OutputType)
>> 
>> Modified: cfe/trunk/lib/Driver/Driver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Driver.cpp (original)
>> +++ cfe/trunk/lib/Driver/Driver.cpp Tue Mar  6 14:06:33 2012
>> @@ -141,6 +141,7 @@
>>     // -{fsyntax-only,-analyze,emit-ast,S} only run up to the compiler.
>>   } else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) ||
>>              (PhaseArg = DAL.getLastArg(options::OPT_rewrite_objc)) ||
>> +             (PhaseArg = DAL.getLastArg(options::OPT__migrate)) ||
>>              (PhaseArg = DAL.getLastArg(options::OPT__analyze,
>>                                               options::OPT__analyze_auto)) ||
>>              (PhaseArg = DAL.getLastArg(options::OPT_emit_ast)) ||
>> @@ -1140,6 +1141,8 @@
>>       return new CompileJobAction(Input, types::TY_RewrittenObjC);
>>     } else if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto)) {
>>       return new AnalyzeJobAction(Input, types::TY_Plist);
>> +    } else if (Args.hasArg(options::OPT__migrate)) {
>> +      return new MigrateJobAction(Input, types::TY_Remap);
>>     } else if (Args.hasArg(options::OPT_emit_ast)) {
>>       return new CompileJobAction(Input, types::TY_AST);
>>     } else if (IsUsingLTO(Args)) {
>> 
>> Modified: cfe/trunk/lib/Driver/ToolChain.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChain.cpp (original)
>> +++ cfe/trunk/lib/Driver/ToolChain.cpp Tue Mar  6 14:06:33 2012
>> @@ -54,6 +54,7 @@
>>     // Assume a minimal NeXT runtime.
>>     runtime.HasARC = false;
>>     runtime.HasWeak = false;
>> +    runtime.HasSubscripting = false;
>>     runtime.HasTerminate = false;
>>     return;
>> 
>> @@ -61,6 +62,7 @@
>>     // Assume a maximal GNU runtime.
>>     runtime.HasARC = true;
>>     runtime.HasWeak = true;
>> +    runtime.HasSubscripting = false; // to be added
>>     runtime.HasTerminate = false; // to be added
>>     return;
>>   }
>> 
>> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
>> +++ cfe/trunk/lib/Driver/ToolChains.cpp Tue Mar  6 14:06:33 2012
>> @@ -227,6 +227,7 @@
>>     case Action::PreprocessJobClass:
>>       T = new tools::darwin::Preprocess(*this); break;
>>     case Action::AnalyzeJobClass:
>> +    case Action::MigrateJobClass:
>>       T = new tools::Clang(*this); break;
>>     case Action::PrecompileJobClass:
>>     case Action::CompileJobClass:
>> @@ -1409,6 +1410,7 @@
>>     case Action::PrecompileJobClass:
>>       T = new tools::gcc::Precompile(*this); break;
>>     case Action::AnalyzeJobClass:
>> +    case Action::MigrateJobClass:
>>       T = new tools::Clang(*this); break;
>>     case Action::CompileJobClass:
>>       T = new tools::gcc::Compile(*this); break;
>> 
>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>> +++ cfe/trunk/lib/Driver/Tools.cpp Tue Mar  6 14:06:33 2012
>> @@ -1247,6 +1247,8 @@
>>   if (isa<AnalyzeJobAction>(JA)) {
>>     assert(JA.getType() == types::TY_Plist && "Invalid output type.");
>>     CmdArgs.push_back("-analyze");
>> +  } else if (isa<MigrateJobAction>(JA)) {
>> +    CmdArgs.push_back("-migrate");
>>   } else if (isa<PreprocessJobAction>(JA)) {
>>     if (Output.getType() == types::TY_Dependencies)
>>       CmdArgs.push_back("-Eonly");
>> @@ -1716,10 +1718,12 @@
>> 
>>   Args.AddLastArg(CmdArgs, options::OPT_working_directory);
>> 
>> +  bool ARCMTEnabled = false;
>>   if (!Args.hasArg(options::OPT_fno_objc_arc)) {
>>     if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
>>                                        options::OPT_ccc_arcmt_modify,
>>                                        options::OPT_ccc_arcmt_migrate)) {
>> +      ARCMTEnabled = true;
>>       switch (A->getOption().getID()) {
>>       default:
>>         llvm_unreachable("missed a case");
>> @@ -1731,7 +1735,7 @@
>>         break;
>>       case options::OPT_ccc_arcmt_migrate:
>>         CmdArgs.push_back("-arcmt-migrate");
>> -        CmdArgs.push_back("-arcmt-migrate-directory");
>> +        CmdArgs.push_back("-mt-migrate-directory");
>>         CmdArgs.push_back(A->getValue(Args));
>> 
>>         Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
>> @@ -1741,6 +1745,25 @@
>>     }
>>   }
>> 
>> +  if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
>> +    if (ARCMTEnabled) {
>> +      D.Diag(diag::err_drv_argument_not_allowed_with)
>> +        << A->getAsString(Args) << "-ccc-arcmt-migrate";
>> +    }
>> +    CmdArgs.push_back("-mt-migrate-directory");
>> +    CmdArgs.push_back(A->getValue(Args));
>> +
>> +    if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
>> +                     options::OPT_objcmt_migrate_subscripting)) {
>> +      // None specified, means enable them all.
>> +      CmdArgs.push_back("-objcmt-migrate-literals");
>> +      CmdArgs.push_back("-objcmt-migrate-subscripting");
>> +    } else {
>> +      Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
>> +      Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
>> +    }
>> +  }
>> +
>>   // Add preprocessing options like -I, -D, etc. if we are using the
>>   // preprocessor.
>>   //
>> 
>> Modified: cfe/trunk/lib/Driver/WindowsToolChain.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/WindowsToolChain.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/WindowsToolChain.cpp (original)
>> +++ cfe/trunk/lib/Driver/WindowsToolChain.cpp Tue Mar  6 14:06:33 2012
>> @@ -59,6 +59,7 @@
>>     case Action::PreprocessJobClass:
>>     case Action::PrecompileJobClass:
>>     case Action::AnalyzeJobClass:
>> +    case Action::MigrateJobClass:
>>     case Action::CompileJobClass:
>>       T = new tools::Clang(*this); break;
>>     case Action::AssembleJobClass:
>> 
>> Added: cfe/trunk/lib/Edit/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/CMakeLists.txt?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/lib/Edit/CMakeLists.txt (added)
>> +++ cfe/trunk/lib/Edit/CMakeLists.txt Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,7 @@
>> +set(LLVM_USED_LIBS clangBasic clangAST clangLex)
>> +
>> +add_clang_library(clangEdit
>> +  Commit.cpp
>> +  EditedSource.cpp
>> +  RewriteObjCFoundationAPI.cpp
>> +  )
>> 
>> Added: cfe/trunk/lib/Edit/Commit.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/Commit.cpp?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/lib/Edit/Commit.cpp (added)
>> +++ cfe/trunk/lib/Edit/Commit.cpp Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,345 @@
>> +//===----- Commit.cpp - A unit of edits -----------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "clang/Edit/Commit.h"
>> +#include "clang/Edit/EditedSource.h"
>> +#include "clang/Lex/Lexer.h"
>> +#include "clang/Lex/PreprocessingRecord.h"
>> +#include "clang/Basic/SourceManager.h"
>> +
>> +using namespace clang;
>> +using namespace edit;
>> +
>> +SourceLocation Commit::Edit::getFileLocation(SourceManager &SM) const {
>> +  SourceLocation Loc = SM.getLocForStartOfFile(Offset.getFID());
>> +  Loc = Loc.getLocWithOffset(Offset.getOffset());
>> +  assert(Loc.isFileID());
>> +  return Loc;
>> +}
>> +
>> +CharSourceRange Commit::Edit::getFileRange(SourceManager &SM) const {
>> +  SourceLocation Loc = getFileLocation(SM);
>> +  return CharSourceRange::getCharRange(Loc, Loc.getLocWithOffset(Length));
>> +}
>> +
>> +CharSourceRange Commit::Edit::getInsertFromRange(SourceManager &SM) const {
>> +  SourceLocation Loc = SM.getLocForStartOfFile(InsertFromRangeOffs.getFID());
>> +  Loc = Loc.getLocWithOffset(InsertFromRangeOffs.getOffset());
>> +  assert(Loc.isFileID());
>> +  return CharSourceRange::getCharRange(Loc, Loc.getLocWithOffset(Length));
>> +}
>> +
>> +Commit::Commit(EditedSource &Editor)
>> +  : SourceMgr(Editor.getSourceManager()), LangOpts(Editor.getLangOptions()),
>> +    PPRec(Editor.getPreprocessingRecord()),
>> +    Editor(&Editor), IsCommitable(true) { }
>> +
>> +bool Commit::insert(SourceLocation loc, StringRef text,
>> +                    bool afterToken, bool beforePreviousInsertions) {
>> +  if (text.empty())
>> +    return true;
>> +
>> +  FileOffset Offs;
>> +  if ((!afterToken && !canInsert(loc, Offs)) ||
>> +      ( afterToken && !canInsertAfterToken(loc, Offs, loc))) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  addInsert(loc, Offs, text, beforePreviousInsertions);
>> +  return true;
>> +}
>> +
>> +bool Commit::insertFromRange(SourceLocation loc,
>> +                             CharSourceRange range,
>> +                             bool afterToken, bool beforePreviousInsertions) {
>> +  FileOffset RangeOffs;
>> +  unsigned RangeLen;
>> +  if (!canRemoveRange(range, RangeOffs, RangeLen)) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  FileOffset Offs;
>> +  if ((!afterToken && !canInsert(loc, Offs)) ||
>> +      ( afterToken && !canInsertAfterToken(loc, Offs, loc))) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  if (PPRec &&
>> +      PPRec->areInDifferentConditionalDirectiveRegion(loc, range.getBegin())) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  addInsertFromRange(loc, Offs, RangeOffs, RangeLen, beforePreviousInsertions);
>> +  return true;
>> +}
>> +
>> +bool Commit::remove(CharSourceRange range) {
>> +  FileOffset Offs;
>> +  unsigned Len;
>> +  if (!canRemoveRange(range, Offs, Len)) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  addRemove(range.getBegin(), Offs, Len);
>> +  return true;
>> +}
>> +
>> +bool Commit::insertWrap(StringRef before, CharSourceRange range,
>> +                        StringRef after) {
>> +  bool commitableBefore = insert(range.getBegin(), before, /*afterToken=*/false,
>> +                                 /*beforePreviousInsertions=*/true);
>> +  bool commitableAfter;
>> +  if (range.isTokenRange())
>> +    commitableAfter = insertAfterToken(range.getEnd(), after);
>> +  else
>> +    commitableAfter = insert(range.getEnd(), after);
>> +
>> +  return commitableBefore && commitableAfter;
>> +}
>> +
>> +bool Commit::replace(CharSourceRange range, StringRef text) {
>> +  if (text.empty())
>> +    return remove(range);
>> +
>> +  FileOffset Offs;
>> +  unsigned Len;
>> +  if (!canInsert(range.getBegin(), Offs) || !canRemoveRange(range, Offs, Len)) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  addRemove(range.getBegin(), Offs, Len);
>> +  addInsert(range.getBegin(), Offs, text, false);
>> +  return true;
>> +}
>> +
>> +bool Commit::replaceWithInner(CharSourceRange range,
>> +                              CharSourceRange replacementRange) {
>> +  FileOffset OuterBegin;
>> +  unsigned OuterLen;
>> +  if (!canRemoveRange(range, OuterBegin, OuterLen)) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  FileOffset InnerBegin;
>> +  unsigned InnerLen;
>> +  if (!canRemoveRange(replacementRange, InnerBegin, InnerLen)) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  FileOffset OuterEnd = OuterBegin.getWithOffset(OuterLen);
>> +  FileOffset InnerEnd = InnerBegin.getWithOffset(InnerLen);
>> +  if (OuterBegin.getFID() != InnerBegin.getFID() ||
>> +      InnerBegin < OuterBegin ||
>> +      InnerBegin > OuterEnd ||
>> +      InnerEnd > OuterEnd) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  addRemove(range.getBegin(),
>> +            OuterBegin, InnerBegin.getOffset() - OuterBegin.getOffset());
>> +  addRemove(replacementRange.getEnd(),
>> +            InnerEnd, OuterEnd.getOffset() - InnerEnd.getOffset());
>> +  return true;
>> +}
>> +
>> +bool Commit::replaceText(SourceLocation loc, StringRef text,
>> +                         StringRef replacementText) {
>> +  if (text.empty() || replacementText.empty())
>> +    return true;
>> +
>> +  FileOffset Offs;
>> +  unsigned Len;
>> +  if (!canReplaceText(loc, replacementText, Offs, Len)) {
>> +    IsCommitable = false;
>> +    return false;
>> +  }
>> +
>> +  addRemove(loc, Offs, Len);
>> +  addInsert(loc, Offs, text, false);
>> +  return true;
>> +}
>> +
>> +void Commit::addInsert(SourceLocation OrigLoc, FileOffset Offs, StringRef text,
>> +                       bool beforePreviousInsertions) {
>> +  if (text.empty())
>> +    return;
>> +
>> +  Edit data;
>> +  data.Kind = Act_Insert;
>> +  data.OrigLoc = OrigLoc;
>> +  data.Offset = Offs;
>> +  data.Text = text;
>> +  data.BeforePrev = beforePreviousInsertions;
>> +  CachedEdits.push_back(data);
>> +}
>> +
>> +void Commit::addInsertFromRange(SourceLocation OrigLoc, FileOffset Offs,
>> +                                FileOffset RangeOffs, unsigned RangeLen,
>> +                                bool beforePreviousInsertions) {
>> +  if (RangeLen == 0)
>> +    return;
>> +
>> +  Edit data;
>> +  data.Kind = Act_InsertFromRange;
>> +  data.OrigLoc = OrigLoc;
>> +  data.Offset = Offs;
>> +  data.InsertFromRangeOffs = RangeOffs;
>> +  data.Length = RangeLen;
>> +  data.BeforePrev = beforePreviousInsertions;
>> +  CachedEdits.push_back(data);
>> +}
>> +
>> +void Commit::addRemove(SourceLocation OrigLoc,
>> +                       FileOffset Offs, unsigned Len) {
>> +  if (Len == 0)
>> +    return;
>> +
>> +  Edit data;
>> +  data.Kind = Act_Remove;
>> +  data.OrigLoc = OrigLoc;
>> +  data.Offset = Offs;
>> +  data.Length = Len;
>> +  CachedEdits.push_back(data);
>> +}
>> +
>> +bool Commit::canInsert(SourceLocation loc, FileOffset &offs) {
>> +  if (loc.isInvalid())
>> +    return false;
>> +
>> +  if (loc.isMacroID())
>> +    isAtStartOfMacroExpansion(loc, &loc);
>> +
>> +  const SourceManager &SM = SourceMgr;
>> +  while (SM.isMacroArgExpansion(loc))
>> +    loc = SM.getImmediateSpellingLoc(loc);
>> +
>> +  if (loc.isMacroID())
>> +    if (!isAtStartOfMacroExpansion(loc, &loc))
>> +      return false;
>> +
>> +  if (SM.isInSystemHeader(loc))
>> +    return false;
>> +
>> +  std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(loc);
>> +  if (locInfo.first.isInvalid())
>> +    return false;
>> +  offs = FileOffset(locInfo.first, locInfo.second);
>> +  return canInsertInOffset(loc, offs);
>> +}
>> +
>> +bool Commit::canInsertAfterToken(SourceLocation loc, FileOffset &offs,
>> +                                 SourceLocation &AfterLoc) {
>> +  if (loc.isInvalid())
>> +
>> +    return false;
>> +
>> +  SourceLocation spellLoc = SourceMgr.getSpellingLoc(loc);
>> +  unsigned tokLen = Lexer::MeasureTokenLength(spellLoc, SourceMgr, LangOpts);
>> +  AfterLoc = loc.getLocWithOffset(tokLen);
>> +
>> +  if (loc.isMacroID())
>> +    isAtEndOfMacroExpansion(loc, &loc);
>> +
>> +  const SourceManager &SM = SourceMgr;
>> +  while (SM.isMacroArgExpansion(loc))
>> +    loc = SM.getImmediateSpellingLoc(loc);
>> +
>> +  if (loc.isMacroID())
>> +    if (!isAtEndOfMacroExpansion(loc, &loc))
>> +      return false;
>> +
>> +  if (SM.isInSystemHeader(loc))
>> +    return false;
>> +
>> +  loc = Lexer::getLocForEndOfToken(loc, 0, SourceMgr, LangOpts);
>> +  if (loc.isInvalid())
>> +    return false;
>> +
>> +  std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(loc);
>> +  if (locInfo.first.isInvalid())
>> +    return false;
>> +  offs = FileOffset(locInfo.first, locInfo.second);
>> +  return canInsertInOffset(loc, offs);
>> +}
>> +
>> +bool Commit::canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs) {
>> +  for (unsigned i = 0, e = CachedEdits.size(); i != e; ++i) {
>> +    Edit &act = CachedEdits[i];
>> +    if (act.Kind == Act_Remove) {
>> +      if (act.Offset.getFID() == Offs.getFID() &&
>> +          Offs > act.Offset && Offs < act.Offset.getWithOffset(act.Length))
>> +        return false; // position has been removed.
>> +    }
>> +  }
>> +
>> +  if (!Editor)
>> +    return true;
>> +  return Editor->canInsertInOffset(OrigLoc, Offs);
>> +}
>> +
>> +bool Commit::canRemoveRange(CharSourceRange range,
>> +                            FileOffset &Offs, unsigned &Len) {
>> +  const SourceManager &SM = SourceMgr;
>> +  range = Lexer::makeFileCharRange(range, SM, LangOpts);
>> +  if (range.isInvalid())
>> +    return false;
>> +
>> +  if (range.getBegin().isMacroID() || range.getEnd().isMacroID())
>> +    return false;
>> +  if (SM.isInSystemHeader(range.getBegin()) ||
>> +      SM.isInSystemHeader(range.getEnd()))
>> +    return false;
>> +
>> +  if (PPRec && PPRec->rangeIntersectsConditionalDirective(range.getAsRange()))
>> +    return false;
>> +
>> +  std::pair<FileID, unsigned> beginInfo = SM.getDecomposedLoc(range.getBegin());
>> +  std::pair<FileID, unsigned> endInfo = SM.getDecomposedLoc(range.getEnd());
>> +  if (beginInfo.first != endInfo.first ||
>> +      beginInfo.second > endInfo.second)
>> +    return false;
>> +
>> +  Offs = FileOffset(beginInfo.first, beginInfo.second);
>> +  Len = endInfo.second - beginInfo.second;
>> +  return true;
>> +}
>> +
>> +bool Commit::canReplaceText(SourceLocation loc, StringRef text,
>> +                            FileOffset &Offs, unsigned &Len) {
>> +  assert(!text.empty());
>> +
>> +  if (!canInsert(loc, Offs))
>> +    return false;
>> +
>> +  // Try to load the file buffer.
>> +  bool invalidTemp = false;
>> +  StringRef file = SourceMgr.getBufferData(Offs.getFID(), &invalidTemp);
>> +  if (invalidTemp)
>> +    return false;
>> +
>> +  return file.substr(Offs.getOffset()).startswith(text);
>> +}
>> +
>> +bool Commit::isAtStartOfMacroExpansion(SourceLocation loc,
>> +                                       SourceLocation *MacroBegin) const {
>> +  return Lexer::isAtStartOfMacroExpansion(loc, SourceMgr, LangOpts, MacroBegin);
>> +}
>> +bool Commit::isAtEndOfMacroExpansion(SourceLocation loc,
>> +                                     SourceLocation *MacroEnd) const {
>> +  return Lexer::isAtEndOfMacroExpansion(loc, SourceMgr, LangOpts, MacroEnd);
>> +}
>> 
>> Added: cfe/trunk/lib/Edit/EditedSource.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/EditedSource.cpp?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/lib/Edit/EditedSource.cpp (added)
>> +++ cfe/trunk/lib/Edit/EditedSource.cpp Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,329 @@
>> +//===----- EditedSource.cpp - Collection of source edits ------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "clang/Edit/EditedSource.h"
>> +#include "clang/Edit/Commit.h"
>> +#include "clang/Edit/EditsReceiver.h"
>> +#include "clang/Lex/Lexer.h"
>> +#include "clang/Basic/SourceManager.h"
>> +#include "llvm/ADT/SmallString.h"
>> +#include "llvm/ADT/Twine.h"
>> +
>> +using namespace clang;
>> +using namespace edit;
>> +
>> +void EditsReceiver::remove(CharSourceRange range) {
>> +  replace(range, StringRef());
>> +}
>> +
>> +StringRef EditedSource::copyString(const Twine &twine) {
>> +  llvm::SmallString<128> Data;
>> +  return copyString(twine.toStringRef(Data));
>> +}
>> +
>> +bool EditedSource::canInsertInOffset(SourceLocation OrigLoc, FileOffset Offs) {
>> +  FileEditsTy::iterator FA = getActionForOffset(Offs);
>> +  if (FA != FileEdits.end()) {
>> +    if (FA->first != Offs)
>> +      return false; // position has been removed.
>> +  }
>> +
>> +  if (SourceMgr.isMacroArgExpansion(OrigLoc)) {
>> +    SourceLocation
>> +      DefArgLoc = SourceMgr.getImmediateExpansionRange(OrigLoc).first;
>> +    SourceLocation
>> +      ExpLoc = SourceMgr.getImmediateExpansionRange(DefArgLoc).first;
>> +    llvm::DenseMap<unsigned, SourceLocation>::iterator
>> +      I = ExpansionToArgMap.find(ExpLoc.getRawEncoding());
>> +    if (I != ExpansionToArgMap.end() && I->second != DefArgLoc)
>> +      return false; // Trying to write in a macro argument input that has
>> +                 // already been written for another argument of the same macro.
>> +  }
>> +
>> +  return true;
>> +}
>> +
>> +bool EditedSource::commitInsert(SourceLocation OrigLoc,
>> +                                FileOffset Offs, StringRef text,
>> +                                bool beforePreviousInsertions) {
>> +  if (!canInsertInOffset(OrigLoc, Offs))
>> +    return false;
>> +  if (text.empty())
>> +    return true;
>> +
>> +  if (SourceMgr.isMacroArgExpansion(OrigLoc)) {
>> +    SourceLocation
>> +      DefArgLoc = SourceMgr.getImmediateExpansionRange(OrigLoc).first;
>> +    SourceLocation
>> +      ExpLoc = SourceMgr.getImmediateExpansionRange(DefArgLoc).first;
>> +    ExpansionToArgMap[ExpLoc.getRawEncoding()] = DefArgLoc;
>> +  }
>> +
>> +  FileEdit &FA = FileEdits[Offs];
>> +  if (FA.Text.empty()) {
>> +    FA.Text = copyString(text);
>> +    return true;
>> +  }
>> +
>> +  Twine concat;
>> +  if (beforePreviousInsertions)
>> +    concat = Twine(text) + FA.Text;
>> +  else
>> +    concat = Twine(FA.Text) +  text;
>> +
>> +  FA.Text = copyString(concat);
>> +  return true;
>> +}
>> +
>> +bool EditedSource::commitInsertFromRange(SourceLocation OrigLoc,
>> +                                   FileOffset Offs,
>> +                                   FileOffset InsertFromRangeOffs, unsigned Len,
>> +                                   bool beforePreviousInsertions) {
>> +  if (Len == 0)
>> +    return true;
>> +
>> +  llvm::SmallString<128> StrVec;
>> +  FileOffset BeginOffs = InsertFromRangeOffs;
>> +  FileOffset EndOffs = BeginOffs.getWithOffset(Len);
>> +  FileEditsTy::iterator I = FileEdits.upper_bound(BeginOffs);
>> +  if (I != FileEdits.begin())
>> +    --I;
>> +
>> +  for (; I != FileEdits.end(); ++I) {
>> +    FileEdit &FA = I->second;
>> +    FileOffset B = I->first;
>> +    FileOffset E = B.getWithOffset(FA.RemoveLen);
>> +
>> +    if (BeginOffs < E) {
>> +      if (BeginOffs >= B) {
>> +        BeginOffs = E;
>> +        ++I;
>> +      }
>> +      break;
>> +    }
>> +  }
>> +
>> +  for (; I != FileEdits.end() && EndOffs > I->first; ++I) {
>> +    FileEdit &FA = I->second;
>> +    FileOffset B = I->first;
>> +    FileOffset E = B.getWithOffset(FA.RemoveLen);
>> +
>> +    if (BeginOffs < B) {
>> +      bool Invalid = false;
>> +      StringRef text = getSourceText(BeginOffs, B, Invalid);
>> +      if (Invalid)
>> +        return false;
>> +      StrVec += text;
>> +    }
>> +    StrVec += FA.Text;
>> +    BeginOffs = E;
>> +  }
>> +
>> +  if (BeginOffs < EndOffs) {
>> +    bool Invalid = false;
>> +    StringRef text = getSourceText(BeginOffs, EndOffs, Invalid);
>> +    if (Invalid)
>> +      return false;
>> +    StrVec += text;
>> +  }
>> +
>> +  return commitInsert(OrigLoc, Offs, StrVec.str(), beforePreviousInsertions);
>> +}
>> +
>> +void EditedSource::commitRemove(SourceLocation OrigLoc,
>> +                                FileOffset BeginOffs, unsigned Len) {
>> +  if (Len == 0)
>> +    return;
>> +
>> +  FileOffset EndOffs = BeginOffs.getWithOffset(Len);
>> +  FileEditsTy::iterator I = FileEdits.upper_bound(BeginOffs);
>> +  if (I != FileEdits.begin())
>> +    --I;
>> +
>> +  for (; I != FileEdits.end(); ++I) {
>> +    FileEdit &FA = I->second;
>> +    FileOffset B = I->first;
>> +    FileOffset E = B.getWithOffset(FA.RemoveLen);
>> +
>> +    if (BeginOffs < E)
>> +      break;
>> +  }
>> +
>> +  FileOffset TopBegin, TopEnd;
>> +  FileEdit *TopFA = 0;
>> +
>> +  if (I == FileEdits.end()) {
>> +    FileEditsTy::iterator
>> +      NewI = FileEdits.insert(I, std::make_pair(BeginOffs, FileEdit()));
>> +    NewI->second.RemoveLen = Len;
>> +    return;
>> +  }
>> +
>> +  FileEdit &FA = I->second;
>> +  FileOffset B = I->first;
>> +  FileOffset E = B.getWithOffset(FA.RemoveLen);
>> +  if (BeginOffs < B) {
>> +    FileEditsTy::iterator
>> +      NewI = FileEdits.insert(I, std::make_pair(BeginOffs, FileEdit()));
>> +    TopBegin = BeginOffs;
>> +    TopEnd = EndOffs;
>> +    TopFA = &NewI->second;
>> +    TopFA->RemoveLen = Len;
>> +  } else {
>> +    TopBegin = B;
>> +    TopEnd = E;
>> +    TopFA = &I->second;
>> +    if (TopEnd >= EndOffs)
>> +      return;
>> +    unsigned diff = EndOffs.getOffset() - TopEnd.getOffset();
>> +    TopEnd = EndOffs;
>> +    TopFA->RemoveLen += diff;
>> +    ++I;
>> +  }
>> +
>> +  while (I != FileEdits.end()) {
>> +    FileEdit &FA = I->second;
>> +    FileOffset B = I->first;
>> +    FileOffset E = B.getWithOffset(FA.RemoveLen);
>> +
>> +    if (B >= TopEnd)
>> +      break;
>> +
>> +    if (E <= TopEnd) {
>> +      FileEdits.erase(I++);
>> +      continue;
>> +    }
>> +
>> +    if (B < TopEnd) {
>> +      unsigned diff = E.getOffset() - TopEnd.getOffset();
>> +      TopEnd = E;
>> +      TopFA->RemoveLen += diff;
>> +      FileEdits.erase(I);
>> +    }
>> +
>> +    break;
>> +  }
>> +}
>> +
>> +bool EditedSource::commit(const Commit &commit) {
>> +  if (!commit.isCommitable())
>> +    return false;
>> +
>> +  for (edit::Commit::edit_iterator
>> +         I = commit.edit_begin(), E = commit.edit_end(); I != E; ++I) {
>> +    const edit::Commit::Edit &edit = *I;
>> +    switch (edit.Kind) {
>> +    case edit::Commit::Act_Insert:
>> +      commitInsert(edit.OrigLoc, edit.Offset, edit.Text, edit.BeforePrev);
>> +      break;
>> +    case edit::Commit::Act_InsertFromRange:
>> +      commitInsertFromRange(edit.OrigLoc, edit.Offset,
>> +                            edit.InsertFromRangeOffs, edit.Length,
>> +                            edit.BeforePrev);
>> +      break;
>> +    case edit::Commit::Act_Remove:
>> +      commitRemove(edit.OrigLoc, edit.Offset, edit.Length);
>> +      break;
>> +    }
>> +  }
>> +
>> +  return true;
>> +}
>> +
>> +static void applyRewrite(EditsReceiver &receiver,
>> +                         StringRef text, FileOffset offs, unsigned len,
>> +                         const SourceManager &SM) {
>> +  assert(!offs.getFID().isInvalid());
>> +  SourceLocation Loc = SM.getLocForStartOfFile(offs.getFID());
>> +  Loc = Loc.getLocWithOffset(offs.getOffset());
>> +  assert(Loc.isFileID());
>> +  CharSourceRange range = CharSourceRange::getCharRange(Loc,
>> +                                                     Loc.getLocWithOffset(len));
>> +
>> +  if (text.empty()) {
>> +    assert(len);
>> +    receiver.remove(range);
>> +    return;
>> +  }
>> +
>> +  if (len)
>> +    receiver.replace(range, text);
>> +  else
>> +    receiver.insert(Loc, text);
>> +}
>> +
>> +void EditedSource::applyRewrites(EditsReceiver &receiver) {
>> +  llvm::SmallString<128> StrVec;
>> +  FileOffset CurOffs, CurEnd;
>> +  unsigned CurLen;
>> +
>> +  if (FileEdits.empty())
>> +    return;
>> +
>> +  FileEditsTy::iterator I = FileEdits.begin();
>> +  CurOffs = I->first;
>> +  StrVec = I->second.Text;
>> +  CurLen = I->second.RemoveLen;
>> +  CurEnd = CurOffs.getWithOffset(CurLen);
>> +  ++I;
>> +
>> +  for (FileEditsTy::iterator E = FileEdits.end(); I != E; ++I) {
>> +    FileOffset offs = I->first;
>> +    FileEdit act = I->second;
>> +    assert(offs >= CurEnd);
>> +
>> +    if (offs == CurEnd) {
>> +      StrVec += act.Text;
>> +      CurLen += act.RemoveLen;
>> +      CurEnd.getWithOffset(act.RemoveLen);
>> +      continue;
>> +    }
>> +
>> +    applyRewrite(receiver, StrVec.str(), CurOffs, CurLen, SourceMgr);
>> +    CurOffs = offs;
>> +    StrVec = act.Text;
>> +    CurLen = act.RemoveLen;
>> +    CurEnd = CurOffs.getWithOffset(CurLen);
>> +  }
>> +
>> +  applyRewrite(receiver, StrVec.str(), CurOffs, CurLen, SourceMgr);
>> +}
>> +
>> +void EditedSource::clearRewrites() {
>> +  FileEdits.clear();
>> +  StrAlloc.Reset();
>> +}
>> +
>> +StringRef EditedSource::getSourceText(FileOffset BeginOffs, FileOffset EndOffs,
>> +                                      bool &Invalid) {
>> +  assert(BeginOffs.getFID() == EndOffs.getFID());
>> +  assert(BeginOffs <= EndOffs);
>> +  SourceLocation BLoc = SourceMgr.getLocForStartOfFile(BeginOffs.getFID());
>> +  BLoc = BLoc.getLocWithOffset(BeginOffs.getOffset());
>> +  assert(BLoc.isFileID());
>> +  SourceLocation
>> +    ELoc = BLoc.getLocWithOffset(EndOffs.getOffset() - BeginOffs.getOffset());
>> +  return Lexer::getSourceText(CharSourceRange::getCharRange(BLoc, ELoc),
>> +                              SourceMgr, LangOpts, &Invalid);
>> +}
>> +
>> +EditedSource::FileEditsTy::iterator
>> +EditedSource::getActionForOffset(FileOffset Offs) {
>> +  FileEditsTy::iterator I = FileEdits.upper_bound(Offs);
>> +  if (I == FileEdits.begin())
>> +    return FileEdits.end();
>> +  --I;
>> +  FileEdit &FA = I->second;
>> +  FileOffset B = I->first;
>> +  FileOffset E = B.getWithOffset(FA.RemoveLen);
>> +  if (Offs >= B && Offs < E)
>> +    return I;
>> +
>> +  return FileEdits.end();
>> +}
>> 
>> Copied: cfe/trunk/lib/Edit/Makefile (from r152140, cfe/trunk/lib/Makefile)
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/Makefile?p2=cfe/trunk/lib/Edit/Makefile&p1=cfe/trunk/lib/Makefile&r1=152140&r2=152141&rev=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Makefile (original)
>> +++ cfe/trunk/lib/Edit/Makefile Tue Mar  6 14:06:33 2012
>> @@ -1,4 +1,4 @@
>> -##===- lib/Makefile ----------------------------------------*- Makefile -*-===##
>> +##===- clang/lib/Edit/Makefile -----------------------------*- Makefile -*-===##
>> #
>> #                     The LLVM Compiler Infrastructure
>> #
>> @@ -6,11 +6,9 @@
>> # License. See LICENSE.TXT for details.
>> #
>> ##===----------------------------------------------------------------------===##
>> -CLANG_LEVEL := ..
>> 
>> -PARALLEL_DIRS = Headers Basic Lex Parse AST Sema CodeGen Analysis \
>> -                StaticAnalyzer Rewrite ARCMigrate Serialization Frontend \
>> -                FrontendTool Index Driver
>> +CLANG_LEVEL := ../..
>> +LIBRARYNAME := clangEdit
>> 
>> include $(CLANG_LEVEL)/Makefile
>> 
>> 
>> Added: cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp (added)
>> +++ cfe/trunk/lib/Edit/RewriteObjCFoundationAPI.cpp Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,589 @@
>> +//===--- RewriteObjCFoundationAPI.cpp - Foundation API Rewriter -----------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +//
>> +// Rewrites legacy method calls to modern syntax.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "clang/Edit/Rewriters.h"
>> +#include "clang/Edit/Commit.h"
>> +#include "clang/Lex/Lexer.h"
>> +#include "clang/AST/ExprObjC.h"
>> +#include "clang/AST/ExprCXX.h"
>> +#include "clang/AST/NSAPI.h"
>> +
>> +using namespace clang;
>> +using namespace edit;
>> +
>> +static bool checkForLiteralCreation(const ObjCMessageExpr *Msg,
>> +                                    IdentifierInfo *&ClassId) {
>> +  if (!Msg || Msg->isImplicit() || !Msg->getMethodDecl())
>> +    return false;
>> +
>> +  const ObjCInterfaceDecl *Receiver = Msg->getReceiverInterface();
>> +  if (!Receiver)
>> +    return false;
>> +  ClassId = Receiver->getIdentifier();
>> +
>> +  if (Msg->getReceiverKind() == ObjCMessageExpr::Class)
>> +    return true;
>> +
>> +  return false;
>> +}
>> +
>> +//===----------------------------------------------------------------------===//
>> +// rewriteObjCRedundantCallWithLiteral.
>> +//===----------------------------------------------------------------------===//
>> +
>> +bool edit::rewriteObjCRedundantCallWithLiteral(const ObjCMessageExpr *Msg,
>> +                                              const NSAPI &NS, Commit &commit) {
>> +  IdentifierInfo *II = 0;
>> +  if (!checkForLiteralCreation(Msg, II))
>> +    return false;
>> +  if (Msg->getNumArgs() != 1)
>> +    return false;
>> +
>> +  const Expr *Arg = Msg->getArg(0)->IgnoreParenImpCasts();
>> +  Selector Sel = Msg->getSelector();
>> +
>> +  if ((isa<ObjCStringLiteral>(Arg) &&
>> +       NS.getNSClassId(NSAPI::ClassId_NSString) == II &&
>> +       NS.getNSStringSelector(NSAPI::NSStr_stringWithString) == Sel)    ||
>> +
>> +      (isa<ObjCArrayLiteral>(Arg) &&
>> +       NS.getNSClassId(NSAPI::ClassId_NSArray) == II &&
>> +       NS.getNSArraySelector(NSAPI::NSArr_arrayWithArray) == Sel)      ||
>> +
>> +      (isa<ObjCDictionaryLiteral>(Arg) &&
>> +       NS.getNSClassId(NSAPI::ClassId_NSDictionary) == II &&
>> +       NS.getNSDictionarySelector(
>> +                              NSAPI::NSDict_dictionaryWithDictionary) == Sel)) {
>> +
>> +    commit.replaceWithInner(Msg->getSourceRange(),
>> +                           Msg->getArg(0)->getSourceRange());
>> +    return true;
>> +  }
>> +
>> +  return false;
>> +}
>> +
>> +//===----------------------------------------------------------------------===//
>> +// rewriteToObjCSubscriptSyntax.
>> +//===----------------------------------------------------------------------===//
>> +
>> +static void maybePutParensOnReceiver(const Expr *Receiver, Commit &commit) {
>> +  Receiver = Receiver->IgnoreImpCasts();
>> +  if (isa<BinaryOperator>(Receiver) || isa<UnaryOperator>(Receiver)) {
>> +    SourceRange RecRange = Receiver->getSourceRange();
>> +    commit.insertWrap("(", RecRange, ")");
>> +  }
>> +}
>> +
>> +static bool rewriteToSubscriptGet(const ObjCMessageExpr *Msg, Commit &commit) {
>> +  if (Msg->getNumArgs() != 1)
>> +    return false;
>> +  const Expr *Rec = Msg->getInstanceReceiver();
>> +  if (!Rec)
>> +    return false;
>> +
>> +  SourceRange MsgRange = Msg->getSourceRange();
>> +  SourceRange RecRange = Rec->getSourceRange();
>> +  SourceRange ArgRange = Msg->getArg(0)->getSourceRange();
>> +
>> +  commit.replaceWithInner(CharSourceRange::getCharRange(MsgRange.getBegin(),
>> +                                                       ArgRange.getBegin()),
>> +                         CharSourceRange::getTokenRange(RecRange));
>> +  commit.replaceWithInner(SourceRange(ArgRange.getBegin(), MsgRange.getEnd()),
>> +                         ArgRange);
>> +  commit.insertWrap("[", ArgRange, "]");
>> +  maybePutParensOnReceiver(Rec, commit);
>> +  return true;
>> +}
>> +
>> +static bool rewriteToArraySubscriptSet(const ObjCMessageExpr *Msg,
>> +                                       Commit &commit) {
>> +  if (Msg->getNumArgs() != 2)
>> +    return false;
>> +  const Expr *Rec = Msg->getInstanceReceiver();
>> +  if (!Rec)
>> +    return false;
>> +
>> +  SourceRange MsgRange = Msg->getSourceRange();
>> +  SourceRange RecRange = Rec->getSourceRange();
>> +  SourceRange Arg0Range = Msg->getArg(0)->getSourceRange();
>> +  SourceRange Arg1Range = Msg->getArg(1)->getSourceRange();
>> +
>> +  commit.replaceWithInner(CharSourceRange::getCharRange(MsgRange.getBegin(),
>> +                                                       Arg0Range.getBegin()),
>> +                         CharSourceRange::getTokenRange(RecRange));
>> +  commit.replaceWithInner(CharSourceRange::getCharRange(Arg0Range.getBegin(),
>> +                                                       Arg1Range.getBegin()),
>> +                         CharSourceRange::getTokenRange(Arg0Range));
>> +  commit.replaceWithInner(SourceRange(Arg1Range.getBegin(), MsgRange.getEnd()),
>> +                         Arg1Range);
>> +  commit.insertWrap("[", CharSourceRange::getCharRange(Arg0Range.getBegin(),
>> +                                                       Arg1Range.getBegin()),
>> +                    "] = ");
>> +  maybePutParensOnReceiver(Rec, commit);
>> +  return true;
>> +}
>> +
>> +static bool rewriteToDictionarySubscriptSet(const ObjCMessageExpr *Msg,
>> +                                            Commit &commit) {
>> +  if (Msg->getNumArgs() != 2)
>> +    return false;
>> +  const Expr *Rec = Msg->getInstanceReceiver();
>> +  if (!Rec)
>> +    return false;
>> +
>> +  SourceRange MsgRange = Msg->getSourceRange();
>> +  SourceRange RecRange = Rec->getSourceRange();
>> +  SourceRange Arg0Range = Msg->getArg(0)->getSourceRange();
>> +  SourceRange Arg1Range = Msg->getArg(1)->getSourceRange();
>> +
>> +  SourceLocation LocBeforeVal = Arg0Range.getBegin();
>> +  commit.insertBefore(LocBeforeVal, "] = ");
>> +  commit.insertFromRange(LocBeforeVal, Arg1Range, /*afterToken=*/false,
>> +                         /*beforePreviousInsertions=*/true);
>> +  commit.insertBefore(LocBeforeVal, "[");
>> +  commit.replaceWithInner(CharSourceRange::getCharRange(MsgRange.getBegin(),
>> +                                                       Arg0Range.getBegin()),
>> +                         CharSourceRange::getTokenRange(RecRange));
>> +  commit.replaceWithInner(SourceRange(Arg0Range.getBegin(), MsgRange.getEnd()),
>> +                         Arg0Range);
>> +  maybePutParensOnReceiver(Rec, commit);
>> +  return true;
>> +}
>> +
>> +bool edit::rewriteToObjCSubscriptSyntax(const ObjCMessageExpr *Msg,
>> +                                           const NSAPI &NS, Commit &commit) {
>> +  if (!Msg || Msg->isImplicit() ||
>> +      Msg->getReceiverKind() != ObjCMessageExpr::Instance)
>> +    return false;
>> +  const ObjCMethodDecl *Method = Msg->getMethodDecl();
>> +  if (!Method)
>> +    return false;
>> +
>> +  const ObjCInterfaceDecl *
>> +    IFace = NS.getASTContext().getObjContainingInterface(
>> +                                          const_cast<ObjCMethodDecl *>(Method));
>> +  if (!IFace)
>> +    return false;
>> +  IdentifierInfo *II = IFace->getIdentifier();
>> +  Selector Sel = Msg->getSelector();
>> +
>> +  if ((II == NS.getNSClassId(NSAPI::ClassId_NSArray) &&
>> +       Sel == NS.getNSArraySelector(NSAPI::NSArr_objectAtIndex)) ||
>> +      (II == NS.getNSClassId(NSAPI::ClassId_NSDictionary) &&
>> +       Sel == NS.getNSDictionarySelector(NSAPI::NSDict_objectForKey)))
>> +    return rewriteToSubscriptGet(Msg, commit);
>> +
>> +  if (Msg->getNumArgs() != 2)
>> +    return false;
>> +
>> +  if (II == NS.getNSClassId(NSAPI::ClassId_NSMutableArray) &&
>> +      Sel == NS.getNSArraySelector(NSAPI::NSMutableArr_replaceObjectAtIndex))
>> +    return rewriteToArraySubscriptSet(Msg, commit);
>> +
>> +  if (II == NS.getNSClassId(NSAPI::ClassId_NSMutableDictionary) &&
>> +      Sel == NS.getNSDictionarySelector(NSAPI::NSMutableDict_setObjectForKey))
>> +    return rewriteToDictionarySubscriptSet(Msg, commit);
>> +
>> +  return false;
>> +}
>> +
>> +//===----------------------------------------------------------------------===//
>> +// rewriteToObjCLiteralSyntax.
>> +//===----------------------------------------------------------------------===//
>> +
>> +static bool rewriteToArrayLiteral(const ObjCMessageExpr *Msg,
>> +                                  const NSAPI &NS, Commit &commit);
>> +static bool rewriteToDictionaryLiteral(const ObjCMessageExpr *Msg,
>> +                                  const NSAPI &NS, Commit &commit);
>> +static bool rewriteToNumberLiteral(const ObjCMessageExpr *Msg,
>> +                                  const NSAPI &NS, Commit &commit);
>> +
>> +bool edit::rewriteToObjCLiteralSyntax(const ObjCMessageExpr *Msg,
>> +                                      const NSAPI &NS, Commit &commit) {
>> +  IdentifierInfo *II = 0;
>> +  if (!checkForLiteralCreation(Msg, II))
>> +    return false;
>> +
>> +  if (II == NS.getNSClassId(NSAPI::ClassId_NSArray))
>> +    return rewriteToArrayLiteral(Msg, NS, commit);
>> +  if (II == NS.getNSClassId(NSAPI::ClassId_NSDictionary))
>> +    return rewriteToDictionaryLiteral(Msg, NS, commit);
>> +  if (II == NS.getNSClassId(NSAPI::ClassId_NSNumber))
>> +    return rewriteToNumberLiteral(Msg, NS, commit);
>> +
>> +  return false;
>> +}
>> +
>> +//===----------------------------------------------------------------------===//
>> +// rewriteToArrayLiteral.
>> +//===----------------------------------------------------------------------===//
>> +
>> +static bool rewriteToArrayLiteral(const ObjCMessageExpr *Msg,
>> +                                  const NSAPI &NS, Commit &commit) {
>> +  Selector Sel = Msg->getSelector();
>> +  SourceRange MsgRange = Msg->getSourceRange();
>> +
>> +  if (Sel == NS.getNSArraySelector(NSAPI::NSArr_array)) {
>> +    if (Msg->getNumArgs() != 0)
>> +      return false;
>> +    commit.replace(MsgRange, "@[]");
>> +    return true;
>> +  }
>> +
>> +  if (Sel == NS.getNSArraySelector(NSAPI::NSArr_arrayWithObject)) {
>> +    if (Msg->getNumArgs() != 1)
>> +      return false;
>> +    SourceRange ArgRange = Msg->getArg(0)->getSourceRange();
>> +    commit.replaceWithInner(MsgRange, ArgRange);
>> +    commit.insertWrap("@[", ArgRange, "]");
>> +    return true;
>> +  }
>> +
>> +  if (Sel == NS.getNSArraySelector(NSAPI::NSArr_arrayWithObjects)) {
>> +    if (Msg->getNumArgs() == 0)
>> +      return false;
>> +    const Expr *SentinelExpr = Msg->getArg(Msg->getNumArgs() - 1);
>> +    if (!NS.getASTContext().isSentinelNullExpr(SentinelExpr))
>> +      return false;
>> +
>> +    if (Msg->getNumArgs() == 1) {
>> +      commit.replace(MsgRange, "@[]");
>> +      return true;
>> +    }
>> +    SourceRange ArgRange(Msg->getArg(0)->getLocStart(),
>> +                         Msg->getArg(Msg->getNumArgs()-2)->getLocEnd());
>> +    commit.replaceWithInner(MsgRange, ArgRange);
>> +    commit.insertWrap("@[", ArgRange, "]");
>> +    return true;
>> +  }
>> +
>> +  return false;
>> +}
>> +
>> +//===----------------------------------------------------------------------===//
>> +// rewriteToDictionaryLiteral.
>> +//===----------------------------------------------------------------------===//
>> +
>> +static bool rewriteToDictionaryLiteral(const ObjCMessageExpr *Msg,
>> +                                       const NSAPI &NS, Commit &commit) {
>> +  Selector Sel = Msg->getSelector();
>> +  SourceRange MsgRange = Msg->getSourceRange();
>> +
>> +  if (Sel == NS.getNSDictionarySelector(NSAPI::NSDict_dictionary)) {
>> +    if (Msg->getNumArgs() != 0)
>> +      return false;
>> +    commit.replace(MsgRange, "@{}");
>> +    return true;
>> +  }
>> +
>> +  if (Sel == NS.getNSDictionarySelector(
>> +                                    NSAPI::NSDict_dictionaryWithObjectForKey)) {
>> +    if (Msg->getNumArgs() != 2)
>> +      return false;
>> +    SourceRange ValRange = Msg->getArg(0)->getSourceRange();
>> +    SourceRange KeyRange = Msg->getArg(1)->getSourceRange();
>> +    // Insert key before the value.
>> +    commit.insertBefore(ValRange.getBegin(), ": ");
>> +    commit.insertFromRange(ValRange.getBegin(),
>> +                           CharSourceRange::getTokenRange(KeyRange),
>> +                       /*afterToken=*/false, /*beforePreviousInsertions=*/true);
>> +    commit.insertBefore(ValRange.getBegin(), "@{");
>> +    commit.insertAfterToken(ValRange.getEnd(), "}");
>> +    commit.replaceWithInner(MsgRange, ValRange);
>> +    return true;
>> +  }
>> +
>> +  if (Sel == NS.getNSDictionarySelector(
>> +                                  NSAPI::NSDict_dictionaryWithObjectsAndKeys)) {
>> +    if (Msg->getNumArgs() % 2 != 1)
>> +      return false;
>> +    unsigned SentinelIdx = Msg->getNumArgs() - 1;
>> +    const Expr *SentinelExpr = Msg->getArg(SentinelIdx);
>> +    if (!NS.getASTContext().isSentinelNullExpr(SentinelExpr))
>> +      return false;
>> +
>> +    if (Msg->getNumArgs() == 1) {
>> +      commit.replace(MsgRange, "@{}");
>> +      return true;
>> +    }
>> +
>> +    for (unsigned i = 0; i < SentinelIdx; i += 2) {
>> +      SourceRange ValRange = Msg->getArg(i)->getSourceRange();
>> +      SourceRange KeyRange = Msg->getArg(i+1)->getSourceRange();
>> +      // Insert value after key.
>> +      commit.insertAfterToken(KeyRange.getEnd(), ": ");
>> +      commit.insertFromRange(KeyRange.getEnd(), ValRange, /*afterToken=*/true);
>> +      commit.remove(CharSourceRange::getCharRange(ValRange.getBegin(),
>> +                                                  KeyRange.getBegin()));
>> +    }
>> +    // Range of arguments up until and including the last key.
>> +    // The sentinel and first value are cut off, the value will move after the
>> +    // key.
>> +    SourceRange ArgRange(Msg->getArg(1)->getLocStart(),
>> +                         Msg->getArg(SentinelIdx-1)->getLocEnd());
>> +    commit.insertWrap("@{", ArgRange, "}");
>> +    commit.replaceWithInner(MsgRange, ArgRange);
>> +    return true;
>> +  }
>> +
>> +  return false;
>> +}
>> +
>> +//===----------------------------------------------------------------------===//
>> +// rewriteToNumberLiteral.
>> +//===----------------------------------------------------------------------===//
>> +
>> +static bool rewriteToCharLiteral(const ObjCMessageExpr *Msg,
>> +                                   const CharacterLiteral *Arg,
>> +                                   const NSAPI &NS, Commit &commit) {
>> +  if (Arg->getKind() != CharacterLiteral::Ascii)
>> +    return false;
>> +  if (NS.isNSNumberLiteralSelector(NSAPI::NSNumberWithChar,
>> +                                   Msg->getSelector())) {
>> +    SourceRange ArgRange = Arg->getSourceRange();
>> +    commit.replaceWithInner(Msg->getSourceRange(), ArgRange);
>> +    commit.insert(ArgRange.getBegin(), "@");
>> +    return true;
>> +  }
>> +
>> +  return false;
>> +}
>> +
>> +static bool rewriteToBoolLiteral(const ObjCMessageExpr *Msg,
>> +                                   const Expr *Arg,
>> +                                   const NSAPI &NS, Commit &commit) {
>> +  if (NS.isNSNumberLiteralSelector(NSAPI::NSNumberWithBool,
>> +                                   Msg->getSelector())) {
>> +    SourceRange ArgRange = Arg->getSourceRange();
>> +    commit.replaceWithInner(Msg->getSourceRange(), ArgRange);
>> +    commit.insert(ArgRange.getBegin(), "@");
>> +    return true;
>> +  }
>> +
>> +  return false;
>> +}
>> +
>> +namespace {
>> +
>> +struct LiteralInfo {
>> +  bool Hex, Octal;
>> +  StringRef U, F, L, LL;
>> +  CharSourceRange WithoutSuffRange;
>> +};
>> +
>> +}
>> +
>> +static bool getLiteralInfo(SourceRange literalRange,
>> +                           bool isFloat, bool isIntZero,
>> +                          ASTContext &Ctx, LiteralInfo &Info) {
>> +  if (literalRange.getBegin().isMacroID() ||
>> +      literalRange.getEnd().isMacroID())
>> +    return false;
>> +  StringRef text = Lexer::getSourceText(
>> +                                  CharSourceRange::getTokenRange(literalRange),
>> +                                  Ctx.getSourceManager(), Ctx.getLangOptions());
>> +  if (text.empty())
>> +    return false;
>> +
>> +  llvm::Optional<bool> UpperU, UpperL;
>> +  bool UpperF = false;
>> +
>> +  struct Suff {
>> +    static bool has(StringRef suff, StringRef &text) {
>> +      if (text.endswith(suff)) {
>> +        text = text.substr(0, text.size()-suff.size());
>> +        return true;
>> +      }
>> +      return false;
>> +    }
>> +  };
>> +
>> +  while (1) {
>> +    if (Suff::has("u", text)) {
>> +      UpperU = false;
>> +    } else if (Suff::has("U", text)) {
>> +      UpperU = true;
>> +    } else if (Suff::has("ll", text)) {
>> +      UpperL = false;
>> +    } else if (Suff::has("LL", text)) {
>> +      UpperL = true;
>> +    } else if (Suff::has("l", text)) {
>> +      UpperL = false;
>> +    } else if (Suff::has("L", text)) {
>> +      UpperL = true;
>> +    } else if (isFloat && Suff::has("f", text)) {
>> +      UpperF = false;
>> +    } else if (isFloat && Suff::has("F", text)) {
>> +      UpperF = true;
>> +    } else
>> +      break;
>> +  }
>> +
>> +  if (!UpperU.hasValue() && !UpperL.hasValue())
>> +    UpperU = UpperL = true;
>> +  else if (UpperU.hasValue() && !UpperL.hasValue())
>> +    UpperL = UpperU;
>> +  else if (UpperL.hasValue() && !UpperU.hasValue())
>> +    UpperU = UpperL;
>> +
>> +  Info.U = *UpperU ? "U" : "u";
>> +  Info.L = *UpperL ? "L" : "l";
>> +  Info.LL = *UpperL ? "LL" : "ll";
>> +  Info.F = UpperF ? "F" : "f";
>> +
>> +  Info.Hex = Info.Octal = false;
>> +  if (text.startswith("0x"))
>> +    Info.Hex = true;
>> +  else if (!isFloat && !isIntZero && text.startswith("0"))
>> +    Info.Octal = true;
>> +
>> +  SourceLocation B = literalRange.getBegin();
>> +  Info.WithoutSuffRange =
>> +      CharSourceRange::getCharRange(B, B.getLocWithOffset(text.size()));
>> +  return true;
>> +}
>> +
>> +static bool rewriteToNumberLiteral(const ObjCMessageExpr *Msg,
>> +                                   const NSAPI &NS, Commit &commit) {
>> +  if (Msg->getNumArgs() != 1)
>> +    return false;
>> +
>> +  const Expr *Arg = Msg->getArg(0)->IgnoreParenImpCasts();
>> +  if (const CharacterLiteral *CharE = dyn_cast<CharacterLiteral>(Arg))
>> +    return rewriteToCharLiteral(Msg, CharE, NS, commit);
>> +  if (const ObjCBoolLiteralExpr *BE = dyn_cast<ObjCBoolLiteralExpr>(Arg))
>> +    return rewriteToBoolLiteral(Msg, BE, NS, commit);
>> +  if (const CXXBoolLiteralExpr *BE = dyn_cast<CXXBoolLiteralExpr>(Arg))
>> +    return rewriteToBoolLiteral(Msg, BE, NS, commit);
>> +
>> +  const Expr *literalE = Arg;
>> +  if (const UnaryOperator *UOE = dyn_cast<UnaryOperator>(literalE)) {
>> +    if (UOE->getOpcode() == UO_Plus || UOE->getOpcode() == UO_Minus)
>> +      literalE = UOE->getSubExpr();
>> +  }
>> +
>> +  // Only integer and floating literals; non-literals or imaginary literal
>> +  // cannot be rewritten.
>> +  if (!isa<IntegerLiteral>(literalE) && !isa<FloatingLiteral>(literalE))
>> +    return false;
>> +
>> +  ASTContext &Ctx = NS.getASTContext();
>> +  Selector Sel = Msg->getSelector();
>> +  llvm::Optional<NSAPI::NSNumberLiteralMethodKind>
>> +    MKOpt = NS.getNSNumberLiteralMethodKind(Sel);
>> +  if (!MKOpt)
>> +    return false;
>> +  NSAPI::NSNumberLiteralMethodKind MK = *MKOpt;
>> +
>> +  bool CallIsInteger = false, CallIsUnsigned = false;
>> +  bool CallIsLong = false, CallIsLongLong = false;
>> +  bool CallIsFloating = false, CallIsDouble = false;
>> +
>> +  switch (MK) {
>> +  // We cannot have these calls with int/float literals.
>> +  case NSAPI::NSNumberWithChar:
>> +  case NSAPI::NSNumberWithUnsignedChar:
>> +  case NSAPI::NSNumberWithShort:
>> +  case NSAPI::NSNumberWithUnsignedShort:
>> +  case NSAPI::NSNumberWithBool:
>> +    return false;
>> +
>> +  case NSAPI::NSNumberWithUnsignedInt:
>> +  case NSAPI::NSNumberWithUnsignedInteger:
>> +    CallIsUnsigned = true;
>> +  case NSAPI::NSNumberWithInt:
>> +  case NSAPI::NSNumberWithInteger:
>> +    CallIsInteger = true;
>> +    break;
>> +
>> +  case NSAPI::NSNumberWithUnsignedLong:
>> +    CallIsUnsigned = true;
>> +  case NSAPI::NSNumberWithLong:
>> +    CallIsInteger = true; CallIsLong = true;
>> +    break;
>> +
>> +  case NSAPI::NSNumberWithUnsignedLongLong:
>> +    CallIsUnsigned = true;
>> +  case NSAPI::NSNumberWithLongLong:
>> +    CallIsInteger = true; CallIsLongLong = true;
>> +    break;
>> +
>> +  case NSAPI::NSNumberWithDouble:
>> +    CallIsDouble = true;
>> +  case NSAPI::NSNumberWithFloat:
>> +    CallIsFloating = true;
>> +    break;
>> +  }
>> +
>> +  SourceRange ArgRange = Arg->getSourceRange();
>> +  QualType ArgTy = Arg->getType();
>> +  QualType CallTy = Msg->getArg(0)->getType();
>> +
>> +  // Check for the easy case, the literal maps directly to the call.
>> +  if (Ctx.hasSameType(ArgTy, CallTy)) {
>> +    commit.replaceWithInner(Msg->getSourceRange(), ArgRange);
>> +    commit.insert(ArgRange.getBegin(), "@");
>> +    return true;
>> +  }
>> +
>> +  // We will need to modify the literal suffix to get the same type as the call.
>> +  // Don't even try if it came from a macro.
>> +  if (ArgRange.getBegin().isMacroID())
>> +    return false;
>> +
>> +  bool LitIsFloat = ArgTy->isFloatingType();
>> +  // For a float passed to integer call, don't try rewriting. It is difficult
>> +  // and a very uncommon case anyway.
>> +  if (LitIsFloat && !CallIsFloating)
>> +    return false;
>> +
>> +  // Try to modify the literal make it the same type as the method call.
>> +  // -Modify the suffix, and/or
>> +  // -Change integer to float
>> +
>> +  LiteralInfo LitInfo;
>> +  bool isIntZero = false;
>> +  if (const IntegerLiteral *IntE = dyn_cast<IntegerLiteral>(literalE))
>> +    isIntZero = !IntE->getValue().getBoolValue();
>> +  if (!getLiteralInfo(ArgRange, LitIsFloat, isIntZero, Ctx, LitInfo))
>> +    return false;
>> +
>> +  // Not easy to do int -> float with hex/octal and uncommon anyway.
>> +  if (!LitIsFloat && CallIsFloating && (LitInfo.Hex || LitInfo.Octal))
>> +    return false;
>> +
>> +  SourceLocation LitB = LitInfo.WithoutSuffRange.getBegin();
>> +  SourceLocation LitE = LitInfo.WithoutSuffRange.getEnd();
>> +
>> +  commit.replaceWithInner(CharSourceRange::getTokenRange(Msg->getSourceRange()),
>> +                         LitInfo.WithoutSuffRange);
>> +  commit.insert(LitB, "@");
>> +
>> +  if (!LitIsFloat && CallIsFloating)
>> +    commit.insert(LitE, ".0");
>> +
>> +  if (CallIsFloating) {
>> +    if (!CallIsDouble)
>> +      commit.insert(LitE, LitInfo.F);
>> +  } else {
>> +    if (CallIsUnsigned)
>> +      commit.insert(LitE, LitInfo.U);
>> +
>> +    if (CallIsLong)
>> +      commit.insert(LitE, LitInfo.L);
>> +    else if (CallIsLongLong)
>> +      commit.insert(LitE, LitInfo.LL);
>> +  }
>> +  return true;
>> +}
>> 
>> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
>> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Tue Mar  6 14:06:33 2012
>> @@ -428,6 +428,7 @@
>>   case frontend::RewriteObjC:            return "-rewrite-objc";
>>   case frontend::RewriteTest:            return "-rewrite-test";
>>   case frontend::RunAnalysis:            return "-analyze";
>> +  case frontend::MigrateSource:          return "-migrate";
>>   case frontend::RunPreprocessorOnly:    return "-Eonly";
>>   }
>> 
>> @@ -483,9 +484,9 @@
>>     Res.push_back("-arcmt-migrate");
>>     break;
>>   }
>> -  if (!Opts.ARCMTMigrateDir.empty()) {
>> -    Res.push_back("-arcmt-migrate-directory");
>> -    Res.push_back(Opts.ARCMTMigrateDir);
>> +  if (!Opts.MTMigrateDir.empty()) {
>> +    Res.push_back("-mt-migrate-directory");
>> +    Res.push_back(Opts.MTMigrateDir);
>>   }
>>   if (!Opts.ARCMTMigrateReportOut.empty()) {
>>     Res.push_back("-arcmt-migrate-report-output");
>> @@ -494,6 +495,11 @@
>>   if (Opts.ARCMTMigrateEmitARCErrors)
>>     Res.push_back("-arcmt-migrate-emit-errors");
>> 
>> +  if (Opts.ObjCMTAction & ~FrontendOptions::ObjCMT_Literals)
>> +    Res.push_back("-objcmt-migrate-literals");
>> +  if (Opts.ObjCMTAction & ~FrontendOptions::ObjCMT_Subscripting)
>> +    Res.push_back("-objcmt-migrate-subscripting");
>> +
>>   bool NeedLang = false;
>>   for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i)
>>     if (FrontendOptions::getInputKindForExtension(Opts.Inputs[i].File) !=
>> @@ -828,6 +834,8 @@
>>     Res.push_back("-fdebugger-support");
>>   if (Opts.DebuggerCastResultToId)
>>     Res.push_back("-fdebugger-cast-result-to-id");
>> +  if (Opts.DebuggerObjCLiteral)
>> +    Res.push_back("-fdebugger-objc-literal");
>>   if (Opts.DelayedTemplateParsing)
>>     Res.push_back("-fdelayed-template-parsing");
>>   if (Opts.Deprecated)
>> @@ -1376,6 +1384,8 @@
>>       Opts.ProgramAction = frontend::RewriteTest; break;
>>     case OPT_analyze:
>>       Opts.ProgramAction = frontend::RunAnalysis; break;
>> +    case OPT_migrate:
>> +      Opts.ProgramAction = frontend::MigrateSource; break;
>>     case OPT_Eonly:
>>       Opts.ProgramAction = frontend::RunPreprocessorOnly; break;
>>     }
>> @@ -1432,7 +1442,6 @@
>>   Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp);
>>   Opts.OverrideRecordLayoutsFile
>>     = Args.getLastArgValue(OPT_foverride_record_layout_EQ);
>> -  Opts.ARCMTAction = FrontendOptions::ARCMT_None;
>>   if (const Arg *A = Args.getLastArg(OPT_arcmt_check,
>>                                      OPT_arcmt_modify,
>>                                      OPT_arcmt_migrate)) {
>> @@ -1450,12 +1459,23 @@
>>       break;
>>     }
>>   }
>> -  Opts.ARCMTMigrateDir = Args.getLastArgValue(OPT_arcmt_migrate_directory);
>> +  Opts.MTMigrateDir = Args.getLastArgValue(OPT_mt_migrate_directory);
>>   Opts.ARCMTMigrateReportOut
>>     = Args.getLastArgValue(OPT_arcmt_migrate_report_output);
>>   Opts.ARCMTMigrateEmitARCErrors
>>     = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);
>> 
>> +  if (Args.hasArg(OPT_objcmt_migrate_literals))
>> +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Literals;
>> +  if (Args.hasArg(OPT_objcmt_migrate_subscripting))
>> +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Subscripting;
>> +
>> +  if (Opts.ARCMTAction != FrontendOptions::ARCMT_None &&
>> +      Opts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
>> +    Diags.Report(diag::err_drv_argument_not_allowed_with)
>> +      << "ARC migration" << "ObjC migration";
>> +  }
>> +
>>   InputKind DashX = IK_None;
>>   if (const Arg *A = Args.getLastArg(OPT_x)) {
>>     DashX = llvm::StringSwitch<InputKind>(A->getValue(Args))
>> @@ -1899,6 +1919,7 @@
>>   Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
>>   Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
>>   Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id);
>> +  Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
>>   Opts.AddressSanitizer = Args.hasArg(OPT_faddress_sanitizer);
>>   Opts.ThreadSanitizer = Args.hasArg(OPT_fthread_sanitizer);
>>   Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
>> 
>> Modified: cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp (original)
>> +++ cfe/trunk/lib/Frontend/DiagnosticRenderer.cpp Tue Mar  6 14:06:33 2012
>> @@ -12,6 +12,9 @@
>> #include "clang/Basic/SourceManager.h"
>> #include "clang/Frontend/DiagnosticOptions.h"
>> #include "clang/Lex/Lexer.h"
>> +#include "clang/Edit/EditedSource.h"
>> +#include "clang/Edit/Commit.h"
>> +#include "clang/Edit/EditsReceiver.h"
>> #include "llvm/Support/MemoryBuffer.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include "llvm/Support/ErrorHandling.h"
>> @@ -127,6 +130,54 @@
>> 
>> DiagnosticRenderer::~DiagnosticRenderer() {}
>> 
>> +namespace {
>> +
>> +class FixitReceiver : public edit::EditsReceiver {
>> +  SmallVectorImpl<FixItHint> &MergedFixits;
>> +
>> +public:
>> +  FixitReceiver(SmallVectorImpl<FixItHint> &MergedFixits)
>> +    : MergedFixits(MergedFixits) { }
>> +  virtual void insert(SourceLocation loc, StringRef text) {
>> +    MergedFixits.push_back(FixItHint::CreateInsertion(loc, text));
>> +  }
>> +  virtual void replace(CharSourceRange range, StringRef text) {
>> +    MergedFixits.push_back(FixItHint::CreateReplacement(range, text));
>> +  }
>> +};
>> +
>> +}
>> +
>> +static void mergeFixits(ArrayRef<FixItHint> FixItHints,
>> +                        const SourceManager &SM, const LangOptions &LangOpts,
>> +                        SmallVectorImpl<FixItHint> &MergedFixits) {
>> +  edit::Commit commit(SM, LangOpts);
>> +  for (ArrayRef<FixItHint>::const_iterator
>> +         I = FixItHints.begin(), E = FixItHints.end(); I != E; ++I) {
>> +    const FixItHint &Hint = *I;
>> +    if (Hint.CodeToInsert.empty()) {
>> +      if (Hint.InsertFromRange.isValid())
>> +        commit.insertFromRange(Hint.RemoveRange.getBegin(),
>> +                           Hint.InsertFromRange, /*afterToken=*/false,
>> +                           Hint.BeforePreviousInsertions);
>> +      else
>> +        commit.remove(Hint.RemoveRange);
>> +    } else {
>> +      if (Hint.RemoveRange.isTokenRange() ||
>> +          Hint.RemoveRange.getBegin() != Hint.RemoveRange.getEnd())
>> +        commit.replace(Hint.RemoveRange, Hint.CodeToInsert);
>> +      else
>> +        commit.insert(Hint.RemoveRange.getBegin(), Hint.CodeToInsert,
>> +                    /*afterToken=*/false, Hint.BeforePreviousInsertions);
>> +    }
>> +  }
>> +
>> +  edit::EditedSource Editor(SM, LangOpts);
>> +  if (Editor.commit(commit)) {
>> +    FixitReceiver Rec(MergedFixits);
>> +    Editor.applyRewrites(Rec);
>> +  }
>> +}
>> 
>> void DiagnosticRenderer::emitDiagnostic(SourceLocation Loc,
>>                                         DiagnosticsEngine::Level Level,
>> @@ -152,6 +203,12 @@
>>     SmallVector<CharSourceRange, 20> MutableRanges(Ranges.begin(),
>>                                                    Ranges.end());
>> 
>> +    llvm::SmallVector<FixItHint, 8> MergedFixits;
>> +    if (!FixItHints.empty()) {
>> +      mergeFixits(FixItHints, SM, LangOpts, MergedFixits);
>> +      FixItHints = MergedFixits;
>> +    }
>> +
>>     for (ArrayRef<FixItHint>::const_iterator I = FixItHints.begin(),
>>          E = FixItHints.end();
>>          I != E; ++I)
>> 
>> Modified: cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp (original)
>> +++ cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp Tue Mar  6 14:06:33 2012
>> @@ -76,6 +76,7 @@
>>   case RewriteObjC:            return new RewriteObjCAction();
>>   case RewriteTest:            return new RewriteTestAction();
>>   case RunAnalysis:            return new ento::AnalysisAction();
>> +  case MigrateSource:          return new arcmt::MigrateSourceAction();
>>   case RunPreprocessorOnly:    return new PreprocessOnlyAction();
>>   }
>>   llvm_unreachable("Invalid program action!");
>> @@ -105,12 +106,18 @@
>>     break;
>>   case FrontendOptions::ARCMT_Migrate:
>>     Act = new arcmt::MigrateAction(Act,
>> -                                   FEOpts.ARCMTMigrateDir,
>> +                                   FEOpts.MTMigrateDir,
>>                                    FEOpts.ARCMTMigrateReportOut,
>>                                    FEOpts.ARCMTMigrateEmitARCErrors);
>>     break;
>>   }
>> 
>> +  if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
>> +    Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir,
>> +                   FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Literals,
>> +                   FEOpts.ObjCMTAction & ~FrontendOptions::ObjCMT_Subscripting);
>> +  }
>> +
>>   // If there are any AST files to merge, create a frontend action
>>   // adaptor to perform the merge.
>>   if (!FEOpts.ASTMergeFiles.empty())
>> 
>> Modified: cfe/trunk/lib/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Makefile?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Makefile (original)
>> +++ cfe/trunk/lib/Makefile Tue Mar  6 14:06:33 2012
>> @@ -9,7 +9,7 @@
>> CLANG_LEVEL := ..
>> 
>> PARALLEL_DIRS = Headers Basic Lex Parse AST Sema CodeGen Analysis \
>> -                StaticAnalyzer Rewrite ARCMigrate Serialization Frontend \
>> +                StaticAnalyzer Edit Rewrite ARCMigrate Serialization Frontend \
>>                 FrontendTool Index Driver
>> 
>> include $(CLANG_LEVEL)/Makefile
>> 
>> Modified: cfe/trunk/lib/Rewrite/FixItRewriter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/FixItRewriter.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Rewrite/FixItRewriter.cpp (original)
>> +++ cfe/trunk/lib/Rewrite/FixItRewriter.cpp Tue Mar  6 14:06:33 2012
>> @@ -14,6 +14,8 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/Rewrite/FixItRewriter.h"
>> +#include "clang/Edit/Commit.h"
>> +#include "clang/Edit/EditsReceiver.h"
>> #include "clang/Basic/FileManager.h"
>> #include "clang/Basic/SourceLocation.h"
>> #include "clang/Basic/SourceManager.h"
>> @@ -29,6 +31,7 @@
>>                              const LangOptions &LangOpts,
>>                              FixItOptions *FixItOpts)
>>   : Diags(Diags),
>> +    Editor(SourceMgr, LangOpts),
>>     Rewrite(SourceMgr, LangOpts),
>>     FixItOpts(FixItOpts),
>>     NumFailures(0),
>> @@ -51,6 +54,24 @@
>>   return false;
>> }
>> 
>> +namespace {
>> +
>> +class RewritesReceiver : public edit::EditsReceiver {
>> +  Rewriter &Rewrite;
>> +
>> +public:
>> +  RewritesReceiver(Rewriter &Rewrite) : Rewrite(Rewrite) { }
>> +
>> +  virtual void insert(SourceLocation loc, StringRef text) {
>> +    Rewrite.InsertText(loc, text);
>> +  }
>> +  virtual void replace(CharSourceRange range, StringRef text) {
>> +    Rewrite.ReplaceText(range.getBegin(), Rewrite.getRangeSize(range), text);
>> +  }
>> +};
>> +
>> +}
>> +
>> bool FixItRewriter::WriteFixedFiles(
>>             std::vector<std::pair<std::string, std::string> > *RewrittenFiles) {
>>   if (NumFailures > 0 && !FixItOpts->FixWhatYouCan) {
>> @@ -58,6 +79,9 @@
>>     return true;
>>   }
>> 
>> +  RewritesReceiver Rec(Rewrite);
>> +  Editor.applyRewrites(Rec);
>> +
>>   for (iterator I = buffer_begin(), E = buffer_end(); I != E; ++I) {
>>     const FileEntry *Entry = Rewrite.getSourceMgr().getFileEntryForID(I->first);
>>     int fd;
>> @@ -116,16 +140,28 @@
>> 
>>   // Make sure that we can perform all of the modifications we
>>   // in this diagnostic.
>> -  bool CanRewrite = Info.getNumFixItHints() > 0;
>> +  edit::Commit commit(Editor);
>>   for (unsigned Idx = 0, Last = Info.getNumFixItHints();
>>        Idx < Last; ++Idx) {
>>     const FixItHint &Hint = Info.getFixItHint(Idx);
>> -    if (Hint.RemoveRange.isValid() &&
>> -        Rewrite.getRangeSize(Hint.RemoveRange) == -1) {
>> -      CanRewrite = false;
>> -      break;
>> +
>> +    if (Hint.CodeToInsert.empty()) {
>> +      if (Hint.InsertFromRange.isValid())
>> +        commit.insertFromRange(Hint.RemoveRange.getBegin(),
>> +                           Hint.InsertFromRange, /*afterToken=*/false,
>> +                           Hint.BeforePreviousInsertions);
>> +      else
>> +        commit.remove(Hint.RemoveRange);
>> +    } else {
>> +      if (Hint.RemoveRange.isTokenRange() ||
>> +          Hint.RemoveRange.getBegin() != Hint.RemoveRange.getEnd())
>> +        commit.replace(Hint.RemoveRange, Hint.CodeToInsert);
>> +      else
>> +        commit.insert(Hint.RemoveRange.getBegin(), Hint.CodeToInsert,
>> +                    /*afterToken=*/false, Hint.BeforePreviousInsertions);
>>     }
>>   }
>> +  bool CanRewrite = Info.getNumFixItHints() > 0 && commit.isCommitable();
>> 
>>   if (!CanRewrite) {
>>     if (Info.getNumFixItHints() > 0)
>> @@ -138,27 +174,8 @@
>>     }
>>     return;
>>   }
>> -
>> -  bool Failed = false;
>> -  for (unsigned Idx = 0, Last = Info.getNumFixItHints();
>> -       Idx < Last; ++Idx) {
>> -    const FixItHint &Hint = Info.getFixItHint(Idx);
>> -
>> -    if (Hint.CodeToInsert.empty()) {
>> -      // We're removing code.
>> -      if (Rewrite.RemoveText(Hint.RemoveRange))
>> -        Failed = true;
>> -      continue;
>> -    }
>> -
>> -    // We're replacing code.
>> -    if (Rewrite.ReplaceText(Hint.RemoveRange.getBegin(),
>> -                            Rewrite.getRangeSize(Hint.RemoveRange),
>> -                            Hint.CodeToInsert))
>> -      Failed = true;
>> -  }
>> -
>> -  if (Failed) {
>> +
>> +  if (!Editor.commit(commit)) {
>>     ++NumFailures;
>>     Diag(Info.getLocation(), diag::note_fixit_failed);
>>     return;
>> 
>> Added: cfe/trunk/test/ARCMT/dispatch.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/dispatch.m?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/dispatch.m (added)
>> +++ cfe/trunk/test/ARCMT/dispatch.m Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,29 @@
>> +// RUN: %clang_cc1 -fblocks -fsyntax-only -fobjc-arc -x objective-c %s.result
>> +// RUN: arcmt-test --args -triple x86_64-apple-darwin10 -fblocks -fsyntax-only -x objective-c %s > %t
>> +// RUN: diff %t %s.result
>> +
>> +#include "Common.h"
>> +
>> +#define dispatch_retain(object) ({ dispatch_object_t _o = (object); _dispatch_object_validate(_o); (void)[_o retain]; })
>> +#define dispatch_release(object) ({ dispatch_object_t _o = (object); _dispatch_object_validate(_o); [_o release]; })
>> +#define xpc_retain(object) ({ xpc_object_t _o = (object); _xpc_object_validate(_o); [_o retain]; })
>> +#define xpc_release(object) ({ xpc_object_t _o = (object); _xpc_object_validate(_o); [_o release]; })
>> +
>> +typedef id dispatch_object_t;
>> +typedef id xpc_object_t;
>> +
>> +void _dispatch_object_validate(dispatch_object_t object);
>> +void _xpc_object_validate(xpc_object_t object);
>> +
>> +dispatch_object_t getme(void);
>> +
>> +void func(dispatch_object_t o) {
>> +  dispatch_retain(o);
>> +  dispatch_release(o);
>> +  dispatch_retain(getme());
>> +}
>> +
>> +void func2(xpc_object_t o) {
>> +  xpc_retain(o);
>> +  xpc_release(o);
>> +}
>> 
>> Added: cfe/trunk/test/ARCMT/dispatch.m.result
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/dispatch.m.result?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/dispatch.m.result (added)
>> +++ cfe/trunk/test/ARCMT/dispatch.m.result Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,25 @@
>> +// RUN: %clang_cc1 -fblocks -fsyntax-only -fobjc-arc -x objective-c %s.result
>> +// RUN: arcmt-test --args -triple x86_64-apple-darwin10 -fblocks -fsyntax-only -x objective-c %s > %t
>> +// RUN: diff %t %s.result
>> +
>> +#include "Common.h"
>> +
>> +#define dispatch_retain(object) ({ dispatch_object_t _o = (object); _dispatch_object_validate(_o); (void)[_o retain]; })
>> +#define dispatch_release(object) ({ dispatch_object_t _o = (object); _dispatch_object_validate(_o); [_o release]; })
>> +#define xpc_retain(object) ({ xpc_object_t _o = (object); _xpc_object_validate(_o); [_o retain]; })
>> +#define xpc_release(object) ({ xpc_object_t _o = (object); _xpc_object_validate(_o); [_o release]; })
>> +
>> +typedef id dispatch_object_t;
>> +typedef id xpc_object_t;
>> +
>> +void _dispatch_object_validate(dispatch_object_t object);
>> +void _xpc_object_validate(xpc_object_t object);
>> +
>> +dispatch_object_t getme(void);
>> +
>> +void func(dispatch_object_t o) {
>> +  getme();
>> +}
>> +
>> +void func2(xpc_object_t o) {
>> +}
>> 
>> Modified: cfe/trunk/test/ARCMT/driver-migrate.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/driver-migrate.m?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/driver-migrate.m (original)
>> +++ cfe/trunk/test/ARCMT/driver-migrate.m Tue Mar  6 14:06:33 2012
>> @@ -1,6 +1,6 @@
>> // RUN: %clang -### -ccc-arcmt-migrate /foo/bar -fsyntax-only %s 2>&1 | FileCheck %s
>> 
>> -// CHECK: "-arcmt-migrate" "-arcmt-migrate-directory" "{{[^"]*}}/foo/bar"
>> +// CHECK: "-arcmt-migrate" "-mt-migrate-directory" "{{[^"]*}}/foo/bar"
>> 
>> // RUN: touch %t.o
>> // RUN: %clang -ccc-arcmt-check -target i386-apple-darwin9 -### %t.o 2> %t.log
>> 
>> Modified: cfe/trunk/test/ARCMT/migrate-emit-errors.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/migrate-emit-errors.m?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/migrate-emit-errors.m (original)
>> +++ cfe/trunk/test/ARCMT/migrate-emit-errors.m Tue Mar  6 14:06:33 2012
>> @@ -1,4 +1,4 @@
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t -arcmt-migrate-emit-errors %s 2>&1 | FileCheck %s
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t -arcmt-migrate-emit-errors %s 2>&1 | FileCheck %s
>> // RUN: rm -rf %t
>> 
>> @protocol NSObject
>> 
>> Modified: cfe/trunk/test/ARCMT/migrate-plist-output.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/migrate-plist-output.m?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/migrate-plist-output.m (original)
>> +++ cfe/trunk/test/ARCMT/migrate-plist-output.m Tue Mar  6 14:06:33 2012
>> @@ -1,4 +1,4 @@
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t.dir -arcmt-migrate-report-output %t.plist %s
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t.dir -arcmt-migrate-report-output %t.plist %s
>> // RUN: FileCheck %s -input-file=%t.plist
>> // RUN: rm -rf %t.dir
>> 
>> 
>> Modified: cfe/trunk/test/ARCMT/migrate-space-in-path.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/migrate-space-in-path.m?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/migrate-space-in-path.m (original)
>> +++ cfe/trunk/test/ARCMT/migrate-space-in-path.m Tue Mar  6 14:06:33 2012
>> @@ -1,6 +1,6 @@
>> // RUN: rm -rf %t.migrate
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t.migrate %S/"with space"/test1.m.in -x objective-c
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t.migrate %S/"with space"/test2.m.in -x objective-c
>> -// RUN: c-arcmt-test -arcmt-migrate-directory %t.migrate | arcmt-test -verify-transformed-files %S/"with space"/test1.m.in.result %S/"with space"/test2.m.in.result %S/"with space"/test.h.result
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t.migrate %S/"with space"/test1.m.in -x objective-c
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t.migrate %S/"with space"/test2.m.in -x objective-c
>> +// RUN: c-arcmt-test -mt-migrate-directory %t.migrate | arcmt-test -verify-transformed-files %S/"with space"/test1.m.in.result %S/"with space"/test2.m.in.result %S/"with space"/test.h.result
>> // RUN: rm -rf %t.migrate
>> // DISABLE: mingw32
>> 
>> Modified: cfe/trunk/test/ARCMT/migrate.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/migrate.m?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/migrate.m (original)
>> +++ cfe/trunk/test/ARCMT/migrate.m Tue Mar  6 14:06:33 2012
>> @@ -1,6 +1,6 @@
>> // RUN: rm -rf %t
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t %S/Inputs/test1.m.in -x objective-c
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t %S/Inputs/test2.m.in -x objective-c
>> -// RUN: c-arcmt-test -arcmt-migrate-directory %t | arcmt-test -verify-transformed-files %S/Inputs/test1.m.in.result %S/Inputs/test2.m.in.result %S/Inputs/test.h.result
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t %S/Inputs/test1.m.in -x objective-c
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t %S/Inputs/test2.m.in -x objective-c
>> +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %S/Inputs/test1.m.in.result %S/Inputs/test2.m.in.result %S/Inputs/test.h.result
>> // RUN: rm -rf %t
>> // DISABLE: mingw32
>> 
>> Added: cfe/trunk/test/ARCMT/objcmt-numeric-literals.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-numeric-literals.m?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/objcmt-numeric-literals.m (added)
>> +++ cfe/trunk/test/ARCMT/objcmt-numeric-literals.m Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,501 @@
>> +// RUN: rm -rf %t
>> +// RUN: %clang_cc1 -objcmt-migrate-literals -objcmt-migrate-subscripting -mt-migrate-directory %t %s -x objective-c++
>> +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> +
>> +#define YES __objc_yes
>> +#define NO __objc_no
>> +
>> +typedef long NSInteger;
>> +typedef unsigned long NSUInteger;
>> +typedef signed char BOOL;
>> +#define nil ((void*) 0)
>> +
>> + at interface NSObject
>> ++ (id)alloc;
>> + at end
>> +
>> + at interface NSNumber : NSObject
>> + at end
>> +
>> + at interface NSNumber (NSNumberCreation)
>> +- (id)initWithChar:(char)value;
>> +- (id)initWithUnsignedChar:(unsigned char)value;
>> +- (id)initWithShort:(short)value;
>> +- (id)initWithUnsignedShort:(unsigned short)value;
>> +- (id)initWithInt:(int)value;
>> +- (id)initWithUnsignedInt:(unsigned int)value;
>> +- (id)initWithLong:(long)value;
>> +- (id)initWithUnsignedLong:(unsigned long)value;
>> +- (id)initWithLongLong:(long long)value;
>> +- (id)initWithUnsignedLongLong:(unsigned long long)value;
>> +- (id)initWithFloat:(float)value;
>> +- (id)initWithDouble:(double)value;
>> +- (id)initWithBool:(BOOL)value;
>> +- (id)initWithInteger:(NSInteger)value;
>> +- (id)initWithUnsignedInteger:(NSUInteger)value;
>> +
>> ++ (NSNumber *)numberWithChar:(char)value;
>> ++ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
>> ++ (NSNumber *)numberWithShort:(short)value;
>> ++ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
>> ++ (NSNumber *)numberWithInt:(int)value;
>> ++ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
>> ++ (NSNumber *)numberWithLong:(long)value;
>> ++ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
>> ++ (NSNumber *)numberWithLongLong:(long long)value;
>> ++ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
>> ++ (NSNumber *)numberWithFloat:(float)value;
>> ++ (NSNumber *)numberWithDouble:(double)value;
>> ++ (NSNumber *)numberWithBool:(BOOL)value;
>> ++ (NSNumber *)numberWithInteger:(NSInteger)value;
>> ++ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value;
>> + at end
>> +
>> +#define VAL_INT 2
>> +#define VAL_UINT 2U
>> +#define VAL_CHAR 'a'
>> +
>> +void foo() {
>> +  [NSNumber numberWithChar:'a'];
>> +  [NSNumber numberWithChar:L'a'];
>> +  [NSNumber numberWithChar:2];
>> +  [NSNumber numberWithChar:2U];
>> +  [NSNumber numberWithChar:2u];
>> +  [NSNumber numberWithChar:2L];
>> +  [NSNumber numberWithChar:2l];
>> +  [NSNumber numberWithChar:2LL];
>> +  [NSNumber numberWithChar:2ll];
>> +  [NSNumber numberWithChar:2ul];
>> +  [NSNumber numberWithChar:2lu];
>> +  [NSNumber numberWithChar:2ull];
>> +  [NSNumber numberWithChar:2llu];
>> +  [NSNumber numberWithChar:2.0];
>> +  [NSNumber numberWithChar:2.0f];
>> +  [NSNumber numberWithChar:2.0F];
>> +  [NSNumber numberWithChar:2.0l];
>> +  [NSNumber numberWithChar:2.0L];
>> +  [NSNumber numberWithChar:0x2f];
>> +  [NSNumber numberWithChar:04];
>> +  [NSNumber numberWithChar:0];
>> +  [NSNumber numberWithChar:0.0];
>> +  [NSNumber numberWithChar:YES];
>> +  [NSNumber numberWithChar:NO];
>> +  [NSNumber numberWithChar:true];
>> +  [NSNumber numberWithChar:false];
>> +  [NSNumber numberWithChar:VAL_INT];
>> +  [NSNumber numberWithChar:VAL_UINT];
>> +  [NSNumber numberWithChar:VAL_CHAR];
>> +
>> +  [NSNumber numberWithUnsignedChar:'a'];
>> +  [NSNumber numberWithUnsignedChar:L'a'];
>> +  [NSNumber numberWithUnsignedChar:2];
>> +  [NSNumber numberWithUnsignedChar:2U];
>> +  [NSNumber numberWithUnsignedChar:2u];
>> +  [NSNumber numberWithUnsignedChar:2L];
>> +  [NSNumber numberWithUnsignedChar:2l];
>> +  [NSNumber numberWithUnsignedChar:2LL];
>> +  [NSNumber numberWithUnsignedChar:2ll];
>> +  [NSNumber numberWithUnsignedChar:2ul];
>> +  [NSNumber numberWithUnsignedChar:2lu];
>> +  [NSNumber numberWithUnsignedChar:2ull];
>> +  [NSNumber numberWithUnsignedChar:2llu];
>> +  [NSNumber numberWithUnsignedChar:2.0];
>> +  [NSNumber numberWithUnsignedChar:2.0f];
>> +  [NSNumber numberWithUnsignedChar:2.0F];
>> +  [NSNumber numberWithUnsignedChar:2.0l];
>> +  [NSNumber numberWithUnsignedChar:2.0L];
>> +  [NSNumber numberWithUnsignedChar:0x2f];
>> +  [NSNumber numberWithUnsignedChar:04];
>> +  [NSNumber numberWithUnsignedChar:0];
>> +  [NSNumber numberWithUnsignedChar:0.0];
>> +  [NSNumber numberWithUnsignedChar:YES];
>> +  [NSNumber numberWithUnsignedChar:NO];
>> +  [NSNumber numberWithUnsignedChar:true];
>> +  [NSNumber numberWithUnsignedChar:false];
>> +  [NSNumber numberWithUnsignedChar:VAL_INT];
>> +  [NSNumber numberWithUnsignedChar:VAL_UINT];
>> +  [NSNumber numberWithUnsignedChar:VAL_CHAR];
>> +
>> +  [NSNumber numberWithShort:'a'];
>> +  [NSNumber numberWithShort:L'a'];
>> +  [NSNumber numberWithShort:2];
>> +  [NSNumber numberWithShort:2U];
>> +  [NSNumber numberWithShort:2u];
>> +  [NSNumber numberWithShort:2L];
>> +  [NSNumber numberWithShort:2l];
>> +  [NSNumber numberWithShort:2LL];
>> +  [NSNumber numberWithShort:2ll];
>> +  [NSNumber numberWithShort:2ul];
>> +  [NSNumber numberWithShort:2lu];
>> +  [NSNumber numberWithShort:2ull];
>> +  [NSNumber numberWithShort:2llu];
>> +  [NSNumber numberWithShort:2.0];
>> +  [NSNumber numberWithShort:2.0f];
>> +  [NSNumber numberWithShort:2.0F];
>> +  [NSNumber numberWithShort:2.0l];
>> +  [NSNumber numberWithShort:2.0L];
>> +  [NSNumber numberWithShort:0x2f];
>> +  [NSNumber numberWithShort:04];
>> +  [NSNumber numberWithShort:0];
>> +  [NSNumber numberWithShort:0.0];
>> +  [NSNumber numberWithShort:YES];
>> +  [NSNumber numberWithShort:NO];
>> +  [NSNumber numberWithShort:true];
>> +  [NSNumber numberWithShort:false];
>> +  [NSNumber numberWithShort:VAL_INT];
>> +  [NSNumber numberWithShort:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedShort:'a'];
>> +  [NSNumber numberWithUnsignedShort:L'a'];
>> +  [NSNumber numberWithUnsignedShort:2];
>> +  [NSNumber numberWithUnsignedShort:2U];
>> +  [NSNumber numberWithUnsignedShort:2u];
>> +  [NSNumber numberWithUnsignedShort:2L];
>> +  [NSNumber numberWithUnsignedShort:2l];
>> +  [NSNumber numberWithUnsignedShort:2LL];
>> +  [NSNumber numberWithUnsignedShort:2ll];
>> +  [NSNumber numberWithUnsignedShort:2ul];
>> +  [NSNumber numberWithUnsignedShort:2lu];
>> +  [NSNumber numberWithUnsignedShort:2ull];
>> +  [NSNumber numberWithUnsignedShort:2llu];
>> +  [NSNumber numberWithUnsignedShort:2.0];
>> +  [NSNumber numberWithUnsignedShort:2.0f];
>> +  [NSNumber numberWithUnsignedShort:2.0F];
>> +  [NSNumber numberWithUnsignedShort:2.0l];
>> +  [NSNumber numberWithUnsignedShort:2.0L];
>> +  [NSNumber numberWithUnsignedShort:0x2f];
>> +  [NSNumber numberWithUnsignedShort:04];
>> +  [NSNumber numberWithUnsignedShort:0];
>> +  [NSNumber numberWithUnsignedShort:0.0];
>> +  [NSNumber numberWithUnsignedShort:YES];
>> +  [NSNumber numberWithUnsignedShort:NO];
>> +  [NSNumber numberWithUnsignedShort:true];
>> +  [NSNumber numberWithUnsignedShort:false];
>> +  [NSNumber numberWithUnsignedShort:VAL_INT];
>> +  [NSNumber numberWithUnsignedShort:VAL_UINT];
>> +
>> +  [NSNumber numberWithInt:'a'];
>> +  [NSNumber numberWithInt:L'a'];
>> +  [NSNumber numberWithInt:2];
>> +  [NSNumber numberWithInt:2U];
>> +  [NSNumber numberWithInt:2u];
>> +  [NSNumber numberWithInt:2L];
>> +  [NSNumber numberWithInt:2l];
>> +  [NSNumber numberWithInt:2LL];
>> +  [NSNumber numberWithInt:2ll];
>> +  [NSNumber numberWithInt:2ul];
>> +  [NSNumber numberWithInt:2lu];
>> +  [NSNumber numberWithInt:2ull];
>> +  [NSNumber numberWithInt:2llu];
>> +  [NSNumber numberWithInt:2.0];
>> +  [NSNumber numberWithInt:2.0f];
>> +  [NSNumber numberWithInt:2.0F];
>> +  [NSNumber numberWithInt:2.0l];
>> +  [NSNumber numberWithInt:2.0L];
>> +  [NSNumber numberWithInt:0x2f];
>> +  [NSNumber numberWithInt:04];
>> +  [NSNumber numberWithInt:0];
>> +  [NSNumber numberWithInt:0.0];
>> +  [NSNumber numberWithInt:YES];
>> +  [NSNumber numberWithInt:NO];
>> +  [NSNumber numberWithInt:true];
>> +  [NSNumber numberWithInt:false];
>> +  [NSNumber numberWithInt:VAL_INT];
>> +  [NSNumber numberWithInt:VAL_UINT];
>> +
>> +  (void)[[NSNumber alloc] initWithInt:2];
>> +  (void)[[NSNumber alloc] initWithInt:2U];
>> +
>> +  [NSNumber numberWithInt:+2];
>> +  [NSNumber numberWithInt:-2];
>> +
>> +  [NSNumber numberWithUnsignedInt:'a'];
>> +  [NSNumber numberWithUnsignedInt:L'a'];
>> +  [NSNumber numberWithUnsignedInt:2];
>> +  [NSNumber numberWithUnsignedInt:2U];
>> +  [NSNumber numberWithUnsignedInt:2u];
>> +  [NSNumber numberWithUnsignedInt:2L];
>> +  [NSNumber numberWithUnsignedInt:2l];
>> +  [NSNumber numberWithUnsignedInt:2LL];
>> +  [NSNumber numberWithUnsignedInt:2ll];
>> +  [NSNumber numberWithUnsignedInt:2ul];
>> +  [NSNumber numberWithUnsignedInt:2lu];
>> +  [NSNumber numberWithUnsignedInt:2ull];
>> +  [NSNumber numberWithUnsignedInt:2llu];
>> +  [NSNumber numberWithUnsignedInt:2.0];
>> +  [NSNumber numberWithUnsignedInt:2.0f];
>> +  [NSNumber numberWithUnsignedInt:2.0F];
>> +  [NSNumber numberWithUnsignedInt:2.0l];
>> +  [NSNumber numberWithUnsignedInt:2.0L];
>> +  [NSNumber numberWithUnsignedInt:0x2f];
>> +  [NSNumber numberWithUnsignedInt:04];
>> +  [NSNumber numberWithUnsignedInt:0];
>> +  [NSNumber numberWithUnsignedInt:0.0];
>> +  [NSNumber numberWithUnsignedInt:YES];
>> +  [NSNumber numberWithUnsignedInt:NO];
>> +  [NSNumber numberWithUnsignedInt:true];
>> +  [NSNumber numberWithUnsignedInt:false];
>> +  [NSNumber numberWithUnsignedInt:VAL_INT];
>> +  [NSNumber numberWithUnsignedInt:VAL_UINT];
>> +
>> +  [NSNumber numberWithLong:'a'];
>> +  [NSNumber numberWithLong:L'a'];
>> +  [NSNumber numberWithLong:2];
>> +  [NSNumber numberWithLong:2U];
>> +  [NSNumber numberWithLong:2u];
>> +  [NSNumber numberWithLong:2L];
>> +  [NSNumber numberWithLong:2l];
>> +  [NSNumber numberWithLong:2LL];
>> +  [NSNumber numberWithLong:2ll];
>> +  [NSNumber numberWithLong:2ul];
>> +  [NSNumber numberWithLong:2lu];
>> +  [NSNumber numberWithLong:2ull];
>> +  [NSNumber numberWithLong:2llu];
>> +  [NSNumber numberWithLong:2.0];
>> +  [NSNumber numberWithLong:2.0f];
>> +  [NSNumber numberWithLong:2.0F];
>> +  [NSNumber numberWithLong:2.0l];
>> +  [NSNumber numberWithLong:2.0L];
>> +  [NSNumber numberWithLong:0x2f];
>> +  [NSNumber numberWithLong:04];
>> +  [NSNumber numberWithLong:0];
>> +  [NSNumber numberWithLong:0.0];
>> +  [NSNumber numberWithLong:YES];
>> +  [NSNumber numberWithLong:NO];
>> +  [NSNumber numberWithLong:true];
>> +  [NSNumber numberWithLong:false];
>> +  [NSNumber numberWithLong:VAL_INT];
>> +  [NSNumber numberWithLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedLong:'a'];
>> +  [NSNumber numberWithUnsignedLong:L'a'];
>> +  [NSNumber numberWithUnsignedLong:2];
>> +  [NSNumber numberWithUnsignedLong:2U];
>> +  [NSNumber numberWithUnsignedLong:2u];
>> +  [NSNumber numberWithUnsignedLong:2L];
>> +  [NSNumber numberWithUnsignedLong:2l];
>> +  [NSNumber numberWithUnsignedLong:2LL];
>> +  [NSNumber numberWithUnsignedLong:2ll];
>> +  [NSNumber numberWithUnsignedLong:2ul];
>> +  [NSNumber numberWithUnsignedLong:2lu];
>> +  [NSNumber numberWithUnsignedLong:2ull];
>> +  [NSNumber numberWithUnsignedLong:2llu];
>> +  [NSNumber numberWithUnsignedLong:2.0];
>> +  [NSNumber numberWithUnsignedLong:2.0f];
>> +  [NSNumber numberWithUnsignedLong:2.0F];
>> +  [NSNumber numberWithUnsignedLong:2.0l];
>> +  [NSNumber numberWithUnsignedLong:2.0L];
>> +  [NSNumber numberWithUnsignedLong:0x2f];
>> +  [NSNumber numberWithUnsignedLong:04];
>> +  [NSNumber numberWithUnsignedLong:0];
>> +  [NSNumber numberWithUnsignedLong:0.0];
>> +  [NSNumber numberWithUnsignedLong:YES];
>> +  [NSNumber numberWithUnsignedLong:NO];
>> +  [NSNumber numberWithUnsignedLong:true];
>> +  [NSNumber numberWithUnsignedLong:false];
>> +  [NSNumber numberWithUnsignedLong:VAL_INT];
>> +  [NSNumber numberWithUnsignedLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithLongLong:'a'];
>> +  [NSNumber numberWithLongLong:L'a'];
>> +  [NSNumber numberWithLongLong:2];
>> +  [NSNumber numberWithLongLong:2U];
>> +  [NSNumber numberWithLongLong:2u];
>> +  [NSNumber numberWithLongLong:2L];
>> +  [NSNumber numberWithLongLong:2l];
>> +  [NSNumber numberWithLongLong:2LL];
>> +  [NSNumber numberWithLongLong:2ll];
>> +  [NSNumber numberWithLongLong:2ul];
>> +  [NSNumber numberWithLongLong:2lu];
>> +  [NSNumber numberWithLongLong:2ull];
>> +  [NSNumber numberWithLongLong:2llu];
>> +  [NSNumber numberWithLongLong:2.0];
>> +  [NSNumber numberWithLongLong:2.0f];
>> +  [NSNumber numberWithLongLong:2.0F];
>> +  [NSNumber numberWithLongLong:2.0l];
>> +  [NSNumber numberWithLongLong:2.0L];
>> +  [NSNumber numberWithLongLong:0x2f];
>> +  [NSNumber numberWithLongLong:04];
>> +  [NSNumber numberWithLongLong:0];
>> +  [NSNumber numberWithLongLong:0.0];
>> +  [NSNumber numberWithLongLong:YES];
>> +  [NSNumber numberWithLongLong:NO];
>> +  [NSNumber numberWithLongLong:true];
>> +  [NSNumber numberWithLongLong:false];
>> +  [NSNumber numberWithLongLong:VAL_INT];
>> +  [NSNumber numberWithLongLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedLongLong:'a'];
>> +  [NSNumber numberWithUnsignedLongLong:L'a'];
>> +  [NSNumber numberWithUnsignedLongLong:2];
>> +  [NSNumber numberWithUnsignedLongLong:2U];
>> +  [NSNumber numberWithUnsignedLongLong:2u];
>> +  [NSNumber numberWithUnsignedLongLong:2L];
>> +  [NSNumber numberWithUnsignedLongLong:2l];
>> +  [NSNumber numberWithUnsignedLongLong:2LL];
>> +  [NSNumber numberWithUnsignedLongLong:2ll];
>> +  [NSNumber numberWithUnsignedLongLong:2ul];
>> +  [NSNumber numberWithUnsignedLongLong:2lu];
>> +  [NSNumber numberWithUnsignedLongLong:2ull];
>> +  [NSNumber numberWithUnsignedLongLong:2llu];
>> +  [NSNumber numberWithUnsignedLongLong:2.0];
>> +  [NSNumber numberWithUnsignedLongLong:2.0f];
>> +  [NSNumber numberWithUnsignedLongLong:2.0F];
>> +  [NSNumber numberWithUnsignedLongLong:2.0l];
>> +  [NSNumber numberWithUnsignedLongLong:2.0L];
>> +  [NSNumber numberWithUnsignedLongLong:0x2f];
>> +  [NSNumber numberWithUnsignedLongLong:04];
>> +  [NSNumber numberWithUnsignedLongLong:0];
>> +  [NSNumber numberWithUnsignedLongLong:0.0];
>> +  [NSNumber numberWithUnsignedLongLong:YES];
>> +  [NSNumber numberWithUnsignedLongLong:NO];
>> +  [NSNumber numberWithUnsignedLongLong:true];
>> +  [NSNumber numberWithUnsignedLongLong:false];
>> +  [NSNumber numberWithUnsignedLongLong:VAL_INT];
>> +  [NSNumber numberWithUnsignedLongLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithFloat:'a'];
>> +  [NSNumber numberWithFloat:L'a'];
>> +  [NSNumber numberWithFloat:2];
>> +  [NSNumber numberWithFloat:2U];
>> +  [NSNumber numberWithFloat:2u];
>> +  [NSNumber numberWithFloat:2L];
>> +  [NSNumber numberWithFloat:2l];
>> +  [NSNumber numberWithFloat:2LL];
>> +  [NSNumber numberWithFloat:2ll];
>> +  [NSNumber numberWithFloat:2ul];
>> +  [NSNumber numberWithFloat:2lu];
>> +  [NSNumber numberWithFloat:2ull];
>> +  [NSNumber numberWithFloat:2llu];
>> +  [NSNumber numberWithFloat:2.0];
>> +  [NSNumber numberWithFloat:2.0f];
>> +  [NSNumber numberWithFloat:2.0F];
>> +  [NSNumber numberWithFloat:2.0l];
>> +  [NSNumber numberWithFloat:2.0L];
>> +  [NSNumber numberWithFloat:0x2f];
>> +  [NSNumber numberWithFloat:04];
>> +  [NSNumber numberWithFloat:0];
>> +  [NSNumber numberWithFloat:0.0];
>> +  [NSNumber numberWithFloat:YES];
>> +  [NSNumber numberWithFloat:NO];
>> +  [NSNumber numberWithFloat:true];
>> +  [NSNumber numberWithFloat:false];
>> +  [NSNumber numberWithFloat:VAL_INT];
>> +  [NSNumber numberWithFloat:VAL_UINT];
>> +
>> +  [NSNumber numberWithDouble:'a'];
>> +  [NSNumber numberWithDouble:L'a'];
>> +  [NSNumber numberWithDouble:2];
>> +  [NSNumber numberWithDouble:2U];
>> +  [NSNumber numberWithDouble:2u];
>> +  [NSNumber numberWithDouble:2L];
>> +  [NSNumber numberWithDouble:2l];
>> +  [NSNumber numberWithDouble:2LL];
>> +  [NSNumber numberWithDouble:2ll];
>> +  [NSNumber numberWithDouble:2ul];
>> +  [NSNumber numberWithDouble:2lu];
>> +  [NSNumber numberWithDouble:2ull];
>> +  [NSNumber numberWithDouble:2llu];
>> +  [NSNumber numberWithDouble:2.0];
>> +  [NSNumber numberWithDouble:2.0f];
>> +  [NSNumber numberWithDouble:2.0F];
>> +  [NSNumber numberWithDouble:2.0l];
>> +  [NSNumber numberWithDouble:2.0L];
>> +  [NSNumber numberWithDouble:0x2f];
>> +  [NSNumber numberWithDouble:04];
>> +  [NSNumber numberWithDouble:0];
>> +  [NSNumber numberWithDouble:0.0];
>> +  [NSNumber numberWithDouble:YES];
>> +  [NSNumber numberWithDouble:NO];
>> +  [NSNumber numberWithDouble:true];
>> +  [NSNumber numberWithDouble:false];
>> +  [NSNumber numberWithDouble:VAL_INT];
>> +  [NSNumber numberWithDouble:VAL_UINT];
>> +
>> +  [NSNumber numberWithBool:'a'];
>> +  [NSNumber numberWithBool:L'a'];
>> +  [NSNumber numberWithBool:2];
>> +  [NSNumber numberWithBool:2U];
>> +  [NSNumber numberWithBool:2u];
>> +  [NSNumber numberWithBool:2L];
>> +  [NSNumber numberWithBool:2l];
>> +  [NSNumber numberWithBool:2LL];
>> +  [NSNumber numberWithBool:2ll];
>> +  [NSNumber numberWithBool:2ul];
>> +  [NSNumber numberWithBool:2lu];
>> +  [NSNumber numberWithBool:2ull];
>> +  [NSNumber numberWithBool:2llu];
>> +  [NSNumber numberWithBool:2.0];
>> +  [NSNumber numberWithBool:2.0f];
>> +  [NSNumber numberWithBool:2.0F];
>> +  [NSNumber numberWithBool:2.0l];
>> +  [NSNumber numberWithBool:2.0L];
>> +  [NSNumber numberWithBool:0x2f];
>> +  [NSNumber numberWithBool:04];
>> +  [NSNumber numberWithBool:0];
>> +  [NSNumber numberWithBool:0.0];
>> +  [NSNumber numberWithBool:YES];
>> +  [NSNumber numberWithBool:NO];
>> +  [NSNumber numberWithBool:true];
>> +  [NSNumber numberWithBool:false];
>> +  [NSNumber numberWithBool:VAL_INT];
>> +  [NSNumber numberWithBool:VAL_UINT];
>> +
>> +  [NSNumber numberWithInteger:'a'];
>> +  [NSNumber numberWithInteger:L'a'];
>> +  [NSNumber numberWithInteger:2];
>> +  [NSNumber numberWithInteger:2U];
>> +  [NSNumber numberWithInteger:2u];
>> +  [NSNumber numberWithInteger:2L];
>> +  [NSNumber numberWithInteger:2l];
>> +  [NSNumber numberWithInteger:2LL];
>> +  [NSNumber numberWithInteger:2ll];
>> +  [NSNumber numberWithInteger:2ul];
>> +  [NSNumber numberWithInteger:2lu];
>> +  [NSNumber numberWithInteger:2ull];
>> +  [NSNumber numberWithInteger:2llu];
>> +  [NSNumber numberWithInteger:2.0];
>> +  [NSNumber numberWithInteger:2.0f];
>> +  [NSNumber numberWithInteger:2.0F];
>> +  [NSNumber numberWithInteger:2.0l];
>> +  [NSNumber numberWithInteger:2.0L];
>> +  [NSNumber numberWithInteger:0x2f];
>> +  [NSNumber numberWithInteger:04];
>> +  [NSNumber numberWithInteger:0];
>> +  [NSNumber numberWithInteger:0.0];
>> +  [NSNumber numberWithInteger:YES];
>> +  [NSNumber numberWithInteger:NO];
>> +  [NSNumber numberWithInteger:true];
>> +  [NSNumber numberWithInteger:false];
>> +  [NSNumber numberWithInteger:VAL_INT];
>> +  [NSNumber numberWithInteger:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedInteger:'a'];
>> +  [NSNumber numberWithUnsignedInteger:L'a'];
>> +  [NSNumber numberWithUnsignedInteger:2];
>> +  [NSNumber numberWithUnsignedInteger:2U];
>> +  [NSNumber numberWithUnsignedInteger:2u];
>> +  [NSNumber numberWithUnsignedInteger:2L];
>> +  [NSNumber numberWithUnsignedInteger:2l];
>> +  [NSNumber numberWithUnsignedInteger:2LL];
>> +  [NSNumber numberWithUnsignedInteger:2ll];
>> +  [NSNumber numberWithUnsignedInteger:2ul];
>> +  [NSNumber numberWithUnsignedInteger:2lu];
>> +  [NSNumber numberWithUnsignedInteger:2ull];
>> +  [NSNumber numberWithUnsignedInteger:2llu];
>> +  [NSNumber numberWithUnsignedInteger:2.0];
>> +  [NSNumber numberWithUnsignedInteger:2.0f];
>> +  [NSNumber numberWithUnsignedInteger:2.0F];
>> +  [NSNumber numberWithUnsignedInteger:2.0l];
>> +  [NSNumber numberWithUnsignedInteger:2.0L];
>> +  [NSNumber numberWithUnsignedInteger:0x2f];
>> +  [NSNumber numberWithUnsignedInteger:04];
>> +  [NSNumber numberWithUnsignedInteger:0];
>> +  [NSNumber numberWithUnsignedInteger:0.0];
>> +  [NSNumber numberWithUnsignedInteger:YES];
>> +  [NSNumber numberWithUnsignedInteger:NO];
>> +  [NSNumber numberWithUnsignedInteger:true];
>> +  [NSNumber numberWithUnsignedInteger:false];
>> +  [NSNumber numberWithUnsignedInteger:VAL_INT];
>> +  [NSNumber numberWithUnsignedInteger:VAL_UINT];
>> +}
>> 
>> Added: cfe/trunk/test/ARCMT/objcmt-numeric-literals.m.result
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-numeric-literals.m.result?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/objcmt-numeric-literals.m.result (added)
>> +++ cfe/trunk/test/ARCMT/objcmt-numeric-literals.m.result Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,501 @@
>> +// RUN: rm -rf %t
>> +// RUN: %clang_cc1 -objcmt-migrate-literals -objcmt-migrate-subscripting -mt-migrate-directory %t %s -x objective-c++
>> +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> +
>> +#define YES __objc_yes
>> +#define NO __objc_no
>> +
>> +typedef long NSInteger;
>> +typedef unsigned long NSUInteger;
>> +typedef signed char BOOL;
>> +#define nil ((void*) 0)
>> +
>> + at interface NSObject
>> ++ (id)alloc;
>> + at end
>> +
>> + at interface NSNumber : NSObject
>> + at end
>> +
>> + at interface NSNumber (NSNumberCreation)
>> +- (id)initWithChar:(char)value;
>> +- (id)initWithUnsignedChar:(unsigned char)value;
>> +- (id)initWithShort:(short)value;
>> +- (id)initWithUnsignedShort:(unsigned short)value;
>> +- (id)initWithInt:(int)value;
>> +- (id)initWithUnsignedInt:(unsigned int)value;
>> +- (id)initWithLong:(long)value;
>> +- (id)initWithUnsignedLong:(unsigned long)value;
>> +- (id)initWithLongLong:(long long)value;
>> +- (id)initWithUnsignedLongLong:(unsigned long long)value;
>> +- (id)initWithFloat:(float)value;
>> +- (id)initWithDouble:(double)value;
>> +- (id)initWithBool:(BOOL)value;
>> +- (id)initWithInteger:(NSInteger)value;
>> +- (id)initWithUnsignedInteger:(NSUInteger)value;
>> +
>> ++ (NSNumber *)numberWithChar:(char)value;
>> ++ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
>> ++ (NSNumber *)numberWithShort:(short)value;
>> ++ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
>> ++ (NSNumber *)numberWithInt:(int)value;
>> ++ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
>> ++ (NSNumber *)numberWithLong:(long)value;
>> ++ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
>> ++ (NSNumber *)numberWithLongLong:(long long)value;
>> ++ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
>> ++ (NSNumber *)numberWithFloat:(float)value;
>> ++ (NSNumber *)numberWithDouble:(double)value;
>> ++ (NSNumber *)numberWithBool:(BOOL)value;
>> ++ (NSNumber *)numberWithInteger:(NSInteger)value;
>> ++ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value;
>> + at end
>> +
>> +#define VAL_INT 2
>> +#define VAL_UINT 2U
>> +#define VAL_CHAR 'a'
>> +
>> +void foo() {
>> +  @'a';
>> +  [NSNumber numberWithChar:L'a'];
>> +  [NSNumber numberWithChar:2];
>> +  [NSNumber numberWithChar:2U];
>> +  [NSNumber numberWithChar:2u];
>> +  [NSNumber numberWithChar:2L];
>> +  [NSNumber numberWithChar:2l];
>> +  [NSNumber numberWithChar:2LL];
>> +  [NSNumber numberWithChar:2ll];
>> +  [NSNumber numberWithChar:2ul];
>> +  [NSNumber numberWithChar:2lu];
>> +  [NSNumber numberWithChar:2ull];
>> +  [NSNumber numberWithChar:2llu];
>> +  [NSNumber numberWithChar:2.0];
>> +  [NSNumber numberWithChar:2.0f];
>> +  [NSNumber numberWithChar:2.0F];
>> +  [NSNumber numberWithChar:2.0l];
>> +  [NSNumber numberWithChar:2.0L];
>> +  [NSNumber numberWithChar:0x2f];
>> +  [NSNumber numberWithChar:04];
>> +  [NSNumber numberWithChar:0];
>> +  [NSNumber numberWithChar:0.0];
>> +  [NSNumber numberWithChar:YES];
>> +  [NSNumber numberWithChar:NO];
>> +  [NSNumber numberWithChar:true];
>> +  [NSNumber numberWithChar:false];
>> +  [NSNumber numberWithChar:VAL_INT];
>> +  [NSNumber numberWithChar:VAL_UINT];
>> +  @VAL_CHAR;
>> +
>> +  [NSNumber numberWithUnsignedChar:'a'];
>> +  [NSNumber numberWithUnsignedChar:L'a'];
>> +  [NSNumber numberWithUnsignedChar:2];
>> +  [NSNumber numberWithUnsignedChar:2U];
>> +  [NSNumber numberWithUnsignedChar:2u];
>> +  [NSNumber numberWithUnsignedChar:2L];
>> +  [NSNumber numberWithUnsignedChar:2l];
>> +  [NSNumber numberWithUnsignedChar:2LL];
>> +  [NSNumber numberWithUnsignedChar:2ll];
>> +  [NSNumber numberWithUnsignedChar:2ul];
>> +  [NSNumber numberWithUnsignedChar:2lu];
>> +  [NSNumber numberWithUnsignedChar:2ull];
>> +  [NSNumber numberWithUnsignedChar:2llu];
>> +  [NSNumber numberWithUnsignedChar:2.0];
>> +  [NSNumber numberWithUnsignedChar:2.0f];
>> +  [NSNumber numberWithUnsignedChar:2.0F];
>> +  [NSNumber numberWithUnsignedChar:2.0l];
>> +  [NSNumber numberWithUnsignedChar:2.0L];
>> +  [NSNumber numberWithUnsignedChar:0x2f];
>> +  [NSNumber numberWithUnsignedChar:04];
>> +  [NSNumber numberWithUnsignedChar:0];
>> +  [NSNumber numberWithUnsignedChar:0.0];
>> +  [NSNumber numberWithUnsignedChar:YES];
>> +  [NSNumber numberWithUnsignedChar:NO];
>> +  [NSNumber numberWithUnsignedChar:true];
>> +  [NSNumber numberWithUnsignedChar:false];
>> +  [NSNumber numberWithUnsignedChar:VAL_INT];
>> +  [NSNumber numberWithUnsignedChar:VAL_UINT];
>> +  [NSNumber numberWithUnsignedChar:VAL_CHAR];
>> +
>> +  [NSNumber numberWithShort:'a'];
>> +  [NSNumber numberWithShort:L'a'];
>> +  [NSNumber numberWithShort:2];
>> +  [NSNumber numberWithShort:2U];
>> +  [NSNumber numberWithShort:2u];
>> +  [NSNumber numberWithShort:2L];
>> +  [NSNumber numberWithShort:2l];
>> +  [NSNumber numberWithShort:2LL];
>> +  [NSNumber numberWithShort:2ll];
>> +  [NSNumber numberWithShort:2ul];
>> +  [NSNumber numberWithShort:2lu];
>> +  [NSNumber numberWithShort:2ull];
>> +  [NSNumber numberWithShort:2llu];
>> +  [NSNumber numberWithShort:2.0];
>> +  [NSNumber numberWithShort:2.0f];
>> +  [NSNumber numberWithShort:2.0F];
>> +  [NSNumber numberWithShort:2.0l];
>> +  [NSNumber numberWithShort:2.0L];
>> +  [NSNumber numberWithShort:0x2f];
>> +  [NSNumber numberWithShort:04];
>> +  [NSNumber numberWithShort:0];
>> +  [NSNumber numberWithShort:0.0];
>> +  [NSNumber numberWithShort:YES];
>> +  [NSNumber numberWithShort:NO];
>> +  [NSNumber numberWithShort:true];
>> +  [NSNumber numberWithShort:false];
>> +  [NSNumber numberWithShort:VAL_INT];
>> +  [NSNumber numberWithShort:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedShort:'a'];
>> +  [NSNumber numberWithUnsignedShort:L'a'];
>> +  [NSNumber numberWithUnsignedShort:2];
>> +  [NSNumber numberWithUnsignedShort:2U];
>> +  [NSNumber numberWithUnsignedShort:2u];
>> +  [NSNumber numberWithUnsignedShort:2L];
>> +  [NSNumber numberWithUnsignedShort:2l];
>> +  [NSNumber numberWithUnsignedShort:2LL];
>> +  [NSNumber numberWithUnsignedShort:2ll];
>> +  [NSNumber numberWithUnsignedShort:2ul];
>> +  [NSNumber numberWithUnsignedShort:2lu];
>> +  [NSNumber numberWithUnsignedShort:2ull];
>> +  [NSNumber numberWithUnsignedShort:2llu];
>> +  [NSNumber numberWithUnsignedShort:2.0];
>> +  [NSNumber numberWithUnsignedShort:2.0f];
>> +  [NSNumber numberWithUnsignedShort:2.0F];
>> +  [NSNumber numberWithUnsignedShort:2.0l];
>> +  [NSNumber numberWithUnsignedShort:2.0L];
>> +  [NSNumber numberWithUnsignedShort:0x2f];
>> +  [NSNumber numberWithUnsignedShort:04];
>> +  [NSNumber numberWithUnsignedShort:0];
>> +  [NSNumber numberWithUnsignedShort:0.0];
>> +  [NSNumber numberWithUnsignedShort:YES];
>> +  [NSNumber numberWithUnsignedShort:NO];
>> +  [NSNumber numberWithUnsignedShort:true];
>> +  [NSNumber numberWithUnsignedShort:false];
>> +  [NSNumber numberWithUnsignedShort:VAL_INT];
>> +  [NSNumber numberWithUnsignedShort:VAL_UINT];
>> +
>> +  [NSNumber numberWithInt:'a'];
>> +  [NSNumber numberWithInt:L'a'];
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  [NSNumber numberWithInt:2.0];
>> +  [NSNumber numberWithInt:2.0f];
>> +  [NSNumber numberWithInt:2.0F];
>> +  [NSNumber numberWithInt:2.0l];
>> +  [NSNumber numberWithInt:2.0L];
>> +  @0x2f;
>> +  @04;
>> +  @0;
>> +  [NSNumber numberWithInt:0.0];
>> +  [NSNumber numberWithInt:YES];
>> +  [NSNumber numberWithInt:NO];
>> +  [NSNumber numberWithInt:true];
>> +  [NSNumber numberWithInt:false];
>> +  @VAL_INT;
>> +  [NSNumber numberWithInt:VAL_UINT];
>> +
>> +  (void)[[NSNumber alloc] initWithInt:2];
>> +  (void)[[NSNumber alloc] initWithInt:2U];
>> +
>> +  @+2;
>> +  @-2;
>> +
>> +  [NSNumber numberWithUnsignedInt:'a'];
>> +  [NSNumber numberWithUnsignedInt:L'a'];
>> +  @2U;
>> +  @2U;
>> +  @2u;
>> +  @2U;
>> +  @2u;
>> +  @2U;
>> +  @2u;
>> +  @2u;
>> +  @2u;
>> +  @2u;
>> +  @2u;
>> +  [NSNumber numberWithUnsignedInt:2.0];
>> +  [NSNumber numberWithUnsignedInt:2.0f];
>> +  [NSNumber numberWithUnsignedInt:2.0F];
>> +  [NSNumber numberWithUnsignedInt:2.0l];
>> +  [NSNumber numberWithUnsignedInt:2.0L];
>> +  @0x2fU;
>> +  @04U;
>> +  @0U;
>> +  [NSNumber numberWithUnsignedInt:0.0];
>> +  [NSNumber numberWithUnsignedInt:YES];
>> +  [NSNumber numberWithUnsignedInt:NO];
>> +  [NSNumber numberWithUnsignedInt:true];
>> +  [NSNumber numberWithUnsignedInt:false];
>> +  [NSNumber numberWithUnsignedInt:VAL_INT];
>> +  @VAL_UINT;
>> +
>> +  [NSNumber numberWithLong:'a'];
>> +  [NSNumber numberWithLong:L'a'];
>> +  @2L;
>> +  @2L;
>> +  @2l;
>> +  @2L;
>> +  @2l;
>> +  @2L;
>> +  @2l;
>> +  @2l;
>> +  @2l;
>> +  @2l;
>> +  @2l;
>> +  [NSNumber numberWithLong:2.0];
>> +  [NSNumber numberWithLong:2.0f];
>> +  [NSNumber numberWithLong:2.0F];
>> +  [NSNumber numberWithLong:2.0l];
>> +  [NSNumber numberWithLong:2.0L];
>> +  @0x2fL;
>> +  @04L;
>> +  @0L;
>> +  [NSNumber numberWithLong:0.0];
>> +  [NSNumber numberWithLong:YES];
>> +  [NSNumber numberWithLong:NO];
>> +  [NSNumber numberWithLong:true];
>> +  [NSNumber numberWithLong:false];
>> +  [NSNumber numberWithLong:VAL_INT];
>> +  [NSNumber numberWithLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedLong:'a'];
>> +  [NSNumber numberWithUnsignedLong:L'a'];
>> +  @2UL;
>> +  @2UL;
>> +  @2ul;
>> +  @2UL;
>> +  @2ul;
>> +  @2UL;
>> +  @2ul;
>> +  @2ul;
>> +  @2lu;
>> +  @2ul;
>> +  @2ul;
>> +  [NSNumber numberWithUnsignedLong:2.0];
>> +  [NSNumber numberWithUnsignedLong:2.0f];
>> +  [NSNumber numberWithUnsignedLong:2.0F];
>> +  [NSNumber numberWithUnsignedLong:2.0l];
>> +  [NSNumber numberWithUnsignedLong:2.0L];
>> +  @0x2fUL;
>> +  @04UL;
>> +  @0UL;
>> +  [NSNumber numberWithUnsignedLong:0.0];
>> +  [NSNumber numberWithUnsignedLong:YES];
>> +  [NSNumber numberWithUnsignedLong:NO];
>> +  [NSNumber numberWithUnsignedLong:true];
>> +  [NSNumber numberWithUnsignedLong:false];
>> +  [NSNumber numberWithUnsignedLong:VAL_INT];
>> +  [NSNumber numberWithUnsignedLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithLongLong:'a'];
>> +  [NSNumber numberWithLongLong:L'a'];
>> +  @2LL;
>> +  @2LL;
>> +  @2ll;
>> +  @2LL;
>> +  @2ll;
>> +  @2LL;
>> +  @2ll;
>> +  @2ll;
>> +  @2ll;
>> +  @2ll;
>> +  @2ll;
>> +  [NSNumber numberWithLongLong:2.0];
>> +  [NSNumber numberWithLongLong:2.0f];
>> +  [NSNumber numberWithLongLong:2.0F];
>> +  [NSNumber numberWithLongLong:2.0l];
>> +  [NSNumber numberWithLongLong:2.0L];
>> +  @0x2fLL;
>> +  @04LL;
>> +  @0LL;
>> +  [NSNumber numberWithLongLong:0.0];
>> +  [NSNumber numberWithLongLong:YES];
>> +  [NSNumber numberWithLongLong:NO];
>> +  [NSNumber numberWithLongLong:true];
>> +  [NSNumber numberWithLongLong:false];
>> +  [NSNumber numberWithLongLong:VAL_INT];
>> +  [NSNumber numberWithLongLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedLongLong:'a'];
>> +  [NSNumber numberWithUnsignedLongLong:L'a'];
>> +  @2ULL;
>> +  @2ULL;
>> +  @2ull;
>> +  @2ULL;
>> +  @2ull;
>> +  @2ULL;
>> +  @2ull;
>> +  @2ull;
>> +  @2ull;
>> +  @2ull;
>> +  @2llu;
>> +  [NSNumber numberWithUnsignedLongLong:2.0];
>> +  [NSNumber numberWithUnsignedLongLong:2.0f];
>> +  [NSNumber numberWithUnsignedLongLong:2.0F];
>> +  [NSNumber numberWithUnsignedLongLong:2.0l];
>> +  [NSNumber numberWithUnsignedLongLong:2.0L];
>> +  @0x2fULL;
>> +  @04ULL;
>> +  @0ULL;
>> +  [NSNumber numberWithUnsignedLongLong:0.0];
>> +  [NSNumber numberWithUnsignedLongLong:YES];
>> +  [NSNumber numberWithUnsignedLongLong:NO];
>> +  [NSNumber numberWithUnsignedLongLong:true];
>> +  [NSNumber numberWithUnsignedLongLong:false];
>> +  [NSNumber numberWithUnsignedLongLong:VAL_INT];
>> +  [NSNumber numberWithUnsignedLongLong:VAL_UINT];
>> +
>> +  [NSNumber numberWithFloat:'a'];
>> +  [NSNumber numberWithFloat:L'a'];
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0f;
>> +  @2.0F;
>> +  @2.0f;
>> +  @2.0f;
>> +  [NSNumber numberWithFloat:0x2f];
>> +  [NSNumber numberWithFloat:04];
>> +  @0.0f;
>> +  @0.0f;
>> +  [NSNumber numberWithFloat:YES];
>> +  [NSNumber numberWithFloat:NO];
>> +  [NSNumber numberWithFloat:true];
>> +  [NSNumber numberWithFloat:false];
>> +  [NSNumber numberWithFloat:VAL_INT];
>> +  [NSNumber numberWithFloat:VAL_UINT];
>> +
>> +  [NSNumber numberWithDouble:'a'];
>> +  [NSNumber numberWithDouble:L'a'];
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  @2.0;
>> +  [NSNumber numberWithDouble:0x2f];
>> +  [NSNumber numberWithDouble:04];
>> +  @0.0;
>> +  @0.0;
>> +  [NSNumber numberWithDouble:YES];
>> +  [NSNumber numberWithDouble:NO];
>> +  [NSNumber numberWithDouble:true];
>> +  [NSNumber numberWithDouble:false];
>> +  [NSNumber numberWithDouble:VAL_INT];
>> +  [NSNumber numberWithDouble:VAL_UINT];
>> +
>> +  [NSNumber numberWithBool:'a'];
>> +  [NSNumber numberWithBool:L'a'];
>> +  [NSNumber numberWithBool:2];
>> +  [NSNumber numberWithBool:2U];
>> +  [NSNumber numberWithBool:2u];
>> +  [NSNumber numberWithBool:2L];
>> +  [NSNumber numberWithBool:2l];
>> +  [NSNumber numberWithBool:2LL];
>> +  [NSNumber numberWithBool:2ll];
>> +  [NSNumber numberWithBool:2ul];
>> +  [NSNumber numberWithBool:2lu];
>> +  [NSNumber numberWithBool:2ull];
>> +  [NSNumber numberWithBool:2llu];
>> +  [NSNumber numberWithBool:2.0];
>> +  [NSNumber numberWithBool:2.0f];
>> +  [NSNumber numberWithBool:2.0F];
>> +  [NSNumber numberWithBool:2.0l];
>> +  [NSNumber numberWithBool:2.0L];
>> +  [NSNumber numberWithBool:0x2f];
>> +  [NSNumber numberWithBool:04];
>> +  [NSNumber numberWithBool:0];
>> +  [NSNumber numberWithBool:0.0];
>> +  @YES;
>> +  @NO;
>> +  @true;
>> +  @false;
>> +  [NSNumber numberWithBool:VAL_INT];
>> +  [NSNumber numberWithBool:VAL_UINT];
>> +
>> +  [NSNumber numberWithInteger:'a'];
>> +  [NSNumber numberWithInteger:L'a'];
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2L;
>> +  @2l;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  @2;
>> +  [NSNumber numberWithInteger:2.0];
>> +  [NSNumber numberWithInteger:2.0f];
>> +  [NSNumber numberWithInteger:2.0F];
>> +  [NSNumber numberWithInteger:2.0l];
>> +  [NSNumber numberWithInteger:2.0L];
>> +  @0x2f;
>> +  @04;
>> +  @0;
>> +  [NSNumber numberWithInteger:0.0];
>> +  [NSNumber numberWithInteger:YES];
>> +  [NSNumber numberWithInteger:NO];
>> +  [NSNumber numberWithInteger:true];
>> +  [NSNumber numberWithInteger:false];
>> +  [NSNumber numberWithInteger:VAL_INT];
>> +  [NSNumber numberWithInteger:VAL_UINT];
>> +
>> +  [NSNumber numberWithUnsignedInteger:'a'];
>> +  [NSNumber numberWithUnsignedInteger:L'a'];
>> +  @2U;
>> +  @2U;
>> +  @2u;
>> +  @2U;
>> +  @2u;
>> +  @2U;
>> +  @2u;
>> +  @2ul;
>> +  @2lu;
>> +  @2u;
>> +  @2u;
>> +  [NSNumber numberWithUnsignedInteger:2.0];
>> +  [NSNumber numberWithUnsignedInteger:2.0f];
>> +  [NSNumber numberWithUnsignedInteger:2.0F];
>> +  [NSNumber numberWithUnsignedInteger:2.0l];
>> +  [NSNumber numberWithUnsignedInteger:2.0L];
>> +  @0x2fU;
>> +  @04U;
>> +  @0U;
>> +  [NSNumber numberWithUnsignedInteger:0.0];
>> +  [NSNumber numberWithUnsignedInteger:YES];
>> +  [NSNumber numberWithUnsignedInteger:NO];
>> +  [NSNumber numberWithUnsignedInteger:true];
>> +  [NSNumber numberWithUnsignedInteger:false];
>> +  [NSNumber numberWithUnsignedInteger:VAL_INT];
>> +  [NSNumber numberWithUnsignedInteger:VAL_UINT];
>> +}
>> 
>> Added: cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m (added)
>> +++ cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,137 @@
>> +// RUN: rm -rf %t
>> +// RUN: %clang_cc1 -objcmt-migrate-literals -objcmt-migrate-subscripting -mt-migrate-directory %t %s -x objective-c
>> +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> +
>> +typedef signed char BOOL;
>> +#define nil ((void*) 0)
>> +
>> + at interface NSObject
>> ++ (id)alloc;
>> + at end
>> +
>> + at interface NSString : NSObject
>> ++ (id)stringWithString:(NSString *)string;
>> +- (id)initWithString:(NSString *)aString;
>> + at end
>> +
>> + at interface NSArray : NSObject
>> +- (id)objectAtIndex:(unsigned long)index;
>> +- (id)objectAtIndexedSubscript:(int)index;
>> + at end
>> +
>> + at interface NSArray (NSArrayCreation)
>> ++ (id)array;
>> ++ (id)arrayWithObject:(id)anObject;
>> ++ (id)arrayWithObjects:(const id [])objects count:(unsigned long)cnt;
>> ++ (id)arrayWithObjects:(id)firstObj, ...;
>> ++ (id)arrayWithArray:(NSArray *)array;
>> +
>> +- (id)initWithObjects:(const id [])objects count:(unsigned long)cnt;
>> +- (id)initWithObjects:(id)firstObj, ...;
>> +- (id)initWithArray:(NSArray *)array;
>> +
>> +- (id)objectAtIndex:(unsigned long)index;
>> + at end
>> +
>> + at interface NSMutableArray : NSArray
>> +- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject;
>> +- (void)setObject:(id)object atIndexedSubscript:(int)index;
>> + at end
>> +
>> + at interface NSDictionary : NSObject
>> +- (id)objectForKeyedSubscript:(id)key;
>> + at end
>> +
>> + at interface NSDictionary (NSDictionaryCreation)
>> ++ (id)dictionary;
>> ++ (id)dictionaryWithObject:(id)object forKey:(id)key;
>> ++ (id)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
>> ++ (id)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
>> ++ (id)dictionaryWithDictionary:(NSDictionary *)dict;
>> ++ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
>> +
>> +- (id)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
>> +- (id)initWithObjectsAndKeys:(id)firstObject, ...;
>> +- (id)initWithDictionary:(NSDictionary *)otherDictionary;
>> +- (id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
>> +
>> +- (id)objectForKey:(id)aKey;
>> + at end
>> +
>> + at interface NSMutableDictionary : NSDictionary
>> +- (void)setObject:(id)anObject forKey:(id)aKey;
>> +- (void)setObject:(id)object forKeyedSubscript:(id)key;
>> + at end
>> +
>> + at interface NSNumber : NSObject
>> + at end
>> +
>> + at interface NSNumber (NSNumberCreation)
>> ++ (NSNumber *)numberWithInt:(int)value;
>> + at end
>> +
>> +#define M(x) (x)
>> +#define PAIR(x) @#x, [NSNumber numberWithInt:(x)]
>> +#define TWO(x) ((x), (x))
>> +
>> + at interface I
>> + at end
>> + at implementation I
>> +-(void) foo {
>> +  NSString *str;
>> +  NSArray *arr;
>> +  NSDictionary *dict;
>> +
>> +  arr = [NSArray array];
>> +  arr = [NSArray arrayWithObject:str];
>> +  arr = [NSArray arrayWithObjects:str, str, nil];
>> +  dict = [NSDictionary dictionary];
>> +  dict = [NSDictionary dictionaryWithObject:arr forKey:str];
>> +  dict = [NSDictionary dictionaryWithObjectsAndKeys: @"value1", @"key1", @"value2", @"key2", nil];
>> +  dict = [NSDictionary dictionaryWithObjectsAndKeys: PAIR(1), PAIR(2), nil];
>> +  dict = [NSDictionary dictionaryWithObjectsAndKeys:
>> +                                               @"value1", @"key1",
>> +#ifdef BLAH
>> +                                               @"value2", @"key2",
>> +#else
>> +                                               @"value3", @"key3",
>> +#endif
>> +                                               nil ];
>> +
>> +  id o = [arr objectAtIndex:2];
>> +  o = [dict objectForKey:@"key"];
>> +  o = TWO([dict objectForKey:@"key"]);
>> +  o = [NSDictionary dictionaryWithObject:[NSDictionary dictionary] forKey:@"key"];
>> +  NSMutableArray *marr = 0;
>> +  NSMutableDictionary *mdict = 0;
>> +  [marr replaceObjectAtIndex:2 withObject:@"val"];
>> +  [mdict setObject:@"value" forKey:@"key"];
>> +  [marr replaceObjectAtIndex:2 withObject:[arr objectAtIndex:4]];
>> +  [mdict setObject:[dict objectForKey:@"key2"] forKey:@"key"];
>> +  [mdict setObject:[dict objectForKey:@"key2"] forKey:
>> +#if 1
>> +                     @"key1"
>> +#else
>> +                     @"key2"
>> +#endif
>> +                    ];
>> +  [mdict setObject:[dict objectForKey:
>> +#if 2
>> +                     @"key3"
>> +#else
>> +                     @"key4"
>> +#endif
>> +                   ] forKey:@"key"];
>> +  [mdict setObject:@"value" forKey:[dict objectForKey:
>> +#if 3
>> +                     @"key5"
>> +#else
>> +                     @"key6"
>> +#endif
>> +                   ] ];
>> +  [mdict setObject:@"val" forKey:[dict objectForKey:@"key2"]];
>> +  [mdict setObject:[dict objectForKey:@"key1"] forKey:[dict objectForKey:[NSArray arrayWithObject:@"arrkey"]]];
>> +  __strong NSArray **parr = 0;
>> +  o = [*parr objectAtIndex:2];
>> +}
>> + at end
>> 
>> Added: cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result?rev=152141&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result (added)
>> +++ cfe/trunk/test/ARCMT/objcmt-subscripting-literals.m.result Tue Mar  6 14:06:33 2012
>> @@ -0,0 +1,137 @@
>> +// RUN: rm -rf %t
>> +// RUN: %clang_cc1 -objcmt-migrate-literals -objcmt-migrate-subscripting -mt-migrate-directory %t %s -x objective-c
>> +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> +
>> +typedef signed char BOOL;
>> +#define nil ((void*) 0)
>> +
>> + at interface NSObject
>> ++ (id)alloc;
>> + at end
>> +
>> + at interface NSString : NSObject
>> ++ (id)stringWithString:(NSString *)string;
>> +- (id)initWithString:(NSString *)aString;
>> + at end
>> +
>> + at interface NSArray : NSObject
>> +- (id)objectAtIndex:(unsigned long)index;
>> +- (id)objectAtIndexedSubscript:(int)index;
>> + at end
>> +
>> + at interface NSArray (NSArrayCreation)
>> ++ (id)array;
>> ++ (id)arrayWithObject:(id)anObject;
>> ++ (id)arrayWithObjects:(const id [])objects count:(unsigned long)cnt;
>> ++ (id)arrayWithObjects:(id)firstObj, ...;
>> ++ (id)arrayWithArray:(NSArray *)array;
>> +
>> +- (id)initWithObjects:(const id [])objects count:(unsigned long)cnt;
>> +- (id)initWithObjects:(id)firstObj, ...;
>> +- (id)initWithArray:(NSArray *)array;
>> +
>> +- (id)objectAtIndex:(unsigned long)index;
>> + at end
>> +
>> + at interface NSMutableArray : NSArray
>> +- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject;
>> +- (void)setObject:(id)object atIndexedSubscript:(int)index;
>> + at end
>> +
>> + at interface NSDictionary : NSObject
>> +- (id)objectForKeyedSubscript:(id)key;
>> + at end
>> +
>> + at interface NSDictionary (NSDictionaryCreation)
>> ++ (id)dictionary;
>> ++ (id)dictionaryWithObject:(id)object forKey:(id)key;
>> ++ (id)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
>> ++ (id)dictionaryWithObjectsAndKeys:(id)firstObject, ...;
>> ++ (id)dictionaryWithDictionary:(NSDictionary *)dict;
>> ++ (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
>> +
>> +- (id)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
>> +- (id)initWithObjectsAndKeys:(id)firstObject, ...;
>> +- (id)initWithDictionary:(NSDictionary *)otherDictionary;
>> +- (id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys;
>> +
>> +- (id)objectForKey:(id)aKey;
>> + at end
>> +
>> + at interface NSMutableDictionary : NSDictionary
>> +- (void)setObject:(id)anObject forKey:(id)aKey;
>> +- (void)setObject:(id)object forKeyedSubscript:(id)key;
>> + at end
>> +
>> + at interface NSNumber : NSObject
>> + at end
>> +
>> + at interface NSNumber (NSNumberCreation)
>> ++ (NSNumber *)numberWithInt:(int)value;
>> + at end
>> +
>> +#define M(x) (x)
>> +#define PAIR(x) @#x, [NSNumber numberWithInt:(x)]
>> +#define TWO(x) ((x), (x))
>> +
>> + at interface I
>> + at end
>> + at implementation I
>> +-(void) foo {
>> +  NSString *str;
>> +  NSArray *arr;
>> +  NSDictionary *dict;
>> +
>> +  arr = @[];
>> +  arr = @[str];
>> +  arr = @[str, str];
>> +  dict = @{};
>> +  dict = @{str: arr};
>> +  dict = @{@"key1": @"value1", @"key2": @"value2"};
>> +  dict = [NSDictionary dictionaryWithObjectsAndKeys: PAIR(1), PAIR(2), nil];
>> +  dict = [NSDictionary dictionaryWithObjectsAndKeys:
>> +                                               @"value1", @"key1",
>> +#ifdef BLAH
>> +                                               @"value2", @"key2",
>> +#else
>> +                                               @"value3", @"key3",
>> +#endif
>> +                                               nil ];
>> +
>> +  id o = arr[2];
>> +  o = dict[@"key"];
>> +  o = TWO(dict[@"key"]);
>> +  o = @{@"key": @{}};
>> +  NSMutableArray *marr = 0;
>> +  NSMutableDictionary *mdict = 0;
>> +  marr[2] = @"val";
>> +  mdict[@"key"] = @"value";
>> +  marr[2] = arr[4];
>> +  mdict[@"key"] = dict[@"key2"];
>> +  [mdict setObject:dict[@"key2"] forKey:
>> +#if 1
>> +                     @"key1"
>> +#else
>> +                     @"key2"
>> +#endif
>> +                    ];
>> +  mdict[@"key"] = [dict objectForKey:
>> +#if 2
>> +                     @"key3"
>> +#else
>> +                     @"key4"
>> +#endif
>> +                   ];
>> +  mdict[[dict objectForKey:
>> +#if 3
>> +                     @"key5"
>> +#else
>> +                     @"key6"
>> +#endif
>> +                   ]] = @"value";
>> +  mdict[dict[@"key2"]] = @"val";
>> +  mdict[dict[@[@"arrkey"]]] = dict[@"key1"];
>> +  __strong NSArray **parr = 0;
>> +  o = (*parr)[2];
>> +}
>> + at end
>> 
>> Modified: cfe/trunk/test/ARCMT/with-arc-mode-migrate.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/with-arc-mode-migrate.m?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/with-arc-mode-migrate.m (original)
>> +++ cfe/trunk/test/ARCMT/with-arc-mode-migrate.m Tue Mar  6 14:06:33 2012
>> @@ -1,7 +1,7 @@
>> // RUN: rm -rf %t
>> // RUN: %clang_cc1 -fsyntax-only -fobjc-arc -x objective-c %s.result
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t -fsyntax-only -fobjc-arc %s
>> -// RUN: c-arcmt-test -arcmt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t -fsyntax-only -fobjc-arc %s
>> +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> // RUN: rm -rf %t
>> 
>> @protocol NSObject
>> 
>> Modified: cfe/trunk/test/ARCMT/with-arc-mode-migrate.m.result
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/with-arc-mode-migrate.m.result?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/ARCMT/with-arc-mode-migrate.m.result (original)
>> +++ cfe/trunk/test/ARCMT/with-arc-mode-migrate.m.result Tue Mar  6 14:06:33 2012
>> @@ -1,7 +1,7 @@
>> // RUN: rm -rf %t
>> // RUN: %clang_cc1 -fsyntax-only -fobjc-arc -x objective-c %s.result
>> -// RUN: %clang_cc1 -arcmt-migrate -arcmt-migrate-directory %t -fsyntax-only -fobjc-arc %s
>> -// RUN: c-arcmt-test -arcmt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> +// RUN: %clang_cc1 -arcmt-migrate -mt-migrate-directory %t -fsyntax-only -fobjc-arc %s
>> +// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
>> // RUN: rm -rf %t
>> 
>> @protocol NSObject
>> 
>> Modified: cfe/trunk/tools/arcmt-test/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/arcmt-test/CMakeLists.txt?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/arcmt-test/CMakeLists.txt (original)
>> +++ cfe/trunk/tools/arcmt-test/CMakeLists.txt Tue Mar  6 14:06:33 2012
>> @@ -1,5 +1,6 @@
>> set(LLVM_USED_LIBS
>>   clangARCMigrate
>> +  clangEdit
>>   clangRewrite
>>   )
>> 
>> 
>> Modified: cfe/trunk/tools/arcmt-test/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/arcmt-test/Makefile?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/arcmt-test/Makefile (original)
>> +++ cfe/trunk/tools/arcmt-test/Makefile Tue Mar  6 14:06:33 2012
>> @@ -19,6 +19,6 @@
>> LINK_COMPONENTS := support mc
>> USEDLIBS = clangIndex.a clangARCMigrate.a clangRewrite.a \
>>                 clangFrontend.a clangDriver.a clangSerialization.a clangParse.a \
>> -                clangSema.a clangAnalysis.a clangAST.a clangLex.a clangBasic.a
>> +                clangSema.a clangEdit.a clangAnalysis.a clangAST.a clangLex.a clangBasic.a
>> 
>> include $(CLANG_LEVEL)/Makefile
>> 
>> Modified: cfe/trunk/tools/arcmt-test/arcmt-test.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/arcmt-test/arcmt-test.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/arcmt-test/arcmt-test.cpp (original)
>> +++ cfe/trunk/tools/arcmt-test/arcmt-test.cpp Tue Mar  6 14:06:33 2012
>> @@ -135,9 +135,8 @@
>> }
>> 
>> static void printResult(FileRemapper &remapper, raw_ostream &OS) {
>> -  CompilerInvocation CI;
>> -  remapper.applyMappings(CI);
>> -  PreprocessorOptions &PPOpts = CI.getPreprocessorOpts();
>> +  PreprocessorOptions PPOpts;
>> +  remapper.applyMappings(PPOpts);
>>   // The changed files will be in memory buffers, print them.
>>   for (unsigned i = 0, e = PPOpts.RemappedFileBuffers.size(); i != e; ++i) {
>>     const llvm::MemoryBuffer *mem = PPOpts.RemappedFileBuffers[i].second;
>> 
>> Modified: cfe/trunk/tools/c-arcmt-test/c-arcmt-test.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-arcmt-test/c-arcmt-test.c?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/c-arcmt-test/c-arcmt-test.c (original)
>> +++ cfe/trunk/tools/c-arcmt-test/c-arcmt-test.c Tue Mar  6 14:06:33 2012
>> @@ -34,22 +34,51 @@
>>   return 0;
>> }
>> 
>> +static int print_remappings_filelist(const char **files, unsigned numFiles) {
>> +  CXRemapping remap;
>> +  unsigned i, N;
>> +  CXString origFname;
>> +  CXString transFname;
>> +
>> +  remap = clang_getRemappingsFromFileList(files, numFiles);
>> +  if (!remap)
>> +    return 1;
>> +
>> +  N = clang_remap_getNumFiles(remap);
>> +  for (i = 0; i != N; ++i) {
>> +    clang_remap_getFilenames(remap, i, &origFname, &transFname);
>> +
>> +    fprintf(stdout, "%s\n", clang_getCString(origFname));
>> +    fprintf(stdout, "%s\n", clang_getCString(transFname));
>> +
>> +    clang_disposeString(origFname);
>> +    clang_disposeString(transFname);
>> +  }
>> +
>> +  clang_remap_dispose(remap);
>> +  return 0;
>> +}
>> +
>> /******************************************************************************/
>> /* Command line processing.                                                   */
>> /******************************************************************************/
>> 
>> static void print_usage(void) {
>>   fprintf(stderr,
>> -    "usage: c-arcmt-test -arcmt-migrate-directory <path>\n\n\n");
>> +    "usage: c-arcmt-test -mt-migrate-directory <path>\n"
>> +    "       c-arcmt-test <remap-file-path1> <remap-file-path2> ...\n\n\n");
>> }
>> 
>> /***/
>> 
>> int carcmttest_main(int argc, const char **argv) {
>>   clang_enableStackTraces();
>> -  if (argc == 3 && strncmp(argv[1], "-arcmt-migrate-directory", 24) == 0)
>> +  if (argc == 3 && strncmp(argv[1], "-mt-migrate-directory", 21) == 0)
>>     return print_remappings(argv[2]);
>> 
>> +  if (argc > 1)
>> +    return print_remappings_filelist(argv+1, argc-1);
>> +
>>   print_usage();
>>   return 1;
>> }
>> 
>> Modified: cfe/trunk/tools/driver/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/CMakeLists.txt?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/driver/CMakeLists.txt (original)
>> +++ cfe/trunk/tools/driver/CMakeLists.txt Tue Mar  6 14:06:33 2012
>> @@ -5,10 +5,12 @@
>>   clangBasic
>>   clangCodeGen
>>   clangDriver
>> +  clangEdit
>>   clangFrontend
>>   clangIndex
>>   clangLex
>>   clangParse
>> +  clangEdit
>>   clangARCMigrate
>>   clangRewrite
>>   clangSema
>> 
>> Modified: cfe/trunk/tools/driver/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/Makefile?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/driver/Makefile (original)
>> +++ cfe/trunk/tools/driver/Makefile Tue Mar  6 14:06:33 2012
>> @@ -36,7 +36,7 @@
>>            clangStaticAnalyzerFrontend.a clangStaticAnalyzerCheckers.a \
>>            clangStaticAnalyzerCore.a \
>>            clangAnalysis.a clangIndex.a clangARCMigrate.a clangRewrite.a \
>> -           clangAST.a clangLex.a clangBasic.a
>> +           clangEdit.a clangAST.a clangLex.a clangBasic.a
>> 
>> include $(CLANG_LEVEL)/Makefile
>> 
>> 
>> Modified: cfe/trunk/tools/libclang/ARCMigrate.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/ARCMigrate.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/ARCMigrate.cpp (original)
>> +++ cfe/trunk/tools/libclang/ARCMigrate.cpp Tue Mar  6 14:06:33 2012
>> @@ -74,6 +74,47 @@
>>   return remap.take();
>> }
>> 
>> +CXRemapping clang_getRemappingsFromFileList(const char **filePaths,
>> +                                            unsigned numFiles) {
>> +  bool Logging = ::getenv("LIBCLANG_LOGGING");
>> +
>> +  OwningPtr<Remap> remap(new Remap());
>> +
>> +  if (numFiles == 0) {
>> +    if (Logging)
>> +      llvm::errs() << "clang_getRemappingsFromFileList was called with "
>> +                      "numFiles=0\n";
>> +    return remap.take();
>> +  }
>> +
>> +  if (!filePaths) {
>> +    if (Logging)
>> +      llvm::errs() << "clang_getRemappingsFromFileList was called with "
>> +                      "NULL filePaths\n";
>> +    return 0;
>> +  }
>> +
>> +  TextDiagnosticBuffer diagBuffer;
>> +  SmallVector<StringRef, 32> Files;
>> +  for (unsigned i = 0; i != numFiles; ++i)
>> +    Files.push_back(filePaths[i]);
>> +
>> +  bool err = arcmt::getFileRemappingsFromFileList(remap->Vec, Files,
>> +                                                  &diagBuffer);
>> +
>> +  if (err) {
>> +    if (Logging) {
>> +      llvm::errs() << "Error by clang_getRemappingsFromFileList\n";
>> +      for (TextDiagnosticBuffer::const_iterator
>> +             I = diagBuffer.err_begin(), E = diagBuffer.err_end(); I != E; ++I)
>> +        llvm::errs() << I->second << '\n';
>> +    }
>> +    return remap.take();
>> +  }
>> +
>> +  return remap.take();
>> +}
>> +
>> unsigned clang_remap_getNumFiles(CXRemapping map) {
>>   return static_cast<Remap *>(map)->Vec.size();
>> 
>> 
>> Modified: cfe/trunk/tools/libclang/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CMakeLists.txt?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/CMakeLists.txt (original)
>> +++ cfe/trunk/tools/libclang/CMakeLists.txt Tue Mar  6 14:06:33 2012
>> @@ -6,6 +6,7 @@
>>   clangSerialization
>>   clangIndex
>>   clangSema
>> +  clangEdit
>>   clangAST
>>   clangLex
>>   clangBasic)
>> 
>> Modified: cfe/trunk/tools/libclang/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Makefile?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/Makefile (original)
>> +++ cfe/trunk/tools/libclang/Makefile Tue Mar  6 14:06:33 2012
>> @@ -18,7 +18,8 @@
>> LINK_COMPONENTS := support mc
>> USEDLIBS = clangARCMigrate.a clangRewrite.a clangFrontend.a clangDriver.a \
>>      clangSerialization.a \
>> -                clangParse.a clangSema.a clangAnalysis.a clangAST.a clangLex.a clangBasic.a
>> +                clangParse.a clangSema.a clangEdit.a clangAnalysis.a \
>> +                clangAST.a clangLex.a clangBasic.a
>> 
>> include $(CLANG_LEVEL)/Makefile
>> 
>> 
>> Modified: cfe/trunk/tools/libclang/libclang.exports
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/libclang/libclang.exports (original)
>> +++ cfe/trunk/tools/libclang/libclang.exports Tue Mar  6 14:06:33 2012
>> @@ -132,6 +132,7 @@
>> clang_getRangeEnd
>> clang_getRangeStart
>> clang_getRemappings
>> +clang_getRemappingsFromFileList
>> clang_getResultType
>> clang_getSpecializedCursorTemplate
>> clang_getSpellingLocation
>> 
>> Modified: cfe/trunk/unittests/Frontend/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Frontend/Makefile?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/unittests/Frontend/Makefile (original)
>> +++ cfe/trunk/unittests/Frontend/Makefile Tue Mar  6 14:06:33 2012
>> @@ -13,7 +13,7 @@
>> USEDLIBS = clangFrontendTool.a clangFrontend.a clangDriver.a \
>>            clangSerialization.a clangCodeGen.a clangParse.a clangSema.a \
>>            clangStaticAnalyzerCheckers.a clangStaticAnalyzerCore.a \
>> -           clangIndex.a clangARCMigrate.a clangRewrite.a \
>> +           clangIndex.a clangARCMigrate.a clangRewrite.a clangEdit.a \
>>            clangAnalysis.a clangAST.a clangLex.a clangBasic.a
>> 
>> include $(CLANG_LEVEL)/unittests/Makefile
>> 
>> Modified: cfe/trunk/unittests/Lex/LexerTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Lex/LexerTest.cpp?rev=152141&r1=152140&r2=152141&view=diff
>> ==============================================================================
>> --- cfe/trunk/unittests/Lex/LexerTest.cpp (original)
>> +++ cfe/trunk/unittests/Lex/LexerTest.cpp Tue Mar  6 14:06:33 2012
>> @@ -66,10 +66,10 @@
>>     "N(INN(val)) N(NOF1) N(NOF2) N(val)";
>> 
>>   MemoryBuffer *buf = MemoryBuffer::getMemBuffer(source);
>> -  SourceMgr.createMainFileIDForMemBuffer(buf);
>> +  FileID mainFileID = SourceMgr.createMainFileIDForMemBuffer(buf);
>> 
>>   VoidModuleLoader ModLoader;
>> -  HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts, &*Target);
>> +  HeaderSearch HeaderInfo(FileMgr, Diags, LangOpts, Target.getPtr());
>>   Preprocessor PP(Diags, LangOpts,
>>                   Target.getPtr(),
>>                   SourceMgr, HeaderInfo, ModLoader,
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list