Branch data Line data Source code
1 : : // Copyright (C) 2020-2024 Free Software Foundation, Inc.
2 : :
3 : : // This file is part of GCC.
4 : :
5 : : // GCC is free software; you can redistribute it and/or modify it under
6 : : // the terms of the GNU General Public License as published by the Free
7 : : // Software Foundation; either version 3, or (at your option) any later
8 : : // version.
9 : :
10 : : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : : // for more details.
14 : :
15 : : // You should have received a copy of the GNU General Public License
16 : : // along with GCC; see the file COPYING3. If not see
17 : : // <http://www.gnu.org/licenses/>.
18 : :
19 : : #ifndef RUST_AST_RESOLVE_IMPLITEM_H
20 : : #define RUST_AST_RESOLVE_IMPLITEM_H
21 : :
22 : : #include "rust-ast-resolve-base.h"
23 : : #include "rust-ast-resolve-type.h"
24 : : #include "rust-ast-full.h"
25 : :
26 : : namespace Rust {
27 : : namespace Resolver {
28 : :
29 : 4262 : class ResolveToplevelImplItem : public ResolverBase
30 : : {
31 : : using Rust::Resolver::ResolverBase::visit;
32 : :
33 : : public:
34 : 4262 : static void go (AST::AssociatedItem &item, const CanonicalPath &prefix)
35 : : {
36 : 4262 : if (item.is_marked_for_strip ())
37 : 0 : return;
38 : :
39 : 4262 : ResolveToplevelImplItem resolver (prefix);
40 : 4262 : item.accept_vis (resolver);
41 : 4262 : }
42 : :
43 : 733 : void visit (AST::TypeAlias &type) override
44 : : {
45 : 733 : auto decl = CanonicalPath::new_seg (type.get_node_id (),
46 : 733 : type.get_new_type_name ().as_string ());
47 : 733 : auto path = prefix.append (decl);
48 : :
49 : 733 : resolver->get_type_scope ().insert (
50 : : path, type.get_node_id (), type.get_locus (), false, Rib::ItemType::Type,
51 : 733 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
52 : 0 : rich_location r (line_table, type.get_locus ());
53 : 0 : r.add_range (locus);
54 : 0 : rust_error_at (r, "redefined multiple times");
55 : 0 : });
56 : 733 : }
57 : :
58 : 42 : void visit (AST::ConstantItem &constant) override
59 : : {
60 : 42 : auto decl = CanonicalPath::new_seg (constant.get_node_id (),
61 : 42 : constant.get_identifier ());
62 : 42 : auto path = prefix.append (decl);
63 : :
64 : 42 : resolver->get_name_scope ().insert (
65 : : path, constant.get_node_id (), constant.get_locus (), false,
66 : : Rib::ItemType::Const,
67 : 42 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
68 : 1 : rich_location r (line_table, constant.get_locus ());
69 : 1 : r.add_range (locus);
70 : 1 : rust_error_at (r, "redefined multiple times");
71 : 1 : });
72 : 42 : }
73 : :
74 : 3487 : void visit (AST::Function &function) override
75 : : {
76 : 3487 : auto decl
77 : 3487 : = CanonicalPath::new_seg (function.get_node_id (),
78 : 3487 : function.get_function_name ().as_string ());
79 : 3487 : auto path = prefix.append (decl);
80 : :
81 : 3487 : resolver->get_name_scope ().insert (
82 : 3487 : path, function.get_node_id (), function.get_locus (), false,
83 : : Rib::ItemType::Function,
84 : 3487 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
85 : 2 : rich_location r (line_table, function.get_locus ());
86 : 2 : r.add_range (locus);
87 : 2 : rust_error_at (r, "redefined multiple times");
88 : 2 : });
89 : 3487 : }
90 : :
91 : : private:
92 : 4262 : ResolveToplevelImplItem (const CanonicalPath &prefix)
93 : 4262 : : ResolverBase (), prefix (prefix)
94 : : {
95 : 4262 : rust_assert (!prefix.is_empty ());
96 : 4262 : }
97 : :
98 : : const CanonicalPath &prefix;
99 : : };
100 : :
101 : 1637 : class ResolveTopLevelTraitItems : public ResolverBase
102 : : {
103 : : using Rust::Resolver::ResolverBase::visit;
104 : :
105 : : public:
106 : 1637 : static void go (AST::AssociatedItem *item, const CanonicalPath &prefix,
107 : : const CanonicalPath &canonical_prefix)
108 : : {
109 : 3274 : ResolveTopLevelTraitItems resolver (prefix, canonical_prefix);
110 : 3274 : item->accept_vis (resolver);
111 : 1637 : };
112 : :
113 : 1078 : void visit (AST::Function &function) override
114 : : {
115 : 1078 : auto decl
116 : 1078 : = CanonicalPath::new_seg (function.get_node_id (),
117 : 1078 : function.get_function_name ().as_string ());
118 : 1078 : auto path = prefix.append (decl);
119 : 1078 : auto cpath = canonical_prefix.append (decl);
120 : :
121 : 1078 : resolver->get_name_scope ().insert (
122 : 1078 : path, function.get_node_id (), function.get_locus (), false,
123 : : Rib::ItemType::Function,
124 : 1078 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
125 : 0 : rich_location r (line_table, function.get_locus ());
126 : 0 : r.add_range (locus);
127 : 0 : rust_error_at (r, "redefined multiple times");
128 : 0 : });
129 : :
130 : 1078 : mappings->insert_canonical_path (function.get_node_id (), cpath);
131 : 1078 : }
132 : :
133 : 36 : void visit (AST::TraitItemConst &constant) override
134 : : {
135 : 36 : auto decl
136 : : = CanonicalPath::new_seg (constant.get_node_id (),
137 : 36 : constant.get_identifier ().as_string ());
138 : 36 : auto path = prefix.append (decl);
139 : 36 : auto cpath = canonical_prefix.append (decl);
140 : :
141 : 36 : resolver->get_name_scope ().insert (
142 : 36 : path, constant.get_node_id (), constant.get_locus (), false,
143 : : Rib::ItemType::Const,
144 : 36 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
145 : 0 : rich_location r (line_table, constant.get_locus ());
146 : 0 : r.add_range (locus);
147 : 0 : rust_error_at (r, "redefined multiple times");
148 : 0 : });
149 : :
150 : 36 : mappings->insert_canonical_path (constant.get_node_id (), cpath);
151 : 36 : }
152 : :
153 : 523 : void visit (AST::TraitItemType &type) override
154 : : {
155 : 523 : auto decl = CanonicalPath::new_seg (type.get_node_id (),
156 : 523 : type.get_identifier ().as_string ());
157 : 523 : auto path = prefix.append (decl);
158 : 523 : auto cpath = canonical_prefix.append (decl);
159 : :
160 : 523 : resolver->get_type_scope ().insert (
161 : 523 : path, type.get_node_id (), type.get_locus (), false, Rib::ItemType::Type,
162 : 523 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
163 : 0 : rich_location r (line_table, type.get_locus ());
164 : 0 : r.add_range (locus);
165 : 0 : rust_error_at (r, "redefined multiple times");
166 : 0 : });
167 : :
168 : 523 : mappings->insert_canonical_path (type.get_node_id (), cpath);
169 : 523 : }
170 : :
171 : : private:
172 : 1637 : ResolveTopLevelTraitItems (const CanonicalPath &prefix,
173 : : const CanonicalPath &canonical_prefix)
174 : 1637 : : ResolverBase (), prefix (prefix), canonical_prefix (canonical_prefix)
175 : : {}
176 : :
177 : : const CanonicalPath &prefix;
178 : : const CanonicalPath &canonical_prefix;
179 : : };
180 : :
181 : 1852 : class ResolveToplevelExternItem : public ResolverBase
182 : : {
183 : : using Rust::Resolver::ResolverBase::visit;
184 : :
185 : : public:
186 : 1852 : static void go (AST::ExternalItem &item, const CanonicalPath &prefix)
187 : : {
188 : 3704 : ResolveToplevelExternItem resolver (prefix);
189 : 3704 : item.accept_vis (resolver);
190 : 1852 : };
191 : :
192 : 1850 : void visit (AST::Function &function) override
193 : : {
194 : 1850 : auto decl
195 : 1850 : = CanonicalPath::new_seg (function.get_node_id (),
196 : 1850 : function.get_function_name ().as_string ());
197 : 1850 : auto path = prefix.append (decl);
198 : :
199 : 1850 : resolver->get_name_scope ().insert (
200 : 1850 : path, function.get_node_id (), function.get_locus (), false,
201 : : Rib::ItemType::Function,
202 : 1850 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
203 : 0 : rich_location r (line_table, function.get_locus ());
204 : 0 : r.add_range (locus);
205 : 0 : rust_error_at (r, "redefined multiple times");
206 : 0 : });
207 : :
208 : 1850 : NodeId current_module = resolver->peek_current_module_scope ();
209 : 1850 : mappings->insert_module_child_item (current_module, decl);
210 : 1850 : }
211 : :
212 : 1 : void visit (AST::ExternalStaticItem &item) override
213 : : {
214 : 1 : auto decl = CanonicalPath::new_seg (item.get_node_id (),
215 : 1 : item.get_identifier ().as_string ());
216 : 1 : auto path = prefix.append (decl);
217 : :
218 : 1 : resolver->get_name_scope ().insert (
219 : 1 : path, item.get_node_id (), item.get_locus (), false,
220 : : Rib::ItemType::Static,
221 : 1 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
222 : 0 : rich_location r (line_table, item.get_locus ());
223 : 0 : r.add_range (locus);
224 : 0 : rust_error_at (r, "redefined multiple times");
225 : 0 : });
226 : :
227 : 1 : NodeId current_module = resolver->peek_current_module_scope ();
228 : 1 : mappings->insert_module_child_item (current_module, decl);
229 : 1 : }
230 : :
231 : 1 : void visit (AST::ExternalTypeItem &type) override
232 : : {
233 : 1 : auto decl = CanonicalPath::new_seg (type.get_node_id (),
234 : 1 : type.get_identifier ().as_string ());
235 : 1 : auto path = prefix.append (decl);
236 : :
237 : 1 : resolver->get_type_scope ().insert (
238 : 1 : path, type.get_node_id (), type.get_locus (), false, Rib::ItemType::Type,
239 : 1 : [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
240 : 0 : rich_location r (line_table, type.get_locus ());
241 : 0 : r.add_range (locus);
242 : :
243 : 0 : rust_error_at (r, "redefined multiple times");
244 : 0 : });
245 : :
246 : 1 : NodeId current_module = resolver->peek_current_module_scope ();
247 : 1 : mappings->insert_module_child_item (current_module, decl);
248 : 1 : }
249 : :
250 : : private:
251 : 1852 : ResolveToplevelExternItem (const CanonicalPath &prefix)
252 : 1852 : : ResolverBase (), prefix (prefix)
253 : : {}
254 : :
255 : : const CanonicalPath &prefix;
256 : : };
257 : :
258 : : } // namespace Resolver
259 : : } // namespace Rust
260 : :
261 : : #endif // RUST_AST_RESOLVE_IMPLITEM_H
|