NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
diag.cpp
Go to the documentation of this file.
1//#include "pch.h"
2
3#include "parser.h"
4#include "lexer.h"
5#include "builtin.h"
6
7#include <term.h>
8
9using namespace newlang;
10
12
13 /*
14 `llvm-config-16 --cxxflags` -std=c++17 -fexceptions -fcxx-exceptions
15 * -Wall
16 * -Wextra
17 * -Werror
18 *
19 * -Wfloat-equal
20 * -Wundef
21 * -Wcast-align
22 * -Wwrite-strings
23 * -Wmissing-declarations
24 * -Wredundant-decls
25 * -Wshadow
26 * -Woverloaded-virtual
27 * -Wno-trigraphs
28 * -Wno-invalid-source-encoding
29 * -Wno-error=unused-variable
30 * -Wno-error=unused-parameter
31 * -Wno-error=switch
32 *
33 * -fsanitize=undefined-trap
34 * -fsanitize-undefined-trap-on-error
35 *
36 * -gdwarf-4
37 *
38 * -Wno-undefined-var-template
39 * -Wno-switch
40 * -fvisibility=default
41 * -ggdb -O0
42
43 */
44
45 m_diag_stack.push_back({});
46
47 VERIFY(Register("-clang-Wall", State::flag));
48 VERIFY(Register("-clang-Wextra", State::flag));
49 VERIFY(Register("-clang-Werror", State::flag));
50
51 VERIFY(Register("-clang-fvisibility=default", State::flag)); // -fvisibility=default
52
53 VERIFY(Register("-clang-Wtrigraphs", State::ignored)); // -Wno-trigraphs
54 VERIFY(Register("-clang-Winvalid-source-encoding", State::ignored)); // -Wno-invalid-source-encoding
55
56 VERIFY(Register("-clang-Wfloat-equal", State::warning));
57 VERIFY(Register("-clang-Wundef", State::warning));
58 VERIFY(Register("-clang-Wcast-align", State::warning));
59 VERIFY(Register("-clang-Wwrite-strings", State::warning));
60 VERIFY(Register("-clang-Wmissing-declarations", State::warning));
61 VERIFY(Register("-clang-Wredundant-decls", State::warning));
62 VERIFY(Register("-clang-Wshadow", State::warning));
63 VERIFY(Register("-clang-Woverloaded-virtual", State::warning));
64
65
66 VERIFY(Register("-clang-fsanitize=undefined", State::flag));
67 VERIFY(Register("-clang-fsanitize-trap=undefined", State::flag));
68
69
70 VERIFY(Register("-clang-Wunused-variable", State::warning)); // -Wno-error=unused-variable
71 VERIFY(Register("-clang-Wunused-parameter", State::warning)); // -Wno-error=unused-parameter
72 // VERIFY(Register("-clang-Wswitch", State::warning)); // -Wno-error=switch
73
74 VERIFY(Register("-clang-Wundefined-var-template", State::ignored)); // -Wno-undefined-var-template
75 VERIFY(Register("-clang-Wswitch", State::ignored)); // -Wno-switch
76
77 // VERIFY(Register("-clang-gdwarf-4", State::flag));
78 // VERIFY(Register("-clang-ggdb", State::flag));
79 // VERIFY(Register("-clang-O0", State::flag));
80
81 VERIFY(Register(DIAG_MACRO_NOT_FOUND, State::error, "Macro not found!"));
82 VERIFY(Register(DIAG_MACRO_STORAGE_NOT_EXIST, State::error, "Strorage for macro not exists!"));
83 VERIFY(Register(DIAG_FILL_REMAINDER, State::error, "The data is filled in with the remainder!"));
84
85
86
89
90 m_error_limit = 10;
91 m_error_count = 0;
92 m_fill_remainder = true;
93}
94
95bool Diag::Register(const char *name, State state, const char * desc) {
96 ASSERT(name);
97 ASSERT(state != State::none);
98 ASSERT(!m_diag_stack.empty());
99 if (Test(name) == State::none) {
100 m_diag_stack[0].push_back({name, state, desc});
101 return true;
102 }
103 return false;
104}
105
106std::string Diag::ChangeState(const std::string name, State from_state, State to_state) {
107
108 std::string result;
109 if (from_state == State::flag) {
110 return name;
111 } else if (from_state == State::option) {
112 if (to_state == State::ignored) {
113 result = "-Wno-";
114 result += RemoveDiagPrefix(name);
115 } else {
116 result = name;
117 }
118 } else { // for diags only
119 result = RemoveDiagPrefix(name);
120 if (to_state == State::ignored) {
121 result = result.insert(0, "-Wno-");
122 } else if (to_state == State::warning) {
123 result = result.insert(0, "-Wno-error=");
124 } else if (to_state == State::error) {
125 result = result.insert(0, "-Werror=");
126 } else {
127 result = result.insert(0, "-W");
128 }
129 }
130 return result;
131}
132
133void Diag::Push(const TermPtr term) {
134 ASSERT(!m_diag_stack.empty());
135 m_diag_stack.push_back(m_diag_stack[m_diag_stack.size() - 1]);
136}
137
138void Diag::Pop(const TermPtr term) {
139 if (m_diag_stack.empty()) {
140 if (term) {
141 NL_PARSER(term, "Empty stack diags at '%s'!", term->toString().c_str());
142 } else {
143 LOG_RUNTIME("Empty stack diags!");
144 }
145 }
146 m_diag_stack.pop_back();
147}
148
149bool Diag::Apply(const char *name, State state, const TermPtr term) {
150 if (term) {
151 NL_PARSER(term, "Empty stack diags at '%s'!", term->toString().c_str());
152 } else {
153 LOG_RUNTIME("Empty stack diags!");
154 }
155 return false;
156}
157
158Diag::State Diag::Test(const char *name) {
159 ASSERT(m_diag_stack.size());
160 size_t top = m_diag_stack.size() - 1;
161 for (int pos = 0; pos < m_diag_stack[top].size(); pos++) {
162 if (m_diag_stack[top][pos].Name.compare(name) == 0) {
163 return m_diag_stack[top][pos].State;
164 }
165 }
166 // LOG_RUNTIME("Diag name '%s' not found!", name);
167 return State::none;
168}
169
170bool Diag::TestIgnore(const char *name) {
171 State st = Test(name);
172 return st == State::none || st == State::ignored;
173}
174
175bool Diag::Emit(const char *name, const TermPtr term) {
176 switch (Test(name)) {
178 if (term) {
179 NL_PARSER(term, "Emit %s near at '%s'!", name, term->toString().c_str());
180 } else {
181 LOG_RUNTIME("Emit %s!", name);
182 }
184 if (term) {
185 NL_MESSAGE(LOG_LEVEL_WARNING, term, "Emit %s near at '%s'!", name, term->toString().c_str());
186 } else {
187 LOG_WARNING("Emit %s!", name);
188 }
191 return false;
192 }
193 return true;
194}
195
196
197//void Diag::Diag(const TermPtr &term, DiagName id) {
198//
199// const char *message = DiagNameString(id);
200// if(!message) {
201// LOG_RUNTIME("DiagName '%d' not found!", static_cast<int> (id));
202// }
203// ASSERT(!m_diags.empty());
204//
205// DiagMapType::iterator iter = m_diags[m_diags.size() - 1].find();
206//
207// const char *message = DiagNameString(id);
208// if(!message) {
209// LOG_RUNTIME("DiagName '%d' not found!", static_cast<int> (id));
210// }
211//
212// std::string empty;
213// std::string str = newlang::ParserMessage(term->m_source ? *term->m_source : empty, term->m_line, term->m_col, "%s", message);
214//
215// Logger::LogLevelType save = Logger::Instance()->GetLogLevel();
216// Logger::Instance()->SetLogLevel(LOG_LEVEL_INFO);
217// if() {
218// }
219// LOG_INFO("%s", str.c_str());
220// Logger::Instance()->SetLogLevel(save);
221//}
222
static std::string RemoveDiagPrefix(const std::string name)
Definition diag.h:100
bool TestIgnore(const char *name)
Definition diag.cpp:170
void Push(const TermPtr term=nullptr)
Definition diag.cpp:133
bool Apply(const char *name, State state, const TermPtr term=nullptr)
Definition diag.cpp:149
void Pop(const TermPtr term=nullptr)
Definition diag.cpp:138
static const char * DIAG_MACRO_NOT_FOUND
Definition diag.h:74
Diag::State Test(const char *name)
Definition diag.cpp:158
bool Emit(const char *name, const TermPtr term=nullptr)
Definition diag.cpp:175
bool Register(const char *name, State state, const char *desc=nullptr)
Definition diag.cpp:95
static const char * DIAG_MACRO_STORAGE_NOT_EXIST
Definition diag.h:75
static const char * DIAG_EXTRA_TOKENS
Definition diag.h:77
bool m_fill_remainder
Definition diag.h:197
static const char * DIAG_FILL_REMAINDER
Definition diag.h:78
int m_error_limit
Definition diag.h:195
static std::string ChangeState(const std::string name, State from_state, State to_state)
Definition diag.cpp:106
DiagStackType m_diag_stack
Definition diag.h:193
int m_error_count
Definition diag.h:196
static const char * DIAG_ERROR_LIMIT
Definition diag.h:76
int result
Definition lexer.l:367
#define LOG_RUNTIME(format,...)
Definition logger.h:26
#define VERIFY(exp)
Definition logger.h:65
#define ASSERT(condition)
Definition logger.h:60
#define LOG_LEVEL_WARNING
Definition logger.h:88
#define LOG_WARNING(...)
Definition logger.h:121
Definition nlc.h:59
std::shared_ptr< Term > TermPtr
Definition variable.h:33
#define NL_PARSER(term, format,...)
Definition types.h:310
#define NL_MESSAGE(level, term, format,...)
Definition types.h:318