Skip to content

Commit

Permalink
late: Start setting up builtin types
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* resolve/rust-late-name-resolver-2.0.cc
	(Late::setup_builtin_types): New function.
	(Late::go): Setup builtin types.
	* resolve/rust-late-name-resolver-2.0.h:
	* resolve/rust-name-resolution-context.cc
	(NameResolutionContext::map_usage): New function.
	* resolve/rust-name-resolution-context.h: Likewise.
  • Loading branch information
CohenArthur committed Nov 22, 2023
1 parent 4023eb2 commit 436d473
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 1 deletion.
42 changes: 42 additions & 0 deletions gcc/rust/resolve/rust-late-name-resolver-2.0.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,60 @@
// along with GCC; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.

#include "optional.h"
#include "rust-ast-full.h"
#include "rust-late-name-resolver-2.0.h"
#include "rust-default-resolver.h"
#include "rust-tyty.h"
#include "rust-hir-type-check.h"

namespace Rust {
namespace Resolver2_0 {

Late::Late (NameResolutionContext &ctx) : DefaultResolver (ctx) {}

void
Late::setup_builtin_types ()
{
auto next_id = [this] () { return ctx.mappings.get_next_hir_id (); };

static const std::pair<std::string, TyTy::BaseType *> builtins[] = {
{"u8", new TyTy::UintType (next_id (), TyTy::UintType::U8)},
{"u16", new TyTy::UintType (next_id (), TyTy::UintType::U16)},
{"u32", new TyTy::UintType (next_id (), TyTy::UintType::U32)},
{"u64", new TyTy::UintType (next_id (), TyTy::UintType::U64)},
{"u128", new TyTy::UintType (next_id (), TyTy::UintType::U128)},
{"i8", new TyTy::IntType (next_id (), TyTy::IntType::I8)},
{"i16", new TyTy::IntType (next_id (), TyTy::IntType::I16)},
{"i32", new TyTy::IntType (next_id (), TyTy::IntType::I32)},
{"i64", new TyTy::IntType (next_id (), TyTy::IntType::I64)},
{"i128", new TyTy::IntType (next_id (), TyTy::IntType::I128)},
{"f32", new TyTy::FloatType (next_id (), TyTy::FloatType::F32)},
{"f64", new TyTy::FloatType (next_id (), TyTy::FloatType::F64)},
{"usize", new TyTy::USizeType (next_id ())},
{"isize", new TyTy::ISizeType (next_id ())},
// missing char, str, never, ()
// does name resolution play a part for this? or is it all at typechecking?
// yeah it seems to be name resolution as well, which makes sense
};

for (const auto &builtin : builtins)
{
// we should be able to use `insert_at_root` or `insert` here, since we're
// at the root :) hopefully!
auto ok
= ctx.types.insert (builtin.first, builtin.second->get_ref ()
/* FIXME: Invalid! This returns an *HirId* */);

rust_assert (ok);
}
}

void
Late::go (AST::Crate &crate)
{
setup_builtin_types ();

for (auto &item : crate.items)
item->accept_vis (*this);
}
Expand Down
2 changes: 2 additions & 0 deletions gcc/rust/resolve/rust-late-name-resolver-2.0.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ class Late : public DefaultResolver
void visit (AST::PathInExpression &) override;

private:
/* Setup Rust's builtin types (u8, i32, !...) in the resolver */
void setup_builtin_types ();
};

// TODO: Add missing mappings and data structures
Expand Down
9 changes: 9 additions & 0 deletions gcc/rust/resolve/rust-name-resolution-context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,15 @@ NameResolutionContext::insert (Identifier name, NodeId id, Namespace ns)
}
}

void
NameResolutionContext::map_usage (NodeId usage, NodeId definition)
{
auto inserted = resolved_nodes.emplace (usage, definition).second;

// is that valid?
rust_assert (inserted);
}

void
NameResolutionContext::scoped (Rib rib, NodeId id,
std::function<void (void)> lambda,
Expand Down
8 changes: 7 additions & 1 deletion gcc/rust/resolve/rust-name-resolution-context.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#ifndef RUST_NAME_RESOLVER_2_0_H
#define RUST_NAME_RESOLVER_2_0_H

#include "optional.h"
#include "rust-forever-stack.h"
#include "rust-hir-map.h"

Expand Down Expand Up @@ -179,6 +178,13 @@ class NameResolutionContext
ForeverStack<Namespace::Labels> labels;

Analysis::Mappings &mappings;

// TODO: Rename
void map_usage (NodeId usage, NodeId definition);

private:
/* Map of "usage" nodes which have been resolved to a "definition" node */
std::map<NodeId, NodeId> resolved_nodes;
};

} // namespace Resolver2_0
Expand Down

0 comments on commit 436d473

Please sign in to comment.