12namespace ast_matchers {
14Diagnostics::ArgStream Diagnostics::pushContextFrame(
ContextType Type,
16 ContextStack.emplace_back();
17 ContextFrame& data = ContextStack.back();
20 return ArgStream(&data.Args);
24 StringRef MatcherName,
31 StringRef MatcherName,
35 Error->pushContextFrame(
CT_MatcherArg, MatcherRange) << ArgNumber
42 : Error(Error), BeginIndex(Error->Errors.size()) {}
46 if (BeginIndex < Error->Errors.size()) {
48 for (
size_t i = BeginIndex + 1, e = Error->Errors.size(); i < e; ++i) {
49 Dest.
Messages.push_back(Error->Errors[i].Messages[0]);
51 Error->Errors.resize(BeginIndex + 1);
57 Error->Errors.resize(BeginIndex);
61 Out->push_back(Arg.str());
67 Errors.emplace_back();
69 Last.ContextStack = ContextStack;
70 Last.Messages.emplace_back();
72 Last.Messages.back().Type = Error;
79 return "Error building matcher $0.";
81 return "Error parsing argument $0 for matcher $1.";
83 llvm_unreachable(
"Unknown ContextType value.");
89 return "Matcher not found: $0";
91 return "Incorrect argument count. (Expected = $0) != (Actual = $1)";
93 return "Incorrect type for arg $0. (Expected = $1) != (Actual = $2)";
95 return "Matcher does not support binding.";
98 return "Ambiguous matcher overload.";
100 return "Value not found: $0";
102 return "Unknown value '$1' for arg $0; did you mean '$2'";
104 return "Matcher not a node matcher: $0";
106 return "Matcher does not support with call.";
109 return "Error parsing string token: <$0>";
111 return "Error parsing matcher. Found token <$0> while looking for '('.";
113 return "Error parsing matcher. Found end-of-code while looking for ')'.";
115 return "Error parsing matcher. Found token <$0> while looking for ','.";
117 return "End of code found while looking for token.";
119 return "Input value is not a matcher expression.";
121 return "Invalid token <$0> found when looking for a value.";
123 return "Malformed bind() expression.";
125 return "Expected end of code.";
127 return "Error parsing numeric literal: <$0>";
129 return "Input value has unresolved overloaded type: $0";
131 return "Period not followed by valid chained call.";
133 return "Failed to build matcher: $0.";
138 llvm_unreachable(
"Unknown ErrorType value.");
143 llvm::raw_ostream &OS) {
144 while (!FormatString.empty()) {
145 std::pair<StringRef, StringRef> Pieces = FormatString.split(
"$");
146 OS << Pieces.first.str();
147 if (Pieces.second.empty())
break;
149 const char Next = Pieces.second.front();
150 FormatString = Pieces.second.drop_front();
151 if (Next >=
'0' && Next <=
'9') {
152 const unsigned Index = Next -
'0';
153 if (Index < Args.size()) {
156 OS <<
"<Argument_Not_Provided>";
163 llvm::raw_ostream &OS) {
164 if (
Range.Start.Line > 0 &&
Range.Start.Column > 0) {
165 OS <<
Range.Start.Line <<
":" <<
Range.Start.Column <<
": ";
170 llvm::raw_ostream &OS) {
177 const Twine Prefix, llvm::raw_ostream &OS) {
184 llvm::raw_ostream &OS) {
188 for (
size_t i = 0, e = Content.
Messages.size(); i != e; ++i) {
189 if (i != 0) OS <<
"\n";
191 "Candidate " + Twine(i + 1) +
": ", OS);
197 for (
size_t i = 0, e = Errors.size(); i != e; ++i) {
198 if (i != 0) OS <<
"\n";
205 llvm::raw_string_ostream OS(S);
211 for (
size_t i = 0, e = Errors.size(); i != e; ++i) {
212 if (i != 0) OS <<
"\n";
214 for (
size_t i = 0, e = Error.ContextStack.size(); i != e; ++i) {
224 llvm::raw_string_ostream OS(S);
Diagnostics class to manage error messages.
enum clang::format::@1291::AnnotatingParser::Context::@350 ContextType
The base class of the type hierarchy.
ArgStream & operator<<(const T &Arg)
Helper class to manage error messages.
void printToStream(llvm::raw_ostream &OS) const
Returns a simple string representation of each error.
ContextType
Parser context types.
ArgStream addError(SourceRange Range, ErrorType Error)
Add an error to the diagnostics.
ErrorType
All errors from the system.
@ ET_RegistryWrongArgType
@ ET_ParserOverloadedType
@ ET_ParserMalformedBindExpr
@ ET_RegistryValueNotFound
@ ET_ParserFailedToBuildMatcher
@ ET_RegistryMatcherNotFound
@ ET_RegistryUnknownEnumWithReplace
@ ET_RegistryNonNodeMatcher
@ ET_ParserMalformedChainedExpr
@ ET_RegistryWrongArgCount
@ ET_RegistryAmbiguousOverload
@ ET_RegistryMatcherNoWithSupport
void printToStreamFull(llvm::raw_ostream &OS) const
Returns the full string representation of each error.
std::string toStringFull() const
std::string toString() const
static void maybeAddLineAndColumn(SourceRange Range, llvm::raw_ostream &OS)
static StringRef errorTypeToFormatString(Diagnostics::ErrorType Type)
static StringRef contextTypeToFormatString(Diagnostics::ContextType Type)
static void formatErrorString(StringRef FormatString, ArrayRef< std::string > Args, llvm::raw_ostream &OS)
static void printContextFrameToStream(const Diagnostics::ContextFrame &Frame, llvm::raw_ostream &OS)
static void printMessageToStream(const Diagnostics::ErrorContent::Message &Message, const Twine Prefix, llvm::raw_ostream &OS)
static void printErrorContentToStream(const Diagnostics::ErrorContent &Content, llvm::raw_ostream &OS)
The JSON file list parser is used to communicate input to InstallAPI.
Information stored for one frame of the context.
std::vector< std::string > Args
MatcherArgEnum
About to recurse into parsing one argument for a matcher.
Context(ConstructMatcherEnum, Diagnostics *Error, StringRef MatcherName, SourceRange MatcherRange)
ConstructMatcherEnum
About to call the constructor for a matcher.
Information stored for each error found.
std::vector< Message > Messages
void revertErrors()
Revert all errors that happened within this context.
OverloadContext(Diagnostics *Error)