1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#ifndef JINJA2CPP_SRC_ERROR_HANDLING_H
#define JINJA2CPP_SRC_ERROR_HANDLING_H
#include "lexer.h"
#include <jinja2cpp/error_info.h>
#include <contrib/restricted/expected-lite/include/nonstd/expected.hpp>
#include <initializer_list>
#include <vector>
namespace jinja2
{
struct ParseError
{
ParseError() = default;
ParseError(ErrorCode code, Token tok)
: errorCode(code)
, errorToken(tok)
{}
ParseError(ErrorCode code, Token tok, std::initializer_list<Token> toks)
: errorCode(code)
, errorToken(tok)
, relatedTokens(toks)
{}
ParseError(const ParseError&) = default;
ParseError(ParseError&& other) noexcept(true)
: errorCode(std::move(other.errorCode))
, errorToken(std::move(other.errorToken))
, relatedTokens(std::move(other.relatedTokens))
{}
ParseError& operator =(const ParseError&) = default;
ParseError& operator =(ParseError&& error) noexcept
{
if (this == &error)
return *this;
std::swap(errorCode, error.errorCode);
std::swap(errorToken, error.errorToken);
std::swap(relatedTokens, error.relatedTokens);
return *this;
}
ErrorCode errorCode;
Token errorToken;
std::vector<Token> relatedTokens;
};
inline auto MakeParseError(ErrorCode code, Token tok)
{
return nonstd::make_unexpected(ParseError{code, tok});
}
inline auto MakeParseError(ErrorCode code, Token tok, std::initializer_list<Token> toks)
{
return nonstd::make_unexpected(ParseError{code, tok, toks});
}
} // namespace jinja2
#endif // JINJA2CPP_SRC_ERROR_HANDLING_H
|