Line data Source code
1 : /* Classic text-based output of diagnostics.
2 : Copyright (C) 2023-2026 Free Software Foundation, Inc.
3 : Contributed by David Malcolm <dmalcolm@redhat.com>.
4 :
5 : This file is part of GCC.
6 :
7 : GCC is free software; you can redistribute it and/or modify it under
8 : the terms of the GNU General Public License as published by the Free
9 : Software Foundation; either version 3, or (at your option) any later
10 : version.
11 :
12 : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : for more details.
16 :
17 : You should have received a copy of the GNU General Public License
18 : along with GCC; see the file COPYING3. If not see
19 : <http://www.gnu.org/licenses/>. */
20 :
21 : #ifndef GCC_DIAGNOSTICS_TEXT_SINK_H
22 : #define GCC_DIAGNOSTICS_TEXT_SINK_H
23 :
24 : #include "diagnostics/sink.h"
25 :
26 : namespace diagnostics {
27 :
28 : /* Subclass of diagnostics::sink for classic text-based output
29 : to stderr.
30 :
31 : Uses diagnostics::context.m_text_callbacks to provide client-specific
32 : textual output (e.g. include paths, macro expansions, etc). */
33 :
34 : class text_sink : public sink
35 : {
36 : public:
37 708208 : text_sink (context &dc,
38 : source_printing_options *source_printing = nullptr,
39 : bool follows_reference_printer = false)
40 708208 : : sink (dc),
41 708208 : m_saved_output_buffer (nullptr),
42 708208 : m_column_policy (dc),
43 708208 : m_last_module (nullptr),
44 708208 : m_includes_seen (nullptr),
45 708208 : m_source_printing (source_printing
46 708208 : ? *source_printing
47 708208 : : dc.get_source_printing_options ()),
48 708208 : m_follows_reference_printer (follows_reference_printer),
49 708208 : m_show_nesting (false),
50 708208 : m_show_nesting_levels (false)
51 708208 : {}
52 : ~text_sink ();
53 :
54 1123615 : text_sink *dyn_cast_text_sink () final override { return this; }
55 :
56 0 : void dump_kind (FILE *out) const override
57 : {
58 0 : fprintf (out, "text_sink");
59 0 : }
60 : void dump (FILE *out, int indent) const override;
61 :
62 : std::unique_ptr<per_sink_buffer>
63 : make_per_sink_buffer () final override;
64 : void set_buffer (per_sink_buffer *) final override;
65 :
66 1463483 : void on_begin_group () override {}
67 1463482 : void on_end_group () override {}
68 : void on_report_diagnostic (const diagnostic_info &,
69 : enum kind orig_diag_kind) override;
70 : void on_report_verbatim (text_info &) final override;
71 : void on_diagram (const diagram &d) override;
72 : void after_diagnostic (const diagnostic_info &) override;
73 19295 : bool machine_readable_stderr_p () const final override
74 : {
75 19295 : return false;
76 : }
77 : bool follows_reference_printer_p () const final override;
78 :
79 : void update_printer () override;
80 :
81 : void
82 3 : report_global_digraph (const lazily_created<digraphs::digraph> &)
83 : final override
84 : {
85 : // no-op for text
86 3 : }
87 :
88 : void
89 0 : report_digraph_for_logical_location (const lazily_created<digraphs::digraph> &,
90 : logical_locations::key) final override
91 : {
92 : // no-op for text
93 0 : }
94 :
95 : /* Helpers for writing lang-specific starters/finalizers for text output. */
96 : char *build_prefix (const diagnostic_info &) const;
97 : void report_current_module (location_t where);
98 : void append_note (location_t location,
99 : const char * gmsgid, ...) ATTRIBUTE_GCC_DIAG(3,4);
100 :
101 :
102 : char *file_name_as_prefix (const char *) const;
103 :
104 : char *build_indent_prefix (bool with_bullet) const;
105 :
106 : void print_path (const paths::path &path);
107 :
108 358449 : bool show_column_p () const { return get_context ().m_show_column; }
109 :
110 1075 : const column_policy &get_column_policy () const
111 : {
112 1075 : return m_column_policy;
113 : }
114 : location_print_policy get_location_print_policy () const;
115 :
116 20368 : bool show_nesting_p () const { return m_show_nesting; }
117 63 : bool show_locations_in_nesting_p () const
118 : {
119 63 : return m_show_locations_in_nesting;
120 : }
121 :
122 552187 : void set_show_nesting (bool show_nesting) { m_show_nesting = show_nesting; }
123 285738 : void set_show_locations_in_nesting (bool val)
124 : {
125 285738 : m_show_locations_in_nesting = val;
126 285722 : }
127 285738 : void set_show_nesting_levels (bool show_nesting_levels)
128 : {
129 285738 : m_show_nesting_levels = show_nesting_levels;
130 285722 : }
131 :
132 : label_text get_location_text (const expanded_location &s) const;
133 :
134 370180 : source_printing_options &get_source_printing_options ()
135 : {
136 370180 : return m_source_printing;
137 : }
138 : const source_printing_options &get_source_printing_options () const
139 : {
140 : return m_source_printing;
141 : }
142 :
143 : static const char *maybe_line_and_column (int line, int col);
144 :
145 : protected:
146 : void print_any_cwe (const diagnostic_info &diagnostic);
147 : void print_any_rules (const diagnostic_info &diagnostic);
148 : void print_option_information (const diagnostic_info &diagnostic,
149 : enum kind orig_diag_kind);
150 :
151 : bool includes_seen_p (const line_map_ordinary *map);
152 :
153 : /* For handling diagnostics::buffer. */
154 : output_buffer *m_saved_output_buffer;
155 :
156 : column_policy m_column_policy;
157 :
158 : /* Used to detect when the input file stack has changed since last
159 : described. */
160 : const line_map_ordinary *m_last_module;
161 :
162 : /* Include files that report_current_module has already listed the
163 : include path for. */
164 : hash_set<location_t, false, location_hash> *m_includes_seen;
165 :
166 : source_printing_options &m_source_printing;
167 :
168 : /* If true, this is the initial default text output format created
169 : when the diagnostics::context was created, and, in particular, before
170 : initializations of color and m_url_format. Hence this should follow
171 : the dc's reference printer for these.
172 : If false, this text output was created after the dc was created, and
173 : thus tracks its own values for color and m_url_format. */
174 : bool m_follows_reference_printer;
175 :
176 : /* If true, then use indentation to show the nesting structure of
177 : nested diagnostics, and print locations on separate lines after the
178 : diagnostic message, rather than as a prefix to the message. */
179 : bool m_show_nesting;
180 :
181 : /* Set to false to suppress location-printing when showing nested
182 : diagnostics, for use in DejaGnu tests. */
183 : bool m_show_locations_in_nesting;
184 :
185 : /* If true, then add "(level N):" when printing nested diagnostics. */
186 : bool m_show_nesting_levels;
187 : };
188 :
189 : } // namespace diagnostics
190 :
191 : #endif /* ! GCC_DIAGNOSTICS_TEXT_SINK_H */
|