blob: a097299bd41a2f796848baecbaf71c612f9bf0de [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/zxdb/expr/keywords.h"
namespace zxdb {
namespace {
const char* kCKeywords[] = {
"alignas", "alignof", "and", "and_eq",
"asm", "auto", "bitand", "bitor",
"bool", "break", "case", "catch",
"char", "char8_t", "char16_t", "char32_t",
"class", "compl", "concept", "const",
"consteval", "constexpr", "constinit", "const_cast",
"continue", "co_await", "co_return", "co_yield",
"decltype", "default", "delete", "do",
"double", "dynamic_cast", "else", "enum",
"explicit", "export", "extern", "false",
"float", "for", "friend", "goto",
"if", "inline", "int", "long",
"mutable", "namespace", "new", "noexcept",
"not", "not_eq", "nullptr", "operator",
"or", "or_eq", "private", "protected",
"public", "reflexpr", "register", "reinterpret_cast",
"requires", "return", "short", "signed",
"sizeof", "static", "static_assert", "static_cast",
"struct", "switch", "template", "this",
"thread_local", "throw", "true", "try",
"typedef", "typeid", "typename", "union",
"unsigned", "using", "virtual", "void",
"volatile", "wchar_t", "while", "xor",
"xor_eq",
};
const std::set<std::string>& GetCKeywords() {
static std::set<std::string> keywords;
if (keywords.empty()) {
for (const char* keyword : kCKeywords)
keywords.insert(keyword);
}
return keywords;
}
// Extra "permissive" keywords for syntax highlighting purposes.
const char* kCKeywordsPermissive[] = {
"int8_t", "uint8_t", "int16_t", "uint16_t", "int32_t", "uint32_t", "int64_t",
"uint64_t", "intptr_t", "uintptr_t", "intmax_t", "uintmax_t", "size_t", "ssize_t",
"ptrdiff_t", "nullptr_t", "max_align_t", "byte", "offsetof", "NULL", "std",
};
const std::set<std::string>& GetCKeywordsPermissive() {
static std::set<std::string> keywords;
if (keywords.empty()) {
for (const char* keyword : kCKeywords)
keywords.insert(keyword);
for (const char* keyword : kCKeywordsPermissive)
keywords.insert(keyword);
}
return keywords;
}
const char* kRustKeywords[] = {
"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn",
"for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut",
"pub", "ref", "return", "self", "Self", "static", "struct", "super", "trait", "true",
"type", "unsafe", "use", "where", "while", "async", "await", "dyn", "union",
};
const std::set<std::string>& GetRustKeywords() {
static std::set<std::string> keywords;
if (keywords.empty()) {
for (const char* keyword : kRustKeywords)
keywords.insert(keyword);
}
return keywords;
}
// Extra "permissive" keywords for syntax highlighting purposes.
const char* kRustKeywordsPermissive[] = {
"bool", "char", "i8", "u8", "i16", "u16", "i32", "u32", "i64",
"u64", "i128", "u128", "isize", "usize", "f32", "f64", "str",
};
const std::set<std::string>& GetRustKeywordsPermissive() {
static std::set<std::string> keywords;
if (keywords.empty()) {
for (const char* keyword : kRustKeywords)
keywords.insert(keyword);
for (const char* keyword : kRustKeywordsPermissive)
keywords.insert(keyword);
}
return keywords;
}
} // namespace
const std::set<std::string>& AllKeywordsForLanguage(ExprLanguage language, bool permissive) {
switch (language) {
case ExprLanguage::kC:
if (permissive)
return GetCKeywordsPermissive();
return GetCKeywords();
case ExprLanguage::kRust:
if (permissive)
return GetRustKeywordsPermissive();
return GetRustKeywords();
}
static std::set<std::string> empty;
return empty;
}
} // namespace zxdb