/* SARIF output for diagnostics. Copyright (C) 2023-2025 Free Software Foundation, Inc. Contributed by David Malcolm . This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ #ifndef GCC_DIAGNOSTICS_SARIF_SINK_H #define GCC_DIAGNOSTICS_SARIF_SINK_H #include "json.h" #include "diagnostics/sink.h" #include "diagnostics/output-file.h" #include "diagnostics/logical-locations.h" namespace diagnostics { namespace digraphs { class digraph; class node; class edge; } /* Enum for choosing what format to serializing the generated SARIF into. */ enum class sarif_serialization_kind { json, num_values }; extern output_file open_sarif_output_file (context &dc, line_maps *line_maps, const char *base_file_name, enum sarif_serialization_kind serialization_kind); extern sink & init_sarif_stderr (context &dc, const line_maps *line_maps, bool formatted); extern sink & init_sarif_file (context &dc, line_maps *line_maps, bool formatted, const char *base_file_name); extern sink & init_sarif_stream (context &dc, const line_maps *line_maps, bool formatted, FILE *stream); /* Abstract base class for handling JSON output vs other kinds of serialization of the json tree. */ class sarif_serialization_format { public: virtual ~sarif_serialization_format () {} virtual void write_to_file (FILE *outf, const json::value &top) = 0; }; /* Concrete subclass for serializing SARIF as JSON. */ class sarif_serialization_format_json : public sarif_serialization_format { public: sarif_serialization_format_json (bool formatted) : m_formatted (formatted) { } void write_to_file (FILE *outf, const json::value &top) final override; private: bool m_formatted; }; /* Control of SARIF generation. */ enum class sarif_version { v2_1_0, v2_2_prerelease_2024_08_08, num_versions }; /* A bundle of state for controlling what to put in SARIF output, such as which version of SARIF to generate (as opposed to SARIF *serialization* options, such as formatting). */ struct sarif_generation_options { sarif_generation_options (); enum sarif_version m_version; bool m_state_graph; }; extern std::unique_ptr make_sarif_sink (context &dc, const line_maps &line_maps, std::unique_ptr serialization_format, const sarif_generation_options &sarif_gen_opts, output_file output_file_); class sarif_builder; class sarif_location_manager; /* Concrete subclass of json::object for SARIF property bags (SARIF v2.1.0 section 3.8). */ class sarif_property_bag : public json::object { public: void set_logical_location (const char *property_name, sarif_builder &, logical_locations::key logical_loc); void set_graph (const char *property_name, sarif_builder &, sarif_location_manager *sarif_location_mgr, const digraphs::digraph &g); }; /* Concrete subclass of json::object for SARIF objects that can contain property bags (as per SARIF v2.1.0 section 3.8.1, which has: "In addition to those properties that are explicitly documented, every object defined in this document MAY contain a property named properties whose value is a property bag.") */ class sarif_object : public json::object { public: sarif_property_bag &get_or_create_properties (); }; /* Subclass of sarif_object for SARIF "graph" objects (SARIF v2.1.0 section 3.39). */ class sarif_graph : public sarif_object { }; /* Subclass of sarif_object for SARIF "node" objects (SARIF v2.1.0 section 3.40). */ class sarif_node : public sarif_object { }; /* Subclass of sarif_object for SARIF "edge" objects (SARIF v2.1.0 section 3.41). */ class sarif_edge : public sarif_object { }; extern std::unique_ptr make_sarif_graph (const digraphs::digraph &g, sarif_builder *builder, sarif_location_manager *sarif_location_mgr); extern std::unique_ptr make_sarif_node (const digraphs::node &n, sarif_builder *builder, sarif_location_manager *sarif_location_mgr); extern std::unique_ptr make_sarif_edge (const digraphs::edge &e, sarif_builder *builder); } // namespace diagnostics #endif /* ! GCC_DIAGNOSTICS_SARIF_SINK_H */