gccrs: Use optional for proc macro invocation lookup

The old interface for those mappings was clunky at best. Now we can use
the optional structure to return a reference to the instance.

gcc/rust/ChangeLog:

	* expand/rust-macro-expand.h (struct MacroExpander): Update
	lookup function prototypes.
	* util/rust-hir-map.cc (Mappings::lookup_derive_proc_macro_invocation):
	Update lookup function according to new signature.
	(Mappings::lookup_bang_proc_macro_invocation): Likewise.
	(Mappings::lookup_attribute_proc_macro_invocation): Likewise.
	* util/rust-hir-map.h: Update function prototypes.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
This commit is contained in:
Pierre-Emmanuel Patry 2023-08-29 14:42:02 +02:00 committed by Arthur Cohen
parent 346ccc0f0a
commit 8a343bd46f
3 changed files with 33 additions and 35 deletions

View file

@ -410,8 +410,9 @@ struct MacroExpander
template <typename T>
AST::Fragment expand_derive_proc_macro (T &item, AST::SimplePath &path)
{
CustomDeriveProcMacro macro;
if (!mappings->lookup_derive_proc_macro_invocation (path, macro))
tl::optional<CustomDeriveProcMacro &> macro
= mappings->lookup_derive_proc_macro_invocation (path);
if (!macro.has_value ())
{
rust_error_at (path.get_locus (), "Macro not found");
return AST::Fragment::create_error ();
@ -424,15 +425,17 @@ struct MacroExpander
auto c = collector.collect_tokens ();
std::vector<const_TokenPtr> vec (c.cbegin (), c.cend ());
return parse_proc_macro_output (macro.get_handle () (convert (vec)));
return parse_proc_macro_output (
macro.value ().get_handle () (convert (vec)));
}
template <typename T>
AST::Fragment expand_bang_proc_macro (T &item,
AST::MacroInvocation &invocation)
{
BangProcMacro macro;
if (!mappings->lookup_bang_proc_macro_invocation (invocation, macro))
tl::optional<BangProcMacro &> macro
= mappings->lookup_bang_proc_macro_invocation (invocation);
if (!macro.has_value ())
{
rust_error_at (invocation.get_locus (), "Macro not found");
return AST::Fragment::create_error ();
@ -445,14 +448,16 @@ struct MacroExpander
auto c = collector.collect_tokens ();
std::vector<const_TokenPtr> vec (c.cbegin (), c.cend ());
return parse_proc_macro_output (macro.get_handle () (convert (vec)));
return parse_proc_macro_output (
macro.value ().get_handle () (convert (vec)));
}
template <typename T>
AST::Fragment expand_attribute_proc_macro (T &item, AST::SimplePath &path)
{
AttributeProcMacro macro;
if (!mappings->lookup_attribute_proc_macro_invocation (path, macro))
tl::optional<AttributeProcMacro &> macro
= mappings->lookup_attribute_proc_macro_invocation (path);
if (!macro.has_value ())
{
rust_error_at (path.get_locus (), "Macro not found");
return AST::Fragment::create_error ();
@ -467,8 +472,8 @@ struct MacroExpander
// FIXME: Handle attributes
return parse_proc_macro_output (
macro.get_handle () (ProcMacro::TokenStream::make_tokenstream (),
convert (vec)));
macro.value ().get_handle () (ProcMacro::TokenStream::make_tokenstream (),
convert (vec)));
}
/**

View file

@ -1072,16 +1072,14 @@ Mappings::insert_derive_proc_macro_invocation (AST::SimplePath &invoc,
procmacroDeriveInvocations[invoc.get_node_id ()] = def;
}
bool
Mappings::lookup_derive_proc_macro_invocation (AST::SimplePath &invoc,
CustomDeriveProcMacro &def)
tl::optional<CustomDeriveProcMacro &>
Mappings::lookup_derive_proc_macro_invocation (AST::SimplePath &invoc)
{
auto it = procmacroDeriveInvocations.find (invoc.get_node_id ());
if (it == procmacroDeriveInvocations.end ())
return false;
return tl::nullopt;
def = it->second;
return true;
return it->second;
}
void
@ -1094,16 +1092,14 @@ Mappings::insert_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
procmacroBangInvocations[invoc.get_macro_node_id ()] = def;
}
bool
Mappings::lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
BangProcMacro &def)
tl::optional<BangProcMacro &>
Mappings::lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc)
{
auto it = procmacroBangInvocations.find (invoc.get_macro_node_id ());
if (it == procmacroBangInvocations.end ())
return false;
return tl::nullopt;
def = it->second;
return true;
return it->second;
}
void
@ -1116,16 +1112,14 @@ Mappings::insert_attribute_proc_macro_invocation (AST::SimplePath &invoc,
procmacroAttributeInvocations[invoc.get_node_id ()] = def;
}
bool
Mappings::lookup_attribute_proc_macro_invocation (AST::SimplePath &invoc,
AttributeProcMacro &def)
tl::optional<AttributeProcMacro &>
Mappings::lookup_attribute_proc_macro_invocation (AST::SimplePath &invoc)
{
auto it = procmacroAttributeInvocations.find (invoc.get_node_id ());
if (it == procmacroAttributeInvocations.end ())
return false;
return tl::nullopt;
def = it->second;
return true;
return it->second;
}
void

View file

@ -310,19 +310,18 @@ public:
bool lookup_bang_proc_macro_def (NodeId id, BangProcMacro &macro);
bool lookup_attribute_proc_macro_def (NodeId id, AttributeProcMacro &macro);
tl::optional<CustomDeriveProcMacro &>
lookup_derive_proc_macro_invocation (AST::SimplePath &invoc);
tl::optional<BangProcMacro &>
lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc_id);
tl::optional<AttributeProcMacro &>
lookup_attribute_proc_macro_invocation (AST::SimplePath &invoc);
void insert_derive_proc_macro_invocation (AST::SimplePath &invoc,
CustomDeriveProcMacro def);
bool lookup_derive_proc_macro_invocation (AST::SimplePath &invoc,
CustomDeriveProcMacro &def);
void insert_bang_proc_macro_invocation (AST::MacroInvocation &invoc,
BangProcMacro def);
bool lookup_bang_proc_macro_invocation (AST::MacroInvocation &invoc_id,
BangProcMacro &def);
void insert_attribute_proc_macro_invocation (AST::SimplePath &invoc,
AttributeProcMacro def);
bool lookup_attribute_proc_macro_invocation (AST::SimplePath &invoc,
AttributeProcMacro &def);
void insert_visibility (NodeId id, Privacy::ModuleVisibility visibility);
bool lookup_visibility (NodeId id, Privacy::ModuleVisibility &def);