Skip to content

Commit 5d8f78c

Browse files
tamaroningphilberty
authored andcommitted
gccrs: Add location info to Rust::Identifier
gcc/rust/ChangeLog: * ast/rust-ast.h: Modify constructors of `Rust::Identifier` * ast/rust-pattern.h: Likewise. * hir/tree/rust-hir-item.h: Likewise. * parse/rust-parse-impl.h (Parser::parse_macro_rules_def): Likewise. (Parser::parse_decl_macro_def): Likewise. (Parser::parse_macro_match_fragment): Likewise. (Parser::parse_module): Likewise. (Parser::parse_use_tree): Likewise. (Parser::parse_function): Likewise. (Parser::parse_type_param): Likewise. (Parser::parse_type_alias): Likewise. (Parser::parse_struct): Likewise. (Parser::parse_struct_field): Likewise. (Parser::parse_enum): Likewise. (Parser::parse_enum_item): Likewise. (Parser::parse_union): Likewise. (Parser::parse_static_item): Likewise. (Parser::parse_trait): Likewise. (Parser::parse_trait_item): Likewise. (Parser::parse_trait_type): Likewise. (Parser::parse_trait_const): Likewise. (Parser::parse_external_item): Likewise. (Parser::parse_generic_args_binding): Likewise. (Parser::parse_method): Likewise. (Parser::parse_maybe_named_param): Likewise. (Parser::parse_identifier_pattern): Likewise. (Parser::parse_struct_expr_field): Likewise. (ResolveItem::visit): Likewise. * typecheck/rust-hir-type-check-implitem.cc (TypeCheckImplItem::visit):Add comments * resolve/rust-ast-resolve-item.cc (ResolveTraitItems::visit): Likewise. * checks/lints/rust-lint-scan-deadcode.h: Fix error location Signed-off-by: Raiki Tamura <[email protected]>
1 parent 0f898a4 commit 5d8f78c

File tree

7 files changed

+64
-45
lines changed

7 files changed

+64
-45
lines changed

gcc/rust/ast/rust-ast.h

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,21 @@ struct MacroExpander;
3535
class Identifier
3636
{
3737
public:
38-
Identifier (std::string ident = "")
39-
: ident (ident), node_id (Analysis::Mappings::get ()->get_next_node_id ())
38+
// Create dummy identifier
39+
Identifier ()
40+
: ident (""), node_id (Analysis::Mappings::get ()->get_next_node_id ()),
41+
loc (Location ())
42+
{}
43+
// Create identifier with dummy location
44+
Identifier (std::string ident, Location loc = Location ())
45+
: ident (ident), node_id (Analysis::Mappings::get ()->get_next_node_id ()),
46+
loc (loc)
47+
{}
48+
// Create identifier from token
49+
Identifier (const_TokenPtr token)
50+
: ident (token->get_str ()),
51+
node_id (Analysis::Mappings::get ()->get_next_node_id ()),
52+
loc (token->get_locus ())
4053
{}
4154

4255
Identifier (const Identifier &) = default;
@@ -45,13 +58,15 @@ class Identifier
4558
Identifier &operator= (Identifier &&) = default;
4659

4760
NodeId get_node_id () const { return node_id; }
61+
Location get_locus () const { return loc; }
4862
const std::string &as_string () const { return ident; }
4963

5064
bool empty () const { return ident.empty (); }
5165

5266
private:
5367
std::string ident;
5468
NodeId node_id;
69+
Location loc;
5570
};
5671

5772
std::ostream &
@@ -1099,7 +1114,7 @@ class IdentifierExpr : public ExprWithoutBlock
10991114
}
11001115

11011116
// "Error state" if ident is empty, so base stripping on this.
1102-
void mark_for_strip () override { ident = {}; }
1117+
void mark_for_strip () override { ident = {""}; }
11031118
bool is_marked_for_strip () const override { return ident.empty (); }
11041119

11051120
const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }

