1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
// Copyright (C) 2020-2023 Free Software Foundation, Inc.
// This file is part of GCC.
// GCC is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 3, or (at your option) any later
// version.
// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
// You should have received a copy of the GNU General Public License
// along with GCC; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include "rust-token.h"
#include "rust-diagnostics.h"
namespace Rust {
// Hackily defined way to get token description for enum value using x-macros
const char *
get_token_description (TokenId id)
{
switch (id)
{
#define RS_TOKEN(name, descr) \
case name: \
return descr;
#define RS_TOKEN_KEYWORD(x, y) RS_TOKEN (x, y)
RS_TOKEN_LIST
#undef RS_TOKEN_KEYWORD
#undef RS_TOKEN
default:
gcc_unreachable ();
}
}
/* Hackily defined way to get token description as a string for enum value using
* x-macros */
const char *
token_id_to_str (TokenId id)
{
switch (id)
{
#define RS_TOKEN(name, _) \
case name: \
return #name;
#define RS_TOKEN_KEYWORD(x, y) RS_TOKEN (x, y)
RS_TOKEN_LIST
#undef RS_TOKEN_KEYWORD
#undef RS_TOKEN
default:
gcc_unreachable ();
}
}
const char *
get_type_hint_string (PrimitiveCoreType type)
{
switch (type)
{
case CORETYPE_BOOL:
return "bool";
case CORETYPE_CHAR:
return "char";
case CORETYPE_STR:
return "str";
// case CORETYPE_INT:
case CORETYPE_ISIZE:
return "isize";
// case CORETYPE_UINT:
case CORETYPE_USIZE:
return "usize";
case CORETYPE_F32:
return "f32";
case CORETYPE_F64:
return "f64";
case CORETYPE_I8:
return "i8";
case CORETYPE_I16:
return "i16";
case CORETYPE_I32:
return "i32";
case CORETYPE_I64:
return "i64";
case CORETYPE_I128:
return "i128";
case CORETYPE_U8:
return "u8";
case CORETYPE_U16:
return "u16";
case CORETYPE_U32:
return "u32";
case CORETYPE_U64:
return "u64";
case CORETYPE_U128:
return "u128";
case CORETYPE_PURE_DECIMAL:
return "pure_decimal";
case CORETYPE_UNKNOWN:
default:
return "unknown";
}
}
const char *
Token::get_type_hint_str () const
{
return get_type_hint_string (type_hint);
}
const std::string &
Token::get_str () const
{
// FIXME: attempt to return null again
// gcc_assert(str != NULL);
// HACK: allow referencing an empty string
static const std::string empty = "";
if (str == NULL)
{
rust_error_at (get_locus (),
"attempted to get string for %<%s%>, which has no string. "
"returning empty string instead",
get_token_description ());
return empty;
}
return *str;
}
} // namespace Rust
|