blob: 1d399a3039e808680056fc20ecc11e742f9fd7b3 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fidl/findings_json.h"
namespace fidl {
void FindingsJson::Generate(const Finding& finding) {
GenerateObject([&]() {
GenerateObjectMember("category", "fidl-lint/" + finding.subcategory(), Position::kFirst);
GenerateObjectMember("message", finding.message());
// TODO(FIDL-668) Add "url" to related FIDL documentation, per Tricium spec
Generate(finding.span());
std::vector<SuggestionWithReplacementSpan> suggestions;
if (finding.suggestion().has_value()) {
suggestions.emplace_back(
SuggestionWithReplacementSpan{finding.span(), finding.suggestion().value()});
}
GenerateObjectMember("suggestions", suggestions);
});
}
void FindingsJson::Generate(const SuggestionWithReplacementSpan& suggestion_with_span) {
auto& suggestion = suggestion_with_span.suggestion;
auto& span = suggestion_with_span.span;
GenerateObject([&]() {
GenerateObjectMember("description", suggestion.description(), Position::kFirst);
std::vector<Replacement> replacements;
if (suggestion.replacement().has_value()) {
replacements.emplace_back(Replacement{span, suggestion.replacement().value()});
}
GenerateObjectMember("replacements", replacements);
});
}
void FindingsJson::Generate(const Replacement& replacement) {
GenerateObject([&]() {
GenerateObjectMember("replacement", replacement.replacement, Position::kFirst);
Generate(replacement.span);
});
}
void FindingsJson::Generate(const SourceSpan& span) {
GenerateObjectMember("path", span.source_file().filename());
auto start = span.data();
auto end = span.data();
end.remove_prefix(start.size());
auto end_span = SourceSpan(end, span.source_file());
SourceFile::Position start_position = span.position();
SourceFile::Position end_position = end_span.position();
GenerateObjectMember("start_line", static_cast<uint32_t>(start_position.line));
GenerateObjectMember("start_char", static_cast<uint32_t>(start_position.column - 1));
GenerateObjectMember("end_line", static_cast<uint32_t>(end_position.line));
GenerateObjectMember("end_char", static_cast<uint32_t>(end_position.column - 1));
}
std::ostringstream FindingsJson::Produce() {
ResetIndentLevel();
GenerateArray(findings_);
return std::move(json_file_);
}
} // namespace fidl