class Identifier
{
public:
- Identifier (std::string ident = "")
- : ident (ident), node_id (Analysis::Mappings::get ()->get_next_node_id ())
+ // Create dummy identifier
+ Identifier ()
+ : ident (""), node_id (Analysis::Mappings::get ()->get_next_node_id ()),
+ loc (Location ())
+ {}
+ // Create identifier with dummy location
+ Identifier (std::string ident, Location loc = Location ())
+ : ident (ident), node_id (Analysis::Mappings::get ()->get_next_node_id ()),
+ loc (loc)
+ {}
+ // Create identifier from token
+ Identifier (const_TokenPtr token)
+ : ident (token->get_str ()),
+ node_id (Analysis::Mappings::get ()->get_next_node_id ()),
+ loc (token->get_locus ())
{}
Identifier (const Identifier &) = default;
Identifier &operator= (Identifier &&) = default;
NodeId get_node_id () const { return node_id; }
+ Location get_locus () const { return loc; }
const std::string &as_string () const { return ident; }
bool empty () const { return ident.empty (); }
private:
std::string ident;
NodeId node_id;
+ Location loc;
};
std::ostream &
}
// "Error state" if ident is empty, so base stripping on this.
- void mark_for_strip () override { ident = {}; }
+ void mark_for_strip () override { ident = {""}; }
bool is_marked_for_strip () const override { return ident.empty (); }
const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
{
return nullptr;
}
- Identifier rule_name = ident_tok->get_str ();
+ Identifier rule_name{ident_tok};
// DEBUG
rust_debug ("in macro rules def, about to parse parens.");
{
return nullptr;
}
- Identifier rule_name = ident_tok->get_str ();
+ Identifier rule_name{ident_tok};
t = lexer.peek_token ();
if (t->get_id () == LEFT_PAREN)
Location fragment_locus = lexer.peek_token ()->get_locus ();
skip_token (DOLLAR_SIGN);
- Identifier ident{""};
+ Identifier ident;
auto identifier = lexer.peek_token ();
if (identifier->get_id () == UNDERSCORE)
- ident = {"_"};
+ ident = {"_", identifier->get_locus ()};
else
- ident = identifier->get_str ();
+ ident = {identifier};
if (ident.empty ())
{
{
return nullptr;
}
- Identifier name{module_name->get_str ()};
+ Identifier name{module_name};
const_TokenPtr t = lexer.peek_token ();
return std::unique_ptr<AST::UseTreeRebind> (
new AST::UseTreeRebind (AST::UseTreeRebind::IDENTIFIER,
- std::move (path), locus,
- t->get_str ()));
+ std::move (path), locus, t));
case UNDERSCORE:
// skip lexer token
lexer.skip_token ();
return std::unique_ptr<AST::UseTreeRebind> (
new AST::UseTreeRebind (AST::UseTreeRebind::WILDCARD,
- std::move (path), locus, {"_"}));
+ std::move (path), locus,
+ {"_", t->get_locus ()}));
default:
add_error (Error (
t->get_locus (),
skip_after_next_block ();
return nullptr;
}
- Identifier function_name = function_name_tok->get_str ();
+ Identifier function_name{function_name_tok};
// parse generic params - if exist
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
// identifier
return nullptr;
}
- // TODO: create identifier from identifier token
- Identifier ident = identifier_tok->get_str ();
+ Identifier ident{identifier_tok};
lexer.skip_token ();
// parse type param bounds (if they exist)
skip_after_semicolon ();
return nullptr;
}
- Identifier alias_name = alias_name_tok->get_str ();
+ Identifier alias_name{alias_name_tok};
// parse generic params, which may not exist
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
// skip after somewhere?
return nullptr;
}
- Identifier struct_name = name_tok->get_str ();
+ Identifier struct_name{name_tok};
// parse generic params, which may or may not exist
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
// necessarily error
return AST::StructField::create_error ();
}
- Identifier field_name = field_name_tok->get_str ();
+ Identifier field_name{field_name_tok};
lexer.skip_token ();
if (!skip_token (COLON))
if (enum_name_tok == nullptr)
return nullptr;
- Identifier enum_name = enum_name_tok->get_str ();
+ Identifier enum_name = {enum_name_tok};
// parse generic params (of enum container, not enum variants) if they exist
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
return nullptr;
}
lexer.skip_token ();
- Identifier item_name = item_name_tok->get_str ();
+ Identifier item_name{item_name_tok};
// branch based on next token
const_TokenPtr t = lexer.peek_token ();
skip_after_next_block ();
return nullptr;
}
- Identifier union_name = union_name_tok->get_str ();
+ Identifier union_name{union_name_tok};
// parse optional generic parameters
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
if (ident_tok == nullptr)
return nullptr;
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
if (!skip_token (COLON))
{
if (ident_tok == nullptr)
return nullptr;
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
// parse generic parameters (if they exist)
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
if (ident_tok == nullptr)
return nullptr;
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
// parse generic params
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
if (ident_tok == nullptr)
return nullptr;
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
std::vector<std::unique_ptr<AST::TypeParamBound>> bounds;
if (ident_tok == nullptr)
return nullptr;
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
if (!skip_token (COLON))
{
if (ident_tok == nullptr)
return nullptr;
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
// parse generic params
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
{
return nullptr;
}
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
// DEBUG:
rust_debug (
skip_after_semicolon ();
return nullptr;
}
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
if (!skip_token (COLON))
{
skip_after_semicolon ();
return nullptr;
}
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
// parse (optional) generic params
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
return AST::GenericArgsBinding::create_error ();
}
lexer.skip_token ();
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
if (!skip_token (EQUAL))
{
skip_after_next_block ();
return AST::Method::create_error ();
}
- Identifier method_name = ident_tok->get_str ();
+ Identifier method_name{ident_tok};
// parse generic params - if exist
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
if (current->get_id () == IDENTIFIER && next->get_id () == COLON)
{
// named param
- name = current->get_str ();
+ name = {current};
kind = AST::MaybeNamedParam::IDENTIFIER;
lexer.skip_token (1);
}
else if (current->get_id () == UNDERSCORE && next->get_id () == COLON)
{
// wildcard param
- name = {"_"};
+ name = {"_", current->get_locus ()};
kind = AST::MaybeNamedParam::WILDCARD;
lexer.skip_token (1);
}
// skip somewhere?
return nullptr;
}
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
// DEBUG
rust_debug ("parsed identifier in identifier pattern");
{
case COLON: {
// identifier-pattern
- Identifier ident = t->get_str ();
+ Identifier ident{t};
lexer.skip_token ();
skip_token (COLON);
case COMMA:
case RIGHT_CURLY: {
// identifier only
- Identifier ident = t->get_str ();
+ Identifier ident = {t};
lexer.skip_token ();
return std::unique_ptr<AST::StructPatternFieldIdent> (
{
return nullptr;
}
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
return std::unique_ptr<AST::StructPatternFieldIdent> (
new AST::StructPatternFieldIdent (std::move (ident), has_ref, has_mut,
if (lexer.peek_token (1)->get_id () == COLON)
{
// struct expr field with identifier and expr
- Identifier ident = t->get_str ();
+ Identifier ident = {t};
lexer.skip_token (1);
// parse expression (required)
else
{
// struct expr field with identifier only
- Identifier ident = t->get_str ();
+ Identifier ident{t};
lexer.skip_token ();
return std::unique_ptr<AST::StructExprFieldIdentifier> (
if (ident_tok == nullptr)
return nullptr;
- Identifier ident = ident_tok->get_str ();
+ Identifier ident{ident_tok};
Location locus = struct_expr->get_locus ();