const line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version);
+ const sarif_generation_options &sarif_gen_opts);
~sarif_builder ();
void set_printer (pretty_printer &printer)
diagnostic_context &get_context () const { return m_context; }
pretty_printer *get_printer () const { return m_printer; }
token_printer &get_token_printer () { return m_token_printer; }
- enum sarif_version get_version () const { return m_version; }
+ enum sarif_version get_version () const { return m_sarif_gen_opts.m_version; }
size_t num_results () const { return m_results_array->size (); }
sarif_result &get_result (size_t idx)
return *static_cast<sarif_result *> (element);
}
+ const sarif_generation_options &get_opts () const { return m_sarif_gen_opts; }
+
private:
class sarif_token_printer : public token_printer
{
pretty_printer *m_printer;
const line_maps *m_line_maps;
sarif_token_printer m_token_printer;
- enum sarif_version m_version;
/* The JSON object for the invocation object. */
std::unique_ptr<sarif_invocation> m_invocation_obj;
int m_tabstop;
bool m_formatted;
+ const sarif_generation_options m_sarif_gen_opts;
unsigned m_next_result_idx;
sarif_code_flow *m_current_code_flow;
const line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version)
+ const sarif_generation_options &sarif_gen_opts)
: m_context (context),
m_printer (&printer),
m_line_maps (line_maps),
m_token_printer (*this),
- m_version (version),
m_invocation_obj
(::make_unique<sarif_invocation> (*this,
context.get_original_argv ())),
m_rules_arr (new json::array ()),
m_tabstop (context.m_tabstop),
m_formatted (formatted),
+ m_sarif_gen_opts (sarif_gen_opts),
m_next_result_idx (0),
m_current_code_flow (nullptr)
{
auto log_obj = ::make_unique<sarif_log> ();
/* "$schema" property (SARIF v2.1.0 section 3.13.3) . */
- log_obj->set_string ("$schema", sarif_version_to_url (m_version));
+ log_obj->set_string ("$schema", sarif_version_to_url (get_version ()));
/* "version" property (SARIF v2.1.0 section 3.13.2). */
- log_obj->set_string ("version", sarif_version_to_property (m_version));
+ log_obj->set_string ("version", sarif_version_to_property (get_version ()));
/* "runs" property (SARIF v2.1.0 section 3.13.4). */
auto run_arr = ::make_unique<json::array> ();
const line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version)
+ const sarif_generation_options &sarif_gen_opts)
: diagnostic_output_format (context),
m_builder (context, *get_printer (), line_maps, main_input_filename_,
- formatted, version),
+ formatted, sarif_gen_opts),
m_buffer (nullptr)
{}
const line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version,
+ const sarif_generation_options &sarif_gen_opts,
FILE *stream)
: sarif_output_format (context, line_maps, main_input_filename_,
- formatted, version),
+ formatted,
+ sarif_gen_opts),
m_stream (stream)
{
}
const line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version,
+ const sarif_generation_options &sarif_gen_opts,
diagnostic_output_file output_file)
: sarif_output_format (context, line_maps, main_input_filename_,
- formatted, version),
+ formatted, sarif_gen_opts),
m_output_file (std::move (output_file))
{
gcc_assert (m_output_file.get_open_file ());
diagnostic_output_format_init_sarif_stderr (diagnostic_context &context,
const line_maps *line_maps,
const char *main_input_filename_,
- bool formatted,
- enum sarif_version version)
+ bool formatted)
{
gcc_assert (line_maps);
+ const sarif_generation_options sarif_gen_opts;
diagnostic_output_format_init_sarif
(context,
::make_unique<sarif_stream_output_format> (context,
line_maps,
main_input_filename_,
formatted,
- version,
+ sarif_gen_opts,
stderr));
}
line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version,
const char *base_file_name)
{
gcc_assert (line_maps);
line_maps,
base_file_name);
+ const sarif_generation_options sarif_gen_opts;
diagnostic_output_format_init_sarif
(context,
::make_unique<sarif_file_output_format> (context,
line_maps,
main_input_filename_,
formatted,
- version,
+ sarif_gen_opts,
std::move (output_file)));
}
const line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version,
FILE *stream)
{
gcc_assert (line_maps);
+ const sarif_generation_options sarif_gen_opts;
diagnostic_output_format_init_sarif
(context,
::make_unique<sarif_stream_output_format> (context,
line_maps,
main_input_filename_,
formatted,
- version,
+ sarif_gen_opts,
stream));
}
make_sarif_sink (diagnostic_context &context,
const line_maps &line_maps,
const char *main_input_filename_,
- enum sarif_version version,
+ bool formatted,
+ const sarif_generation_options &sarif_gen_opts,
diagnostic_output_file output_file)
{
auto sink = ::make_unique<sarif_file_output_format> (context,
&line_maps,
main_input_filename_,
- true,
- version,
+ formatted,
+ sarif_gen_opts,
std::move (output_file));
sink->update_printer ();
return sink;
}
+// struct sarif_generation_options
+
+sarif_generation_options::sarif_generation_options ()
+: m_version (sarif_version::v2_1_0)
+{
+}
+
#if CHECKING_P
namespace selftest {
{
public:
test_sarif_diagnostic_context (const char *main_input_filename,
- enum sarif_version version)
+ const sarif_generation_options &sarif_gen_opts)
{
auto format = ::make_unique<buffered_output_format> (*this,
line_table,
main_input_filename,
true,
- version);
+ sarif_gen_opts);
m_format = format.get (); // borrowed
diagnostic_output_format_init_sarif (*this, std::move (format));
}
const line_maps *line_maps,
const char *main_input_filename_,
bool formatted,
- enum sarif_version version)
+ const sarif_generation_options &sarif_gen_opts)
: sarif_output_format (context, line_maps, main_input_filename_,
- formatted, version)
+ formatted, sarif_gen_opts)
{
}
bool machine_readable_stderr_p () const final override
with labels and escape-on-output. */
static void
-test_make_location_object (const line_table_case &case_,
- enum sarif_version version)
+test_make_location_object (const sarif_generation_options &sarif_gen_opts,
+ const line_table_case &case_)
{
diagnostic_show_locus_fixture_one_liner_utf8 f (case_);
location_t line_end = linemap_position_for_column (line_table, 31);
test_diagnostic_context dc;
pretty_printer pp;
sarif_builder builder (dc, pp, line_table, "MAIN_INPUT_FILENAME",
- true, version);
+ true, sarif_gen_opts);
/* These "columns" are byte offsets, whereas later on the columns
in the generated SARIF use sarif_builder::get_sarif_column and
Verify various basic properties. */
static void
-test_simple_log (enum sarif_version version)
+test_simple_log (const sarif_generation_options &sarif_gen_opts)
{
- test_sarif_diagnostic_context dc ("MAIN_INPUT_FILENAME", version);
+ test_sarif_diagnostic_context dc ("MAIN_INPUT_FILENAME", sarif_gen_opts);
rich_location richloc (line_table, UNKNOWN_LOCATION);
dc.report (DK_ERROR, richloc, nullptr, 0, "this is a test: %i", 42);
// 3.13 sarifLog:
auto log = log_ptr.get ();
+ const enum sarif_version version = sarif_gen_opts.m_version;
ASSERT_JSON_STRING_PROPERTY_EQ (log, "$schema",
sarif_version_to_url (version));
ASSERT_JSON_STRING_PROPERTY_EQ (log, "version",
/* As above, but with a "real" location_t. */
static void
-test_simple_log_2 (const line_table_case &case_,
- enum sarif_version version)
+test_simple_log_2 (const sarif_generation_options &sarif_gen_opts,
+ const line_table_case &case_)
{
auto_fix_quotes fix_quotes;
if (line_end > LINE_MAP_MAX_LOCATION_WITH_COLS)
return;
- test_sarif_diagnostic_context dc (f.get_filename (), version);
+ test_sarif_diagnostic_context dc (f.get_filename (), sarif_gen_opts);
const location_t typo_loc
= make_location (linemap_position_for_column (line_table, 1),
/* Tests of messages with embedded links; see SARIF v2.1.0 3.11.6. */
static void
-test_message_with_embedded_link (enum sarif_version version)
+test_message_with_embedded_link (const sarif_generation_options &sarif_gen_opts)
{
auto_fix_quotes fix_quotes;
{
- test_sarif_diagnostic_context dc ("test.c", version);
+ test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts);
rich_location richloc (line_table, UNKNOWN_LOCATION);
dc.report (DK_ERROR, richloc, nullptr, 0,
"before %{text%} after",
/* Escaping in message text.
This is "EXAMPLE 1" from 3.11.6. */
{
- test_sarif_diagnostic_context dc ("test.c", version);
+ test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts);
rich_location richloc (line_table, UNKNOWN_LOCATION);
/* Disable "unquoted sequence of 2 consecutive punctuation
}
};
- test_sarif_diagnostic_context dc ("test.c", version);
+ test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts);
dc.push_owned_urlifier (::make_unique<test_urlifier> ());
rich_location richloc (line_table, UNKNOWN_LOCATION);
dc.report (DK_ERROR, richloc, nullptr, 0,
3.11.5 ("Messages with placeholders"). */
static void
-test_message_with_braces (enum sarif_version version)
+test_message_with_braces (const sarif_generation_options &sarif_gen_opts)
{
auto_fix_quotes fix_quotes;
{
- test_sarif_diagnostic_context dc ("test.c", version);
+ test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts);
rich_location richloc (line_table, UNKNOWN_LOCATION);
dc.report (DK_ERROR, richloc, nullptr, 0,
"open brace: %qs close brace: %qs",
}
static void
-test_buffering (enum sarif_version version)
+test_buffering (const sarif_generation_options &sarif_gen_opts)
{
- test_sarif_diagnostic_context dc ("test.c", version);
+ test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts);
diagnostic_buffer buf_a (dc);
diagnostic_buffer buf_b (dc);
}
}
+template <class ...ArgTypes>
static void
-run_tests_per_version (const line_table_case &case_)
+for_each_sarif_gen_option (void (*callback) (const sarif_generation_options &,
+ ArgTypes ...),
+ ArgTypes ...args)
{
+ sarif_generation_options sarif_gen_opts;
for (int version_idx = 0;
version_idx < (int)sarif_version::num_versions;
++version_idx)
{
- enum sarif_version version
- = static_cast<enum sarif_version> (version_idx);
+ sarif_gen_opts.m_version = static_cast<enum sarif_version> (version_idx);
- test_make_location_object (case_, version);
- test_simple_log_2 (case_, version);
+ callback (sarif_gen_opts, args...);
}
}
+static void
+run_line_table_case_tests_per_version (const line_table_case &case_)
+{
+ for_each_sarif_gen_option<const line_table_case &>
+ (test_make_location_object, case_);
+
+ for_each_sarif_gen_option<const line_table_case &>
+ (test_simple_log_2, case_);
+}
+
/* Run all of the selftests within this file. */
void
diagnostic_format_sarif_cc_tests ()
{
- for (int version_idx = 0;
- version_idx < (int)sarif_version::num_versions;
- ++version_idx)
- {
- enum sarif_version version
- = static_cast<enum sarif_version> (version_idx);
-
- test_simple_log (version);
- test_message_with_embedded_link (version);
- test_message_with_braces (version);
- test_buffering (version);
- }
+ for_each_sarif_gen_option (test_simple_log);
+ for_each_sarif_gen_option (test_message_with_embedded_link);
+ for_each_sarif_gen_option (test_message_with_braces);
+ for_each_sarif_gen_option (test_buffering);
- /* Run tests per (line-table-case, SARIF version) pair. */
- for_each_line_table_case (run_tests_per_version);
+ /* Run tests per (SARIF gen-option, line-table-case) pair. */
+ for_each_line_table_case (run_line_table_case_tests_per_version);
}
} // namespace selftest