const line_maps *line_maps,
const html_generation_options &html_gen_opts);
+ void
+ set_main_input_filename (const char *name);
+
void on_report_diagnostic (const diagnostic_info &diagnostic,
diagnostic_t orig_diag_kind,
diagnostic_html_format_buffer *buffer);
std::unique_ptr<xml::document> m_document;
xml::element *m_head_element;
+ xml::element *m_title_element;
xml::element *m_diagnostics_element;
std::unique_ptr<xml::element> m_cur_diagnostic_element;
int m_next_diag_id; // for handing out unique IDs
m_line_maps (line_maps),
m_html_gen_opts (html_gen_opts),
m_head_element (nullptr),
+ m_title_element (nullptr),
m_diagnostics_element (nullptr),
m_next_diag_id (0)
{
m_head_element = xp.get_insertion_point ();
{
xml::auto_print_element title (xp, "title", true);
- xp.add_text ("Title goes here");
+ m_title_element = xp.get_insertion_point ();
}
if (m_html_gen_opts.m_css)
xp.add_raw (HTML_STYLE);
}
}
+void
+html_builder::set_main_input_filename (const char *name)
+{
+ gcc_assert (m_title_element);
+ if (name)
+ {
+ m_title_element->m_children.clear ();
+ m_title_element->add_text (name);
+ }
+}
+
/* Implementation of "on_report_diagnostic" for HTML output. */
void
diagnostic_output_format::dump (out, indent);
}
+ void
+ set_main_input_filename (const char *name) final override
+ {
+ m_builder.set_main_input_filename (name);
+ }
+
std::unique_ptr<diagnostic_per_format_buffer>
make_per_format_buffer () final override
{
line_table,
html_gen_opts);
sink->update_printer ();
+ sink->set_main_input_filename ("(main input filename)");
m_format = sink.get (); // borrowed
set_output_format (std::move (sink));
" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
" <head>\n"
- " <title>Title goes here</title>\n"
+ " <title>(main input filename)</title>\n"
" </head>\n"
" <body>\n"
" <div class=\"gcc-diagnostic-list\">\n"
sarif_builder (diagnostic_context &context,
pretty_printer &printer,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts);
~sarif_builder ();
return m_logical_loc_mgr;
}
+ void
+ set_main_input_filename (const char *name);
+
void on_report_diagnostic (const diagnostic_info &diagnostic,
diagnostic_t orig_diag_kind,
diagnostic_sarif_format_buffer *buffer);
sarif_builder::sarif_builder (diagnostic_context &context,
pretty_printer &printer,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts)
: m_context (context),
if (auto client_data_hooks = context.get_client_data_hooks ())
m_logical_loc_mgr = client_data_hooks->get_logical_location_manager ();
-
- /* Mark MAIN_INPUT_FILENAME_ as the artifact that the tool was
- instructed to scan.
- Only quote the contents if it gets referenced by physical locations,
- since otherwise the "no diagnostics" case would quote the main input
- file, and doing so noticeably bloated the output seen in analyzer
- integration testing (build directory went from 20G -> 21G). */
- if (main_input_filename_)
- get_or_create_artifact (main_input_filename_,
- diagnostic_artifact_role::analysis_target,
- false);
}
sarif_builder::~sarif_builder ()
return stack;
}
+void
+sarif_builder::set_main_input_filename (const char *name)
+{
+ /* Mark NAME as the artifact that the tool was instructed to scan.
+ Only quote the contents if it gets referenced by physical locations,
+ since otherwise the "no diagnostics" case would quote the main input
+ file, and doing so noticeably bloated the output seen in analyzer
+ integration testing (build directory went from 20G -> 21G). */
+ if (name)
+ get_or_create_artifact (name,
+ diagnostic_artifact_role::analysis_target,
+ false);
+}
+
/* Implementation of "on_report_diagnostic" for SARIF output. */
void
diagnostic_output_format::dump (out, indent);
}
+ void
+ set_main_input_filename (const char *name) final override
+ {
+ m_builder.set_main_input_filename (name);
+ }
+
std::unique_ptr<diagnostic_per_format_buffer>
make_per_format_buffer () final override
{
protected:
sarif_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts)
: diagnostic_output_format (context),
- m_builder (context, *get_printer (), line_maps, main_input_filename_,
+ m_builder (context, *get_printer (), line_maps,
std::move (serialization_format), sarif_gen_opts),
m_buffer (nullptr)
{}
public:
sarif_stream_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts,
FILE *stream)
- : sarif_output_format (context, line_maps, main_input_filename_,
+ : sarif_output_format (context, line_maps,
std::move (serialization_format), sarif_gen_opts),
m_stream (stream)
{
public:
sarif_file_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts,
diagnostic_output_file output_file)
- : sarif_output_format (context, line_maps, main_input_filename_,
+ : sarif_output_format (context, line_maps,
std::move (serialization_format), sarif_gen_opts),
m_output_file (std::move (output_file))
{
}
/* Populate CONTEXT in preparation for SARIF output (either to stderr, or
- to a file). */
+ to a file).
+ Return a reference to *FMT. */
-static void
+static diagnostic_output_format &
diagnostic_output_format_init_sarif (diagnostic_context &context,
std::unique_ptr<sarif_output_format> fmt)
{
+ gcc_assert (fmt);
+ diagnostic_output_format &out = *fmt;
+
fmt->update_printer ();
context.set_output_format (std::move (fmt));
+
+ return out;
}
-/* Populate CONTEXT in preparation for SARIF output to stderr. */
+/* Populate CONTEXT in preparation for SARIF output to stderr.
+ Return a reference to the new sink. */
-void
+diagnostic_output_format &
diagnostic_output_format_init_sarif_stderr (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
bool formatted)
{
gcc_assert (line_maps);
const sarif_generation_options sarif_gen_opts;
auto serialization
= std::make_unique<sarif_serialization_format_json> (formatted);
- diagnostic_output_format_init_sarif
+ return diagnostic_output_format_init_sarif
(context,
std::make_unique<sarif_stream_output_format> (context,
line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
stderr));
}
/* Populate CONTEXT in preparation for SARIF output to a file named
- BASE_FILE_NAME.sarif. */
+ BASE_FILE_NAME.sarif.
+ Return a reference to the new sink. */
-void
+diagnostic_output_format &
diagnostic_output_format_init_sarif_file (diagnostic_context &context,
line_maps *line_maps,
- const char *main_input_filename_,
bool formatted,
const char *base_file_name)
{
= std::make_unique<sarif_serialization_format_json> (formatted);
const sarif_generation_options sarif_gen_opts;
- diagnostic_output_format_init_sarif
+ return diagnostic_output_format_init_sarif
(context,
std::make_unique<sarif_file_output_format> (context,
line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
std::move (output_file)));
}
-/* Populate CONTEXT in preparation for SARIF output to STREAM. */
+/* Populate CONTEXT in preparation for SARIF output to STREAM.
+ Return a reference to the new sink. */
-void
+diagnostic_output_format &
diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
bool formatted,
FILE *stream)
{
const sarif_generation_options sarif_gen_opts;
auto serialization
= std::make_unique<sarif_serialization_format_json> (formatted);
- diagnostic_output_format_init_sarif
+ return diagnostic_output_format_init_sarif
(context,
std::make_unique<sarif_stream_output_format> (context,
line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
stream));
std::unique_ptr<diagnostic_output_format>
make_sarif_sink (diagnostic_context &context,
const line_maps &line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization,
const sarif_generation_options &sarif_gen_opts,
diagnostic_output_file output_file)
auto sink
= std::make_unique<sarif_file_output_format> (context,
&line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
std::move (output_file));
{
auto format = std::make_unique<buffered_output_format> (*this,
line_table,
- main_input_filename,
true,
sarif_gen_opts);
m_format = format.get (); // borrowed
diagnostic_output_format_init_sarif (*this, std::move (format));
+ m_format->set_main_input_filename (main_input_filename);
}
std::unique_ptr<sarif_log> flush_to_object ()
public:
buffered_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
bool formatted,
const sarif_generation_options &sarif_gen_opts)
- : sarif_output_format (context, line_maps, main_input_filename_,
+ : sarif_output_format (context, line_maps,
std::make_unique<sarif_serialization_format_json>
(formatted),
sarif_gen_opts)
test_diagnostic_context dc;
pretty_printer pp;
sarif_builder builder
- (dc, pp, line_table, "MAIN_INPUT_FILENAME",
+ (dc, pp, line_table,
std::make_unique<sarif_serialization_format_json> (true),
sarif_gen_opts);