annotate gcc/gcc-rich-location.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Implementation of gcc_rich_location class
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2014-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
9 version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
14 for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #include "config.h"
kono
parents:
diff changeset
21 #include "system.h"
kono
parents:
diff changeset
22 #include "coretypes.h"
kono
parents:
diff changeset
23 #include "tm.h"
kono
parents:
diff changeset
24 #include "rtl.h"
kono
parents:
diff changeset
25 #include "hash-set.h"
kono
parents:
diff changeset
26 #include "vec.h"
kono
parents:
diff changeset
27 #include "input.h"
kono
parents:
diff changeset
28 #include "alias.h"
kono
parents:
diff changeset
29 #include "symtab.h"
kono
parents:
diff changeset
30 #include "inchash.h"
kono
parents:
diff changeset
31 #include "tree-core.h"
kono
parents:
diff changeset
32 #include "tree.h"
kono
parents:
diff changeset
33 #include "diagnostic-core.h"
kono
parents:
diff changeset
34 #include "gcc-rich-location.h"
kono
parents:
diff changeset
35 #include "print-tree.h"
kono
parents:
diff changeset
36 #include "pretty-print.h"
kono
parents:
diff changeset
37 #include "intl.h"
kono
parents:
diff changeset
38 #include "cpplib.h"
kono
parents:
diff changeset
39 #include "diagnostic.h"
kono
parents:
diff changeset
40
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
41 /* Add a range to the rich_location, covering expression EXPR,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
42 using LABEL if non-NULL. */
111
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
45 gcc_rich_location::add_expr (tree expr, range_label *label)
111
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 gcc_assert (expr);
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 if (CAN_HAVE_RANGE_P (expr))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
50 add_range (EXPR_LOCATION (expr), SHOW_RANGE_WITHOUT_CARET, label);
111
kono
parents:
diff changeset
51 }
kono
parents:
diff changeset
52
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
53 /* If T is an expression, add a range for it to the rich_location,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
54 using LABEL if non-NULL. */
111
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
57 gcc_rich_location::maybe_add_expr (tree t, range_label *label)
111
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 if (EXPR_P (t))
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
60 add_expr (t, label);
111
kono
parents:
diff changeset
61 }
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* Add a fixit hint suggesting replacing the range at MISSPELLED_TOKEN_LOC
kono
parents:
diff changeset
64 with the identifier HINT_ID. */
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 void
kono
parents:
diff changeset
67 gcc_rich_location::add_fixit_misspelled_id (location_t misspelled_token_loc,
kono
parents:
diff changeset
68 tree hint_id)
kono
parents:
diff changeset
69 {
kono
parents:
diff changeset
70 gcc_assert (TREE_CODE (hint_id) == IDENTIFIER_NODE);
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 add_fixit_replace (misspelled_token_loc, IDENTIFIER_POINTER (hint_id));
kono
parents:
diff changeset
73 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
74
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
75 /* Return true if there is nothing on LOC's line before LOC. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
78 blank_line_before_p (location_t loc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 expanded_location exploc = expand_location (loc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 char_span line = location_get_source_line (exploc.file, exploc.line);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 if (!line)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 if (line.length () < (size_t)exploc.column)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 /* Columns are 1-based. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 for (int column = 1; column < exploc.column; ++column)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88 if (!ISSPACE (line[column - 1]))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
91 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
93 /* Subroutine of gcc_rich_location::add_fixit_insert_formatted.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
94 Return true if we should add the content on its own line,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
95 false otherwise.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
96 If true is returned then *OUT_START_OF_LINE is written to. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
97
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
98 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
99 use_new_line (location_t insertion_point, location_t indent,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
100 location_t *out_start_of_line)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
101 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
102 if (indent == UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
103 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 const line_map *indent_map = linemap_lookup (line_table, indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 if (linemap_macro_expansion_map_p (indent_map))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
108 if (!blank_line_before_p (insertion_point))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
110
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
111 /* Locate the start of the line containing INSERTION_POINT. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
112 const line_map *insertion_point_map
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
113 = linemap_lookup (line_table, insertion_point);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 if (linemap_macro_expansion_map_p (insertion_point_map))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 const line_map_ordinary *ordmap
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 = linemap_check_ordinary (insertion_point_map);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118 expanded_location exploc_insertion_point = expand_location (insertion_point);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 location_t start_of_line
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 = linemap_position_for_line_and_column (line_table, ordmap,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 exploc_insertion_point.line, 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122 *out_start_of_line = start_of_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126 /* Add a fix-it hint suggesting the insertion of CONTENT before
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 INSERTION_POINT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 Attempt to handle formatting: if INSERTION_POINT is the first thing on
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 its line, and INDENT is sufficiently sane, then add CONTENT on its own
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 line, using the indentation of INDENT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 Otherwise, add CONTENT directly before INSERTION_POINT.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 For example, adding "CONTENT;" with the closing brace as the insertion
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 point and "INDENT;" as the indentation point:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 if ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
139 INDENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
140 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
141
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
142 would lead to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
143
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 if ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 INDENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147 CONTENT;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 but adding it to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
151
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152 if () {INDENT;}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
153
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
154 would lead to:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
155
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156 if () {INDENT;CONTENT;}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
157 */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
158
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
159 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
160 gcc_rich_location::add_fixit_insert_formatted (const char *content,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 location_t insertion_point,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162 location_t indent)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
164 location_t start_of_line;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
165 if (use_new_line (insertion_point, indent, &start_of_line))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
166 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 /* Add CONTENT on its own line, using the indentation of INDENT. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
168
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
169 /* Generate an insertion string, indenting by the amount INDENT
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
170 was indented. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 int indent_column = LOCATION_COLUMN (get_start (indent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172 pretty_printer tmp_pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173 pretty_printer *pp = &tmp_pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 /* Columns are 1-based. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
175 for (int column = 1; column < indent_column; ++column)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
176 pp_space (pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177 pp_string (pp, content);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
178 pp_newline (pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
179
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
180 add_fixit_insert_before (start_of_line, pp_formatted_text (pp));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
181 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
182 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 add_fixit_insert_before (insertion_point, content);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
184 }