]>
Commit | Line | Data |
---|---|---|
83ffe9cd | 1 | // Copyright (C) 2020-2023 Free Software Foundation, Inc. |
ca246e57 AC |
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_PRIVACY_CTX_H | |
20 | #define RUST_PRIVACY_CTX_H | |
21 | ||
22 | #include "rust-hir-map.h" | |
23 | #include "rust-privacy-check.h" | |
24 | ||
25 | namespace Rust { | |
26 | namespace Privacy { | |
27 | ||
28 | /** | |
29 | * Reachability levels of HIR nodes. These levels are computed through the | |
30 | * `ReachabilityVisitor` visitor. | |
31 | */ | |
32 | enum ReachLevel | |
33 | { | |
34 | Unreachable, | |
35 | Reachable, | |
36 | }; | |
37 | ||
38 | class PrivacyContext | |
39 | { | |
40 | public: | |
41 | /** | |
42 | * Insert a new resolved visibility for a given node. If the node is already | |
43 | * present in the reachability map, then its visibility will only be updated | |
44 | * if the given visibility is higher. | |
45 | * | |
46 | * @param mappings Mappings of the node to store the reach level for | |
47 | * @param reach Level of reachability for the given node | |
48 | * | |
49 | * @return The new reachability level for this node. If this was the first | |
50 | * time inserting this node, then return `reach`. Otherwise, return `reach` or | |
51 | * the existing reach level if it was higher. | |
52 | */ | |
53 | ReachLevel update_reachability (const Analysis::NodeMapping &mapping, | |
54 | ReachLevel reach); | |
55 | ||
56 | /** | |
57 | * Lookup the visibility of an already declared Node | |
58 | * | |
59 | * @param mapping Mappings of the node to fetch the reach level of | |
60 | * | |
61 | * @return `nullptr` if the reach level for the current node has not been | |
62 | * added, a valid pointer otherwise | |
63 | */ | |
64 | const ReachLevel *lookup_reachability (const Analysis::NodeMapping &mapping); | |
65 | ||
66 | private: | |
67 | std::unordered_map<DefId, ReachLevel> reachability_map; | |
68 | }; | |
69 | } // namespace Privacy | |
70 | } // namespace Rust | |
71 | ||
72 | #if CHECKING_P | |
73 | namespace selftest { | |
74 | void | |
75 | rust_privacy_ctx_test (void); | |
76 | } | |
77 | #endif // !CHECKING_P | |
78 | ||
79 | #endif // !RUST_PRIVACY_CTX_H |