1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- VerifyDiagnosticConsumer.h - Verifying Diagnostic Client -*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CLANG_FRONTEND_VERIFYDIAGNOSTICCONSUMER_H 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CLANG_FRONTEND_VERIFYDIAGNOSTICCONSUMER_H 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/Diagnostic.h" 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Lex/Preprocessor.h" 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/DenseMap.h" 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/PointerIntPair.h" 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/STLExtras.h" 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <climits> 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <memory> 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace clang { 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass DiagnosticsEngine; 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TextDiagnosticBuffer; 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FileEntry; 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// VerifyDiagnosticConsumer - Create a diagnostic client which will use 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// markers in the input source to check that all the emitted diagnostics match 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// those expected. 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// USING THE DIAGNOSTIC CHECKER: 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Indicating that a line expects an error or a warning is simple. Put a 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// comment on the line that has the diagnostic, use: 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// expected-{error,warning,remark,note} 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// to tag if it's an expected error, remark or warning, and place the expected 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// text between {{ and }} markers. The full text doesn't have to be included, 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// only enough to ensure that the correct diagnostic was emitted. 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Here's an example: 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// int A = B; // expected-error {{use of undeclared identifier 'B'}} 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// You can place as many diagnostics on one line as you wish. To make the code 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// more readable, you can use slash-newline to separate out the diagnostics. 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Alternatively, it is possible to specify the line on which the diagnostic 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// should appear by appending "@<line>" to "expected-<type>", for example: 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// #warning some text 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-warning@10 {{some text}} 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// The line number may be absolute (as above), or relative to the current 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// line by prefixing the number with either '+' or '-'. 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// If the diagnostic is generated in a separate file, for example in a shared 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// header file, it may be beneficial to be able to declare the file in which 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the diagnostic will appear, rather than placing the expected-* directive in 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the actual file itself. This can be done using the following syntax: 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-error@path/include.h:15 {{error message}} 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// The path can be absolute or relative and the same search paths will be used 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// as for #include directives. The line number in an external file may be 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// substituted with '*' meaning that any line number will match (useful where 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the included file is, for example, a system header where the actual line 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// number may change and is not critical). 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// The simple syntax above allows each specification to match exactly one 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// error. You can use the extended syntax to customize this. The extended 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// syntax is "expected-<type> <n> {{diag text}}", where \<type> is one of 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// "error", "warning" or "note", and \<n> is a positive integer. This allows 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the diagnostic to appear as many times as specified. Example: 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// void f(); // expected-note 2 {{previous declaration is here}} 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Where the diagnostic is expected to occur a minimum number of times, this 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// can be specified by appending a '+' to the number. Example: 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// void f(); // expected-note 0+ {{previous declaration is here}} 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// void g(); // expected-note 1+ {{previous declaration is here}} 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// In the first example, the diagnostic becomes optional, i.e. it will be 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// swallowed if it occurs, but will not generate an error if it does not 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// occur. In the second example, the diagnostic must occur at least once. 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// As a short-hand, "one or more" can be specified simply by '+'. Example: 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// void g(); // expected-note + {{previous declaration is here}} 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// A range can also be specified by "<n>-<m>". Example: 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// void f(); // expected-note 0-1 {{previous declaration is here}} 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// In this example, the diagnostic may appear only once, if at all. 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Regex matching mode may be selected by appending '-re' to type and 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// including regexes wrapped in double curly braces in the directive, such as: 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// expected-error-re {{format specifies type 'wchar_t **' (aka '{{.+}}')}} 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Examples matching error: "variable has incomplete type 'struct s'" 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-error {{variable has incomplete type 'struct s'}} 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-error {{variable has incomplete type}} 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-error-re {{variable has type 'struct {{.}}'}} 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-error-re {{variable has type 'struct {{.*}}'}} 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-error-re {{variable has type 'struct {{(.*)}}'}} 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-error-re {{variable has type 'struct{{[[:space:]](.*)}}'}} 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// VerifyDiagnosticConsumer expects at least one expected-* directive to 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// be found inside the source code. If no diagnostics are expected the 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// following directive can be used to indicate this: 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \code 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// // expected-no-diagnostics 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \endcode 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VerifyDiagnosticConsumer: public DiagnosticConsumer, 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public CommentHandler { 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Directive - Abstract class representing a parsed verify directive. 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class Directive { 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static std::unique_ptr<Directive> create(bool RegexKind, 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceLocation DirectiveLoc, 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceLocation DiagnosticLoc, 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool MatchAnyLine, StringRef Text, 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Min, unsigned Max); 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Constant representing n or more matches. 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static const unsigned MaxCount = UINT_MAX; 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceLocation DirectiveLoc; 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceLocation DiagnosticLoc; 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::string Text; 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Min, Max; 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool MatchAnyLine; 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual ~Directive() { } 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Returns true if directive text is valid. 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Otherwise returns false and populates E. 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual bool isValid(std::string &Error) = 0; 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Returns true on match. 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot virtual bool match(StringRef S) = 0; 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot protected: 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Directive(SourceLocation DirectiveLoc, SourceLocation DiagnosticLoc, 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool MatchAnyLine, StringRef Text, unsigned Min, unsigned Max) 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : DirectiveLoc(DirectiveLoc), DiagnosticLoc(DiagnosticLoc), 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Text(Text), Min(Min), Max(Max), MatchAnyLine(MatchAnyLine) { 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(!DirectiveLoc.isInvalid() && "DirectiveLoc is invalid!"); 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((!DiagnosticLoc.isInvalid() || MatchAnyLine) && 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "DiagnosticLoc is invalid!"); 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot private: 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Directive(const Directive &) = delete; 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void operator=(const Directive &) = delete; 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef std::vector<std::unique_ptr<Directive>> DirectiveList; 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ExpectedData - owns directive objects and deletes on destructor. 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct ExpectedData { 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DirectiveList Errors; 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DirectiveList Warnings; 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DirectiveList Remarks; 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DirectiveList Notes; 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void Reset() { 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Errors.clear(); 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Warnings.clear(); 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Remarks.clear(); 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Notes.clear(); 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum DirectiveStatus { 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasNoDirectives, 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasNoDirectivesReported, 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasExpectedNoDiagnostics, 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasOtherExpectedDirectives 211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DiagnosticsEngine &Diags; 215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DiagnosticConsumer *PrimaryClient; 216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<DiagnosticConsumer> PrimaryClientOwner; 217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<TextDiagnosticBuffer> Buffer; 218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Preprocessor *CurrentPreprocessor; 219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const LangOptions *LangOpts; 220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SourceManager *SrcManager; 221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned ActiveSourceFiles; 222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DirectiveStatus Status; 223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ExpectedData ED; 224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void CheckDiagnostics(); 226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSourceManager(SourceManager &SM) { 227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((!SrcManager || SrcManager == &SM) && "SourceManager changed!"); 228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SrcManager = &SM; 229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // These facilities are used for validation in debug builds. 232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class UnparsedFileStatus { 233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::PointerIntPair<const FileEntry *, 1, bool> Data; 234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot UnparsedFileStatus(const FileEntry *File, bool FoundDirectives) 236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Data(File, FoundDirectives) {} 237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const FileEntry *getFile() const { return Data.getPointer(); } 238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool foundDirectives() const { return Data.getInt(); } 239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef llvm::DenseMap<FileID, const FileEntry *> ParsedFilesMap; 241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot typedef llvm::DenseMap<FileID, UnparsedFileStatus> UnparsedFilesMap; 242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ParsedFilesMap ParsedFiles; 243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot UnparsedFilesMap UnparsedFiles; 244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Create a new verifying diagnostic client, which will issue errors to 247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the currently-attached diagnostic client when a diagnostic does not match 248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// what is expected (as indicated in the source file). 249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot VerifyDiagnosticConsumer(DiagnosticsEngine &Diags); 250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ~VerifyDiagnosticConsumer() override; 251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void BeginSourceFile(const LangOptions &LangOpts, 253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Preprocessor *PP) override; 254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void EndSourceFile() override; 256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum ParsedStatus { 258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// File has been processed via HandleComment. 259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsParsed, 260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// File has diagnostics and may have directives. 262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsUnparsed, 263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// File has diagnostics but guaranteed no directives. 265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsUnparsedNoDirectives 266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Update lists of parsed and unparsed files. 269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void UpdateParsedFileStatus(SourceManager &SM, FileID FID, ParsedStatus PS); 270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool HandleComment(Preprocessor &PP, SourceRange Comment) override; 272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, 274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const Diagnostic &Info) override; 275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namspace clang 278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif 280