]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/include/clang/Rewrite/FixItRewriter.h
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / include / clang / Rewrite / FixItRewriter.h
1 //===--- FixItRewriter.h - Fix-It Rewriter Diagnostic Client ----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This is a diagnostic client adaptor that performs rewrites as
11 // suggested by code modification hints attached to diagnostics. It
12 // then forwards any diagnostics to the adapted diagnostic client.
13 //
14 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_REWRITE_FIX_IT_REWRITER_H
16 #define LLVM_CLANG_REWRITE_FIX_IT_REWRITER_H
17
18 #include "clang/Basic/Diagnostic.h"
19 #include "clang/Basic/SourceLocation.h"
20 #include "clang/Rewrite/Rewriter.h"
21
22 namespace llvm { class raw_ostream; }
23
24 namespace clang {
25
26 class SourceManager;
27 class FileEntry;
28
29 class FixItOptions {
30 public:
31   virtual ~FixItOptions();
32
33   /// \brief This file is about to be rewritten. Return the name of the file
34   /// that is okay to write to.
35   virtual std::string RewriteFilename(const std::string &Filename) = 0;
36
37   /// \brief Whether to abort fixing a file when not all errors could be fixed.
38   bool FixWhatYouCan;
39 };
40
41 class FixItRewriter : public DiagnosticClient {
42   /// \brief The diagnostics machinery.
43   Diagnostic &Diags;
44
45   /// \brief The rewriter used to perform the various code
46   /// modifications.
47   Rewriter Rewrite;
48
49   /// \brief The diagnostic client that performs the actual formatting
50   /// of error messages.
51   DiagnosticClient *Client;
52
53   /// \brief Turn an input path into an output path. NULL implies overwriting
54   /// the original.
55   FixItOptions *FixItOpts;
56
57   /// \brief The number of rewriter failures.
58   unsigned NumFailures;
59
60 public:
61   typedef Rewriter::buffer_iterator iterator;
62
63   /// \brief Initialize a new fix-it rewriter.
64   FixItRewriter(Diagnostic &Diags, SourceManager &SourceMgr,
65                 const LangOptions &LangOpts, FixItOptions *FixItOpts);
66
67   /// \brief Destroy the fix-it rewriter.
68   ~FixItRewriter();
69
70   /// \brief Check whether there are modifications for a given file.
71   bool IsModified(FileID ID) const {
72     return Rewrite.getRewriteBufferFor(ID) != NULL;
73   }
74
75   // Iteration over files with changes.
76   iterator buffer_begin() { return Rewrite.buffer_begin(); }
77   iterator buffer_end() { return Rewrite.buffer_end(); }
78
79   /// \brief Write a single modified source file.
80   ///
81   /// \returns true if there was an error, false otherwise.
82   bool WriteFixedFile(FileID ID, llvm::raw_ostream &OS);
83
84   /// \brief Write the modified source files.
85   ///
86   /// \returns true if there was an error, false otherwise.
87   bool WriteFixedFiles();
88
89   /// IncludeInDiagnosticCounts - This method (whose default implementation
90   /// returns true) indicates whether the diagnostics handled by this
91   /// DiagnosticClient should be included in the number of diagnostics
92   /// reported by Diagnostic.
93   virtual bool IncludeInDiagnosticCounts() const;
94
95   /// HandleDiagnostic - Handle this diagnostic, reporting it to the user or
96   /// capturing it to a log as needed.
97   virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
98                                 const DiagnosticInfo &Info);
99
100   /// \brief Emit a diagnostic via the adapted diagnostic client.
101   void Diag(SourceLocation Loc, unsigned DiagID);
102 };
103
104 }
105
106 #endif // LLVM_CLANG_REWRITE_FIX_IT_REWRITER_H