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:
Pierre-Emmanuel Patry 2023-11-08 14:54:51 +01:00 committed by Arthur Cohen
parent 8f41baaa83
commit e50b0969b8
3 changed files with 16 additions and 19 deletions

View File

@ -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 ())

View File

@ -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

View File

@ -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: