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 : : #include "rust-name-resolution-context.h"
20 : : #include "optional.h"
21 : : #include "rust-mapping-common.h"
22 : :
23 : : namespace Rust {
24 : : namespace Resolver2_0 {
25 : :
26 : 3619 : NameResolutionContext::NameResolutionContext ()
27 : 3619 : : mappings (*Analysis::Mappings::get ())
28 : 3619 : {}
29 : :
30 : : tl::expected<NodeId, DuplicateNameError>
31 : 177 : NameResolutionContext::insert (Identifier name, NodeId id, Namespace ns)
32 : : {
33 : 177 : switch (ns)
34 : : {
35 : 90 : case Namespace::Values:
36 : 90 : return values.insert (name, id);
37 : 65 : case Namespace::Types:
38 : 65 : return types.insert (name, id);
39 : 22 : case Namespace::Macros:
40 : 22 : return macros.insert (name, id);
41 : 0 : case Namespace::Labels:
42 : 0 : default:
43 : : // return labels.insert (name, id);
44 : 0 : rust_unreachable ();
45 : : }
46 : : }
47 : :
48 : : tl::expected<NodeId, DuplicateNameError>
49 : 6 : NameResolutionContext::insert_shadowable (Identifier name, NodeId id,
50 : : Namespace ns)
51 : : {
52 : 6 : switch (ns)
53 : : {
54 : 5 : case Namespace::Values:
55 : 5 : return values.insert_shadowable (name, id);
56 : 1 : case Namespace::Types:
57 : 1 : return types.insert_shadowable (name, id);
58 : 0 : case Namespace::Macros:
59 : 0 : return macros.insert_shadowable (name, id);
60 : 0 : case Namespace::Labels:
61 : 0 : default:
62 : : // return labels.insert (name, id);
63 : 0 : rust_unreachable ();
64 : : }
65 : : }
66 : :
67 : : void
68 : 89 : NameResolutionContext::map_usage (Usage usage, Definition definition)
69 : : {
70 : 89 : auto inserted = resolved_nodes.emplace (usage, definition).second;
71 : :
72 : : // is that valid?
73 : 89 : rust_assert (inserted);
74 : 89 : }
75 : :
76 : : tl::optional<NodeId>
77 : 181 : NameResolutionContext::lookup (NodeId usage)
78 : : {
79 : 181 : auto it = resolved_nodes.find (Usage (usage));
80 : :
81 : 181 : if (it == resolved_nodes.end ())
82 : 0 : return tl::nullopt;
83 : :
84 : 181 : return it->second.id;
85 : : }
86 : :
87 : : void
88 : 543 : NameResolutionContext::scoped (Rib rib, NodeId id,
89 : : std::function<void (void)> lambda,
90 : : tl::optional<Identifier> path)
91 : : {
92 : 1086 : values.push (rib, id, path);
93 : 1086 : types.push (rib, id, path);
94 : 1086 : macros.push (rib, id, path);
95 : : // labels.push (rib, id);
96 : :
97 : 543 : lambda ();
98 : :
99 : 543 : values.pop ();
100 : 543 : types.pop ();
101 : 543 : macros.pop ();
102 : : // labels.pop (rib);
103 : 543 : }
104 : :
105 : : void
106 : 0 : NameResolutionContext::scoped (Rib rib, Namespace ns, NodeId scope_id,
107 : : std::function<void (void)> lambda,
108 : : tl::optional<Identifier> path)
109 : : {
110 : 0 : switch (ns)
111 : : {
112 : 0 : case Namespace::Values:
113 : 0 : values.push (rib, scope_id, path);
114 : 0 : break;
115 : 0 : case Namespace::Types:
116 : 0 : types.push (rib, scope_id, path);
117 : 0 : break;
118 : 0 : case Namespace::Labels:
119 : 0 : case Namespace::Macros:
120 : 0 : gcc_unreachable ();
121 : : }
122 : :
123 : 0 : lambda ();
124 : :
125 : 0 : switch (ns)
126 : : {
127 : 0 : case Namespace::Values:
128 : 0 : values.pop ();
129 : 0 : break;
130 : 0 : case Namespace::Types:
131 : 0 : types.pop ();
132 : 0 : break;
133 : : case Namespace::Labels:
134 : : case Namespace::Macros:
135 : : gcc_unreachable ();
136 : : }
137 : 0 : }
138 : :
139 : : } // namespace Resolver2_0
140 : : } // namespace Rust
|