| // Copyright 2017-2020 The Verible Authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #include "verilog/analysis/json_diagnostics.h" | |
| #include <string> | |
| #include <vector> | |
| #include "absl/strings/string_view.h" | |
| #include "common/analysis/file_analyzer.h" | |
| #include "common/strings/line_column_map.h" | |
| #include "verilog/analysis/verilog_analyzer.h" | |
| using nlohmann::json; | |
| using verible::AnalysisPhase; | |
| using verible::ErrorSeverity; | |
| using verible::LineColumnRange; | |
| namespace verilog { | |
| // Returns AnalysisPhase as JSON value. | |
| // Try not to change. External tools may use these values as a constant phase | |
| // IDs. | |
| static json analysis_phase_to_json(const verible::AnalysisPhase& phase) { | |
| switch (phase) { | |
| case verible::AnalysisPhase::kLexPhase: | |
| return "lex"; | |
| case verible::AnalysisPhase::kPreprocessPhase: | |
| return "preprocess"; | |
| case verible::AnalysisPhase::kParsePhase: | |
| return "parse"; | |
| default: | |
| return "unknown"; | |
| } | |
| } | |
| json GetLinterTokenErrorsAsJson(const verilog::VerilogAnalyzer* analyzer, | |
| size_t limit) { | |
| json syntax_errors = json::array(); | |
| const std::vector<verible::RejectedToken>& rejected_tokens = | |
| analyzer->GetRejectedTokens(); | |
| for (const auto& rejected_token : rejected_tokens) { | |
| json& error = syntax_errors.emplace_back(json::object()); | |
| analyzer->ExtractLinterTokenErrorDetail( | |
| rejected_token, | |
| [&error](const std::string& filename, LineColumnRange range, | |
| ErrorSeverity severity, AnalysisPhase phase, | |
| absl::string_view token_text, absl::string_view context_line, | |
| const std::string& message) { | |
| // TODO: should this do something different for severity = kWarning ? | |
| error["line"] = range.start.line; // NB: zero based index | |
| error["column"] = range.start.column; | |
| error["text"] = std::string(token_text); | |
| error["phase"] = analysis_phase_to_json(phase); | |
| if (!message.empty()) error["message"] = message; | |
| }); | |
| if (limit && --limit == 0) break; | |
| } | |
| return syntax_errors; | |
| } | |
| } // namespace verilog |