]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/rust/typecheck/rust-tyctx.cc
gccrs: Add closures to lints and error checking
[thirdparty/gcc.git] / gcc / rust / typecheck / rust-tyctx.cc
CommitLineData
83ffe9cd 1// Copyright (C) 2020-2023 Free Software Foundation, Inc.
06688fe4
PH
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-hir-type-check.h"
20
21namespace Rust {
22namespace Resolver {
23
24TypeCheckContext *
25TypeCheckContext::get ()
26{
27 static TypeCheckContext *instance;
28 if (instance == nullptr)
29 instance = new TypeCheckContext ();
30
31 return instance;
32}
33
34TypeCheckContext::TypeCheckContext () {}
35
36TypeCheckContext::~TypeCheckContext () {}
37
38bool
39TypeCheckContext::lookup_builtin (NodeId id, TyTy::BaseType **type)
40{
41 auto ref_it = node_id_refs.find (id);
42 if (ref_it == node_id_refs.end ())
43 return false;
44
45 auto it = resolved.find (ref_it->second);
46 if (it == resolved.end ())
47 return false;
48
49 *type = it->second;
50 return true;
51}
52
53bool
54TypeCheckContext::lookup_builtin (std::string name, TyTy::BaseType **type)
55{
56 for (auto &builtin : builtins)
57 {
58 if (name.compare (builtin->as_string ()) == 0)
59 {
60 *type = builtin.get ();
61 return true;
62 }
63 }
64 return false;
65}
66
67void
68TypeCheckContext::insert_builtin (HirId id, NodeId ref, TyTy::BaseType *type)
69{
70 node_id_refs[ref] = id;
71 resolved[id] = type;
72 builtins.push_back (std::unique_ptr<TyTy::BaseType> (type));
73}
74
75void
76TypeCheckContext::insert_type (const Analysis::NodeMapping &mappings,
77 TyTy::BaseType *type)
78{
79 rust_assert (type != nullptr);
80 NodeId ref = mappings.get_nodeid ();
81 HirId id = mappings.get_hirid ();
82 node_id_refs[ref] = id;
83 resolved[id] = type;
84}
85
86void
87TypeCheckContext::insert_implicit_type (TyTy::BaseType *type)
88{
89 rust_assert (type != nullptr);
90 resolved[type->get_ref ()] = type;
91}
92
93void
94TypeCheckContext::insert_implicit_type (HirId id, TyTy::BaseType *type)
95{
96 rust_assert (type != nullptr);
97 resolved[id] = type;
98}
99
100bool
101TypeCheckContext::lookup_type (HirId id, TyTy::BaseType **type) const
102{
103 auto it = resolved.find (id);
104 if (it == resolved.end ())
105 return false;
106
107 *type = it->second;
108 return true;
109}
110
111void
112TypeCheckContext::insert_type_by_node_id (NodeId ref, HirId id)
113{
114 rust_assert (node_id_refs.find (ref) == node_id_refs.end ());
115 node_id_refs[ref] = id;
116}
117
118bool
119TypeCheckContext::lookup_type_by_node_id (NodeId ref, HirId *id)
120{
121 auto it = node_id_refs.find (ref);
122 if (it == node_id_refs.end ())
123 return false;
124
125 *id = it->second;
126 return true;
127}
128
129TyTy::BaseType *
130TypeCheckContext::peek_return_type ()
131{
7ad24d80 132 rust_assert (!return_type_stack.empty ());
06688fe4
PH
133 return return_type_stack.back ().second;
134}
135
136void
137TypeCheckContext::push_return_type (TypeCheckContextItem item,
138 TyTy::BaseType *return_type)
139{
140 return_type_stack.push_back ({std::move (item), return_type});
141}
142
143void
144TypeCheckContext::pop_return_type ()
145{
245ce6f2 146 rust_assert (!return_type_stack.empty ());
06688fe4
PH
147 return_type_stack.pop_back ();
148}
149
150TypeCheckContextItem &
151TypeCheckContext::peek_context ()
152{
245ce6f2 153 rust_assert (!return_type_stack.empty ());
06688fe4
PH
154 return return_type_stack.back ().first;
155}
156
157} // namespace Resolver
158} // namespace Rust