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-ast-resolve.h"
20 : : #include "rust-ast-full.h"
21 : : #include "rust-tyty.h"
22 : : #include "rust-ast-resolve-toplevel.h"
23 : : #include "rust-ast-resolve-item.h"
24 : : #include "rust-ast-resolve-expr.h"
25 : : #include "rust-ast-resolve-struct-expr-field.h"
26 : :
27 : : extern bool
28 : : saw_errors (void);
29 : :
30 : : namespace Rust {
31 : : namespace Resolver {
32 : :
33 : : // NameResolution
34 : :
35 : : NameResolution *
36 : 3605 : NameResolution::get ()
37 : : {
38 : 3605 : static NameResolution *instance;
39 : 3605 : if (instance == nullptr)
40 : 3589 : instance = new NameResolution ();
41 : :
42 : 3605 : return instance;
43 : : }
44 : :
45 : 3589 : NameResolution::NameResolution ()
46 : 3589 : : resolver (Resolver::get ()), mappings (Analysis::Mappings::get ())
47 : : {
48 : : // these are global
49 : 3589 : resolver->get_type_scope ().push (mappings->get_next_node_id ());
50 : 3589 : resolver->insert_builtin_types (resolver->get_type_scope ().peek ());
51 : 3589 : resolver->push_new_type_rib (resolver->get_type_scope ().peek ());
52 : 3589 : }
53 : :
54 : : void
55 : 3605 : NameResolution::Resolve (AST::Crate &crate)
56 : : {
57 : 3605 : auto resolver = get ();
58 : 3605 : resolver->go (crate);
59 : 3604 : }
60 : :
61 : : void
62 : 3605 : NameResolution::go (AST::Crate &crate)
63 : : {
64 : : // lookup current crate name
65 : 3605 : CrateNum cnum = mappings->get_current_crate ();
66 : 3605 : std::string crate_name;
67 : 3605 : bool ok = mappings->get_crate_name (cnum, crate_name);
68 : 3605 : rust_assert (ok);
69 : :
70 : : // setup the ribs
71 : 3605 : NodeId scope_node_id = crate.get_node_id ();
72 : 3605 : resolver->get_name_scope ().push (scope_node_id);
73 : 3605 : resolver->get_type_scope ().push (scope_node_id);
74 : 3605 : resolver->get_label_scope ().push (scope_node_id);
75 : 3605 : resolver->push_new_name_rib (resolver->get_name_scope ().peek ());
76 : 3605 : resolver->push_new_type_rib (resolver->get_type_scope ().peek ());
77 : 3605 : resolver->push_new_label_rib (resolver->get_type_scope ().peek ());
78 : :
79 : : // get the root segment
80 : 3605 : CanonicalPath crate_prefix
81 : 3605 : = CanonicalPath::new_seg (scope_node_id, crate_name);
82 : 3605 : crate_prefix.set_crate_num (cnum);
83 : :
84 : : // setup a dummy crate node
85 : 7210 : resolver->get_name_scope ().insert (
86 : 7210 : CanonicalPath::new_seg (crate.get_node_id (), "__$$crate__"),
87 : : crate.get_node_id (), UNDEF_LOCATION);
88 : :
89 : : // setup the root scope
90 : 3605 : resolver->push_new_module_scope (scope_node_id);
91 : :
92 : : // first gather the top-level namespace names then we drill down so this
93 : : // allows for resolving forward declarations since an impl block might have
94 : : // a Self type Foo which is defined after the impl block for example.
95 : 17808 : for (auto &item : crate.items)
96 : 14203 : ResolveTopLevel::go (*item, CanonicalPath::create_empty (), crate_prefix);
97 : :
98 : : // FIXME remove this
99 : 3605 : if (saw_errors ())
100 : : {
101 : 113 : resolver->pop_module_scope ();
102 : 113 : return;
103 : : }
104 : :
105 : : // next we can drill down into the items and their scopes
106 : 17334 : for (auto &item : crate.items)
107 : 13843 : ResolveItem::go (*item, CanonicalPath::create_empty (), crate_prefix);
108 : :
109 : : // done
110 : 3491 : resolver->pop_module_scope ();
111 : 3604 : }
112 : :
113 : : } // namespace Resolver
114 : : } // namespace Rust
|