gcc/rust/ast/rust-pattern.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,7 @@ class StructPatternFieldIdent : public StructPatternField
772772
void accept_vis (ASTVisitor &vis) override;
773773

774774
// based on idea of identifier no longer existing
775-
void mark_for_strip () override { ident = {}; }
775+
void mark_for_strip () override { ident = {""}; }
776776
bool is_marked_for_strip () const override { return ident.empty (); }
777777

778778
const Identifier &get_identifier () const { return ident; }

gcc/rust/checks/lints/rust-lint-scan-deadcode.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,16 @@ class ScanDeadcode : public MarkLiveBase
6060
if (!implBlock->has_trait_ref ())
6161
{
6262
rust_warning_at (
63-
function.get_locus (), 0,
63+
function.get_function_name ().get_locus (), 0,
6464
"associated function is never used: %<%s%>",
6565
function.get_function_name ().as_string ().c_str ());
6666
}
6767
}
6868
else
6969
{
7070
rust_warning_at (
71-
function.get_locus (), 0, "function is never used: %<%s%>",
71+
function.get_function_name ().get_locus (), 0,
72+
"function is never used: %<%s%>",
7273
function.get_function_name ().as_string ().c_str ());
7374
}
7475
}

gcc/rust/hir/tree/rust-hir-item.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ class Module : public VisItem, public WithInnerAttrs
687687

688688
// Copy constructor with vector clone
689689
Module (Module const &other)
690-
: VisItem (other), WithInnerAttrs (other.inner_attrs)
690+
: VisItem (other), WithInnerAttrs (other.inner_attrs), module_name ("")
691691
{
692692
items.reserve (other.items.size ());
693693
for (const auto &e : other.items)

gcc/rust/parse/rust-parse-impl.h

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,7 +1439,7 @@ Parser<ManagedTokenSource>::parse_macro_rules_def (AST::AttrVec outer_attrs)
14391439
{
14401440
return nullptr;
14411441
}
1442-
Identifier rule_name = ident_tok->get_str ();
1442+
Identifier rule_name{ident_tok};
14431443

14441444
// DEBUG
14451445
rust_debug ("in macro rules def, about to parse parens.");
@@ -1596,7 +1596,7 @@ Parser<ManagedTokenSource>::parse_decl_macro_def (AST::Visibility vis,
15961596
{
15971597
return nullptr;
15981598
}
1599-
Identifier rule_name = ident_tok->get_str ();
1599+
Identifier rule_name{ident_tok};
16001600

16011601
t = lexer.peek_token ();
16021602
if (t->get_id () == LEFT_PAREN)
@@ -2160,12 +2160,12 @@ Parser<ManagedTokenSource>::parse_macro_match_fragment ()
21602160
Location fragment_locus = lexer.peek_token ()->get_locus ();
21612161
skip_token (DOLLAR_SIGN);
21622162

2163-
Identifier ident{""};
2163+
Identifier ident;
21642164
auto identifier = lexer.peek_token ();
21652165
if (identifier->get_id () == UNDERSCORE)
2166-
ident = {"_"};
2166+
ident = {"_", identifier->get_locus ()};
21672167
else
2168-
ident = identifier->get_str ();
2168+
ident = {identifier};
21692169

21702170
if (ident.empty ())
21712171
{
@@ -2411,7 +2411,7 @@ Parser<ManagedTokenSource>::parse_module (AST::Visibility vis,
24112411
{
24122412
return nullptr;
24132413
}
2414-
Identifier name{module_name->get_str ()};
2414+
Identifier name{module_name};
24152415

24162416
const_TokenPtr t = lexer.peek_token ();
24172417

@@ -2817,15 +2817,15 @@ Parser<ManagedTokenSource>::parse_use_tree ()
28172817

28182818
return std::unique_ptr<AST::UseTreeRebind> (
28192819
new AST::UseTreeRebind (AST::UseTreeRebind::IDENTIFIER,
2820-
std::move (path), locus,
2821-
t->get_str ()));
2820+
std::move (path), locus, t));
28222821
case UNDERSCORE:
28232822
// skip lexer token
28242823
lexer.skip_token ();
28252824

28262825
return std::unique_ptr<AST::UseTreeRebind> (
28272826
new AST::UseTreeRebind (AST::UseTreeRebind::WILDCARD,
2828-
std::move (path), locus, {"_"}));
2827+
std::move (path), locus,
2828+
{"_", t->get_locus ()}));
28292829
default:
28302830
add_error (Error (
28312831
t->get_locus (),
@@ -2882,7 +2882,7 @@ Parser<ManagedTokenSource>::parse_function (AST::Visibility vis,
28822882
skip_after_next_block ();
28832883
return nullptr;
28842884
}
2885-
Identifier function_name = function_name_tok->get_str ();
2885+
Identifier function_name{function_name_tok};
28862886

28872887
// parse generic params - if exist
28882888
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -3500,8 +3500,7 @@ Parser<ManagedTokenSource>::parse_type_param ()
35003500
// identifier
35013501
return nullptr;
35023502
}
3503-
// TODO: create identifier from identifier token
3504-
Identifier ident = identifier_tok->get_str ();
3503+
Identifier ident{identifier_tok};
35053504
lexer.skip_token ();
35063505

35073506
// parse type param bounds (if they exist)
@@ -4131,7 +4130,7 @@ Parser<ManagedTokenSource>::parse_type_alias (AST::Visibility vis,
41314130
skip_after_semicolon ();
41324131
return nullptr;
41334132
}
4134-
Identifier alias_name = alias_name_tok->get_str ();
4133+
Identifier alias_name{alias_name_tok};
41354134

41364135
// parse generic params, which may not exist
41374136
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -4191,7 +4190,7 @@ Parser<ManagedTokenSource>::parse_struct (AST::Visibility vis,
41914190
// skip after somewhere?
41924191
return nullptr;
41934192
}
4194-
Identifier struct_name = name_tok->get_str ();
4193+
Identifier struct_name{name_tok};
41954194

41964195
// parse generic params, which may or may not exist
41974196
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -4387,7 +4386,7 @@ Parser<ManagedTokenSource>::parse_struct_field ()
43874386
// necessarily error
43884387
return AST::StructField::create_error ();
43894388
}
4390-
Identifier field_name = field_name_tok->get_str ();
4389+
Identifier field_name{field_name_tok};
43914390
lexer.skip_token ();
43924391

