mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
gccrs: Change keyword set to a map
Some part of the code requires the token id behind a given keyword, a map keep the "set" aspect whilst providing this additional feature. gcc/rust/ChangeLog: * lex/rust-lex.cc (RS_TOKEN): Remove local map. (RS_TOKEN_KEYWORD): Likewise. (Lexer::classify_keyword): Change call to utils. * util/rust-keyword-values.cc (get_keywords): Add init function. (RS_TOKEN_KEYWORD): Call to X macro. * util/rust-keyword-values.h: Change from set to a map. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
This commit is contained in:
parent
8f41baaa83
commit
e50b0969b8
@ -24,6 +24,7 @@
|
||||
#include "rust-session-manager.h"
|
||||
#include "safe-ctype.h"
|
||||
#include "cpplib.h"
|
||||
#include "rust-keyword-values.h"
|
||||
|
||||
namespace Rust {
|
||||
// TODO: move to separate compilation unit?
|
||||
@ -254,25 +255,12 @@ Lexer::replace_current_token (TokenPtr replacement)
|
||||
rust_debug ("called 'replace_current_token' - this is deprecated");
|
||||
}
|
||||
|
||||
/* shitty anonymous namespace that can only be accessed inside the compilation
|
||||
* unit - used for classify_keyword binary search in sorted array of keywords
|
||||
* created with x-macros. */
|
||||
namespace {
|
||||
// TODO: make constexpr when update to c++20
|
||||
const std::map<std::string, TokenId> keywords = {
|
||||
#define RS_TOKEN(x, y)
|
||||
#define RS_TOKEN_KEYWORD(tok, key) {key, tok},
|
||||
RS_TOKEN_LIST
|
||||
#undef RS_TOKEN_KEYWORD
|
||||
#undef RS_TOKEN
|
||||
};
|
||||
} // namespace
|
||||
|
||||
/* Determines whether the string passed in is a keyword or not. If it is, it
|
||||
* returns the keyword name. */
|
||||
TokenId
|
||||
Lexer::classify_keyword (const std::string &str)
|
||||
{
|
||||
auto &keywords = Rust::Values::Keywords::keywords;
|
||||
auto keyword = keywords.find (str);
|
||||
|
||||
if (keyword == keywords.end ())
|
||||
|
@ -17,17 +17,26 @@
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "rust-keyword-values.h"
|
||||
#include "rust-token.h"
|
||||
|
||||
namespace Rust {
|
||||
namespace Values {
|
||||
|
||||
const std::set<std::string> Keywords::keywords = {
|
||||
// TODO: Can't we do this inline ?
|
||||
static std::map<std::string, TokenId>
|
||||
get_keywords ()
|
||||
{
|
||||
std::map<std::string, TokenId> m = {
|
||||
#define RS_TOKEN(x, y)
|
||||
#define RS_TOKEN_KEYWORD(tok, key) key,
|
||||
RS_TOKEN_LIST
|
||||
#define RS_TOKEN_KEYWORD(tok, key) {key, tok},
|
||||
RS_TOKEN_LIST
|
||||
#undef RS_TOKEN_KEYWORD
|
||||
#undef RS_TOKEN
|
||||
};
|
||||
};
|
||||
return m;
|
||||
}
|
||||
|
||||
const std::map<std::string, TokenId> Keywords::keywords = get_keywords ();
|
||||
|
||||
} // namespace Values
|
||||
} // namespace Rust
|
||||
|
@ -28,7 +28,7 @@ namespace Values {
|
||||
class Keywords
|
||||
{
|
||||
public:
|
||||
const static std::set<std::string> keywords;
|
||||
const static std::map<std::string, TokenId> keywords;
|
||||
|
||||
// Rust keyword values
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user