Line data Source code
1 : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
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-ast-fragment.h"
20 : #include "rust-macro-builtins.h"
21 : #include "rust-macro-builtins-helpers.h"
22 :
23 : namespace Rust {
24 : tl::optional<AST::Fragment>
25 7 : MacroBuiltin::file_handler (location_t invoc_locus, AST::MacroInvocData &,
26 : AST::InvocKind)
27 : {
28 7 : auto current_file = LOCATION_FILE (invoc_locus);
29 7 : auto file_str = AST::SingleASTNode (make_string (invoc_locus, current_file));
30 7 : auto str_token
31 14 : = make_token (Token::make_string (invoc_locus, std::move (current_file)));
32 :
33 21 : return AST::Fragment ({file_str}, std::move (str_token));
34 7 : }
35 :
36 : tl::optional<AST::Fragment>
37 14 : MacroBuiltin::column_handler (location_t invoc_locus, AST::MacroInvocData &,
38 : AST::InvocKind)
39 : {
40 14 : auto current_column = LOCATION_COLUMN (invoc_locus);
41 :
42 14 : auto str = std::to_string (current_column);
43 14 : auto str_len = str.length ();
44 14 : auto column_tok = make_token (
45 28 : Token::make_int (invoc_locus, str, str_len, IntegerLiteralBase::Decimal));
46 14 : auto column_no = AST::SingleASTNode (std::unique_ptr<AST::Expr> (
47 14 : new AST::LiteralExpr (std::to_string (current_column), AST::Literal::INT,
48 28 : PrimitiveCoreType::CORETYPE_U32, {}, invoc_locus)));
49 :
50 42 : return AST::Fragment ({column_no}, std::move (column_tok));
51 14 : }
52 :
53 : tl::optional<AST::Fragment>
54 15 : MacroBuiltin::line_handler (location_t invoc_locus, AST::MacroInvocData &,
55 : AST::InvocKind)
56 : {
57 15 : auto current_line = LOCATION_LINE (invoc_locus);
58 :
59 15 : auto line_no = AST::SingleASTNode (std::unique_ptr<AST::Expr> (
60 15 : new AST::LiteralExpr (std::to_string (current_line), AST::Literal::INT,
61 30 : PrimitiveCoreType::CORETYPE_U32, {}, invoc_locus)));
62 15 : auto str = std::to_string (current_line);
63 15 : auto str_len = str.length ();
64 15 : auto tok = make_token (
65 30 : Token::make_int (invoc_locus, str, str_len, IntegerLiteralBase::Decimal));
66 :
67 45 : return AST::Fragment ({line_no}, std::move (tok));
68 15 : }
69 : } // namespace Rust
|