43934392
if (!skip_token (COLON))
@@ -4513,7 +4512,7 @@ Parser<ManagedTokenSource>::parse_enum (AST::Visibility vis,
45134512
if (enum_name_tok == nullptr)
45144513
return nullptr;
45154514

4516-
Identifier enum_name = enum_name_tok->get_str ();
4515+
Identifier enum_name = {enum_name_tok};
45174516

45184517
// parse generic params (of enum container, not enum variants) if they exist
45194518
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -4643,7 +4642,7 @@ Parser<ManagedTokenSource>::parse_enum_item ()
46434642
return nullptr;
46444643
}
46454644
lexer.skip_token ();
4646-
Identifier item_name = item_name_tok->get_str ();
4645+
Identifier item_name{item_name_tok};
46474646

46484647
// branch based on next token
46494648
const_TokenPtr t = lexer.peek_token ();
@@ -4727,7 +4726,7 @@ Parser<ManagedTokenSource>::parse_union (AST::Visibility vis,
47274726
skip_after_next_block ();
47284727
return nullptr;
47294728
}
4730-
Identifier union_name = union_name_tok->get_str ();
4729+
Identifier union_name{union_name_tok};
47314730

47324731
// parse optional generic parameters
47334732
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -4845,7 +4844,7 @@ Parser<ManagedTokenSource>::parse_static_item (AST::Visibility vis,
48454844
if (ident_tok == nullptr)
48464845
return nullptr;
48474846

4848-
Identifier ident = ident_tok->get_str ();
4847+
Identifier ident{ident_tok};
48494848

48504849
if (!skip_token (COLON))
48514850
{
@@ -4906,7 +4905,7 @@ Parser<ManagedTokenSource>::parse_trait (AST::Visibility vis,
49064905
if (ident_tok == nullptr)
49074906
return nullptr;
49084907

4909-
Identifier ident = ident_tok->get_str ();
4908+
Identifier ident{ident_tok};
49104909

49114910
// parse generic parameters (if they exist)
49124911
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -5027,7 +5026,7 @@ Parser<ManagedTokenSource>::parse_trait_item ()
50275026
if (ident_tok == nullptr)
50285027
return nullptr;
50295028

5030-
Identifier ident = ident_tok->get_str ();
5029+
Identifier ident{ident_tok};
50315030

50325031
// parse generic params
50335032
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -5162,7 +5161,7 @@ Parser<ManagedTokenSource>::parse_trait_type (AST::AttrVec outer_attrs)
51625161
if (ident_tok == nullptr)
51635162
return nullptr;
51645163

5165-
Identifier ident = ident_tok->get_str ();
5164+
Identifier ident{ident_tok};
51665165

51675166
std::vector<std::unique_ptr<AST::TypeParamBound>> bounds;
51685167

@@ -5201,7 +5200,7 @@ Parser<ManagedTokenSource>::parse_trait_const (AST::AttrVec outer_attrs)
52015200
if (ident_tok == nullptr)
52025201
return nullptr;
52035202

5204-
Identifier ident = ident_tok->get_str ();
5203+
Identifier ident{ident_tok};
52055204

52065205
if (!skip_token (COLON))
52075206
{
@@ -5568,7 +5567,7 @@ Parser<ManagedTokenSource>::parse_inherent_impl_function_or_method (
55685567
if (ident_tok == nullptr)
55695568
return nullptr;
55705569

5571-
Identifier ident = ident_tok->get_str ();
5570+
Identifier ident{ident_tok};
55725571

55735572
// parse generic params
55745573
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -5763,7 +5762,7 @@ Parser<ManagedTokenSource>::parse_trait_impl_function_or_method (
57635762
{
57645763
return nullptr;
57655764
}
5766-
Identifier ident = ident_tok->get_str ();
5765+
Identifier ident{ident_tok};
57675766

57685767
// DEBUG:
57695768
rust_debug (
@@ -5995,7 +5994,7 @@ Parser<ManagedTokenSource>::parse_external_item ()
59955994
skip_after_semicolon ();
59965995
return nullptr;
59975996
}
5998-
Identifier ident = ident_tok->get_str ();
5997+
Identifier ident{ident_tok};
59995998

60005999
if (!skip_token (COLON))
60016000
{
@@ -6038,7 +6037,7 @@ Parser<ManagedTokenSource>::parse_external_item ()
60386037
skip_after_semicolon ();
60396038
return nullptr;
60406039
}
6041-
Identifier ident = ident_tok->get_str ();
6040+
Identifier ident{ident_tok};
60426041

60436042
// parse (optional) generic params
60446043
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -6620,7 +6619,7 @@ Parser<ManagedTokenSource>::parse_generic_args_binding ()
66206619
return AST::GenericArgsBinding::create_error ();
66216620
}
66226621
lexer.skip_token ();
6623-
Identifier ident = ident_tok->get_str ();
6622+
Identifier ident{ident_tok};
66246623

66256624
if (!skip_token (EQUAL))
66266625
{
@@ -7189,7 +7188,7 @@ Parser<ManagedTokenSource>::parse_method ()
71897188
skip_after_next_block ();
71907189
return AST::Method::create_error ();
71917190
}
7192-
Identifier method_name = ident_tok->get_str ();
7191+
Identifier method_name{ident_tok};
71937192

71947193
// parse generic params - if exist
71957194
std::vector<std::unique_ptr<AST::GenericParam>> generic_params
@@ -9659,14 +9658,14 @@ Parser<ManagedTokenSource>::parse_maybe_named_param (AST::AttrVec outer_attrs)
96599658
if (current->get_id () == IDENTIFIER && next->get_id () == COLON)
96609659
{
96619660
// named param
9662-
name = current->get_str ();
9661+
name = {current};
96639662
kind = AST::MaybeNamedParam::IDENTIFIER;
96649663
lexer.skip_token (1);
96659664
}
96669665
else if (current->get_id () == UNDERSCORE && next->get_id () == COLON)
96679666
{
96689667
// wildcard param
9669-
name = {"_"};
9668+
name = {"_", current->get_locus ()};
96709669
kind = AST::MaybeNamedParam::WILDCARD;
96719670
lexer.skip_token (1);
96729671
}
@@ -11093,7 +11092,7 @@ Parser<ManagedTokenSource>::parse_identifier_pattern ()
1109311092
// skip somewhere?
1109411093
return nullptr;
1109511094
}
11096-
Identifier ident = ident_tok->get_str ();
11095+
Identifier ident{ident_tok};
1109711096

1109811097
// DEBUG
1109911098
rust_debug ("parsed identifier in identifier pattern");
@@ -11518,7 +11517,7 @@ Parser<ManagedTokenSource>::parse_struct_pattern_field_partial (
1151811517
{
1151911518
case COLON: {
1152011519
// identifier-pattern
11521-
Identifier ident = t->get_str ();
11520+
Identifier ident{t};
1152211521
lexer.skip_token ();
1152311522

1152411523
skip_token (COLON);
@@ -11543,7 +11542,7 @@ Parser<ManagedTokenSource>::parse_struct_pattern_field_partial (
1154311542
case COMMA:
1154411543
case RIGHT_CURLY: {
1154511544
// identifier only
11546-
Identifier ident = t->get_str ();
11545+
Identifier ident = {t};
1154711546
lexer.skip_token ();
1154811547

1154911548
return std::unique_ptr<AST::StructPatternFieldIdent> (
@@ -11581,7 +11580,7 @@ Parser<ManagedTokenSource>::parse_struct_pattern_field_partial (
1158111580
{
1158211581
return nullptr;
1158311582
}
11584-
Identifier ident = ident_tok->get_str ();
11583+
Identifier ident{ident_tok};
1158511584

1158611585
return std::unique_ptr<AST::StructPatternFieldIdent> (
1158711586
new AST::StructPatternFieldIdent (std::move (ident), has_ref, has_mut,
@@ -11821,7 +11820,7 @@ Parser<ManagedTokenSource>::parse_struct_expr_field ()
1182111820
if (lexer.peek_token (1)->get_id () == COLON)
1182211821
{
1182311822
// struct expr field with identifier and expr
11824-
Identifier ident = t->get_str ();
11823+
Identifier ident = {t};
1182511824
lexer.skip_token (1);
1182611825

1182711826
// parse expression (required)
@@ -11844,7 +11843,7 @@ Parser<ManagedTokenSource>::parse_struct_expr_field ()
1184411843
else
1184511844
{
1184611845
// struct expr field with identifier only
11847-
Identifier ident = t->get_str ();
11846+
Identifier ident{t};
1184811847
lexer.skip_token ();
1184911848

1185011849
return std::unique_ptr<AST::StructExprFieldIdentifier> (
@@ -13975,7 +13974,7 @@ Parser<ManagedTokenSource>::parse_field_access_expr (
1397513974
if (ident_tok == nullptr)
1397613975
return nullptr;
1397713976

13978-
Identifier ident = ident_tok->get_str ();
13977+
Identifier ident{ident_tok};
1397913978

1398013979
Location locus = struct_expr->get_locus ();
1398113980

0 commit comments

Comments
 (0)