blob: 9f8a73fd2849374d038e882bc9ce5b75303ca022 [file] [log] [blame]
/* SARIF output for diagnostics.
Copyright (C) 2023-2025 Free Software Foundation, Inc.
Contributed by David Malcolm <dmalcolm@redhat.com>.
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
<http://www.gnu.org/licenses/>. */
#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<sink>
make_sarif_sink (context &dc,
const line_maps &line_maps,
std::unique_ptr<sarif_serialization_format> 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<sarif_graph>
make_sarif_graph (const digraphs::digraph &g,
sarif_builder *builder,
sarif_location_manager *sarif_location_mgr);
extern std::unique_ptr<sarif_node>
make_sarif_node (const digraphs::node &n,
sarif_builder *builder,
sarif_location_manager *sarif_location_mgr);
extern std::unique_ptr<sarif_edge>
make_sarif_edge (const digraphs::edge &e,
sarif_builder *builder);
} // namespace diagnostics
#endif /* ! GCC_DIAGNOSTICS_SARIF_SINK_H */