1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-11 13:10:58 +00:00

Improve ScriptLanguage get keyword API.

This commit is contained in:
Yufeng Ying
2025-01-15 21:47:43 +08:00
parent 34f005d810
commit 1384e82c2c
13 changed files with 87 additions and 123 deletions

View File

@@ -255,11 +255,11 @@ public:
};
void get_core_type_words(List<String> *p_core_type_words) const;
virtual void get_reserved_words(List<String> *p_words) const = 0;
virtual Vector<String> get_reserved_words() const = 0;
virtual bool is_control_flow_keyword(const String &p_string) const = 0;
virtual void get_comment_delimiters(List<String> *p_delimiters) const = 0;
virtual void get_doc_comment_delimiters(List<String> *p_delimiters) const = 0;
virtual void get_string_delimiters(List<String> *p_delimiters) const = 0;
virtual Vector<String> get_comment_delimiters() const = 0;
virtual Vector<String> get_doc_comment_delimiters() const = 0;
virtual Vector<String> get_string_delimiters() const = 0;
virtual Ref<Script> make_template(const String &p_template, const String &p_class_name, const String &p_base_class_name) const { return Ref<Script>(); }
virtual Vector<ScriptTemplate> get_built_in_templates(const StringName &p_object) { return Vector<ScriptTemplate>(); }
virtual bool is_using_templates() { return false; }

View File

@@ -239,43 +239,35 @@ public:
GDVIRTUAL0RC_REQUIRED(Vector<String>, _get_reserved_words)
virtual void get_reserved_words(List<String> *p_words) const override {
virtual Vector<String> get_reserved_words() const override {
Vector<String> ret;
GDVIRTUAL_CALL(_get_reserved_words, ret);
for (int i = 0; i < ret.size(); i++) {
p_words->push_back(ret[i]);
}
return ret;
}
EXBIND1RC(bool, is_control_flow_keyword, const String &)
GDVIRTUAL0RC_REQUIRED(Vector<String>, _get_comment_delimiters)
virtual void get_comment_delimiters(List<String> *p_words) const override {
virtual Vector<String> get_comment_delimiters() const override {
Vector<String> ret;
GDVIRTUAL_CALL(_get_comment_delimiters, ret);
for (int i = 0; i < ret.size(); i++) {
p_words->push_back(ret[i]);
}
return ret;
}
GDVIRTUAL0RC(Vector<String>, _get_doc_comment_delimiters)
virtual void get_doc_comment_delimiters(List<String> *p_words) const override {
virtual Vector<String> get_doc_comment_delimiters() const override {
Vector<String> ret;
GDVIRTUAL_CALL(_get_doc_comment_delimiters, ret);
for (int i = 0; i < ret.size(); i++) {
p_words->push_back(ret[i]);
}
return ret;
}
GDVIRTUAL0RC_REQUIRED(Vector<String>, _get_string_delimiters)
virtual void get_string_delimiters(List<String> *p_words) const override {
virtual Vector<String> get_string_delimiters() const override {
Vector<String> ret;
GDVIRTUAL_CALL(_get_string_delimiters, ret);
for (int i = 0; i < ret.size(); i++) {
p_words->push_back(ret[i]);
}
return ret;
}
EXBIND3RC(Ref<Script>, make_template, const String &, const String &, const String &)

View File

@@ -130,10 +130,8 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin
}
for (int i = 0; i < ScriptServer::get_language_count(); i++) {
List<String> keywords;
ScriptServer::get_language(i)->get_reserved_words(&keywords);
for (const String &E : keywords) {
if (E == p_name) {
for (const String &keyword : ScriptServer::get_language(i)->get_reserved_words()) {
if (keyword == p_name) {
if (r_error) {
*r_error = TTR("Invalid name.") + " " + TTR("Keyword cannot be used as an Autoload name.");
}

View File

@@ -511,19 +511,16 @@ Ref<Texture2D> EditorScriptPreviewPlugin::_generate_from_source_code(const Scrip
return Ref<Texture2D>();
}
List<String> kwors;
if (p_language) {
p_language->get_reserved_words(&kwors);
}
HashSet<String> control_flow_keywords;
HashSet<String> keywords;
for (const String &E : kwors) {
if (p_language && p_language->is_control_flow_keyword(E)) {
control_flow_keywords.insert(E);
} else {
keywords.insert(E);
if (p_language) {
for (const String &keyword : p_language->get_reserved_words()) {
if (p_language->is_control_flow_keyword(keyword)) {
control_flow_keywords.insert(keyword);
} else {
keywords.insert(keyword);
}
}
}

View File

@@ -164,13 +164,11 @@ void EditorStandardSyntaxHighlighter::_update_cache() {
/* Reserved words. */
const Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color");
const Color control_flow_keyword_color = EDITOR_GET("text_editor/theme/highlighting/control_flow_keyword_color");
List<String> keywords;
scr_lang->get_reserved_words(&keywords);
for (const String &E : keywords) {
if (scr_lang->is_control_flow_keyword(E)) {
highlighter->add_keyword_color(E, control_flow_keyword_color);
for (const String &keyword : scr_lang->get_reserved_words()) {
if (scr_lang->is_control_flow_keyword(keyword)) {
highlighter->add_keyword_color(keyword, control_flow_keyword_color);
} else {
highlighter->add_keyword_color(E, keyword_color);
highlighter->add_keyword_color(keyword, keyword_color);
}
}
@@ -199,9 +197,7 @@ void EditorStandardSyntaxHighlighter::_update_cache() {
/* Comments */
const Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color");
List<String> comments;
scr_lang->get_comment_delimiters(&comments);
for (const String &comment : comments) {
for (const String &comment : scr_lang->get_comment_delimiters()) {
String beg = comment.get_slicec(' ', 0);
String end = comment.get_slice_count(" ") > 1 ? comment.get_slicec(' ', 1) : String();
highlighter->add_color_region(beg, end, comment_color, end.is_empty());
@@ -209,9 +205,7 @@ void EditorStandardSyntaxHighlighter::_update_cache() {
/* Doc comments */
const Color doc_comment_color = EDITOR_GET("text_editor/theme/highlighting/doc_comment_color");
List<String> doc_comments;
scr_lang->get_doc_comment_delimiters(&doc_comments);
for (const String &doc_comment : doc_comments) {
for (const String &doc_comment : scr_lang->get_doc_comment_delimiters()) {
String beg = doc_comment.get_slicec(' ', 0);
String end = doc_comment.get_slice_count(" ") > 1 ? doc_comment.get_slicec(' ', 1) : String();
highlighter->add_color_region(beg, end, doc_comment_color, end.is_empty());
@@ -219,9 +213,7 @@ void EditorStandardSyntaxHighlighter::_update_cache() {
/* Strings */
const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color");
List<String> strings;
scr_lang->get_string_delimiters(&strings);
for (const String &string : strings) {
for (const String &string : scr_lang->get_string_delimiters()) {
String beg = string.get_slicec(' ', 0);
String end = string.get_slice_count(" ") > 1 ? string.get_slicec(' ', 1) : String();
highlighter->add_color_region(beg, end, string_color, end.is_empty());

View File

@@ -233,8 +233,7 @@ void ScriptTextEditor::_set_theme_for_script() {
CodeEdit *text_edit = code_editor->get_text_editor();
text_edit->get_syntax_highlighter()->update_cache();
List<String> strings;
script->get_language()->get_string_delimiters(&strings);
Vector<String> strings = script->get_language()->get_string_delimiters();
text_edit->clear_string_delimiters();
for (const String &string : strings) {
String beg = string.get_slicec(' ', 0);
@@ -250,9 +249,7 @@ void ScriptTextEditor::_set_theme_for_script() {
text_edit->clear_comment_delimiters();
List<String> comments;
script->get_language()->get_comment_delimiters(&comments);
for (const String &comment : comments) {
for (const String &comment : script->get_language()->get_comment_delimiters()) {
String beg = comment.get_slicec(' ', 0);
String end = comment.get_slice_count(" ") > 1 ? comment.get_slicec(' ', 1) : String();
text_edit->add_comment_delimiter(beg, end, end.is_empty());
@@ -262,9 +259,7 @@ void ScriptTextEditor::_set_theme_for_script() {
}
}
List<String> doc_comments;
script->get_language()->get_doc_comment_delimiters(&doc_comments);
for (const String &doc_comment : doc_comments) {
for (const String &doc_comment : script->get_language()->get_doc_comment_delimiters()) {
String beg = doc_comment.get_slicec(' ', 0);
String end = doc_comment.get_slice_count(" ") > 1 ? doc_comment.get_slicec(' ', 1) : String();
text_edit->add_comment_delimiter(beg, end, end.is_empty());
@@ -1990,10 +1985,8 @@ void ScriptTextEditor::_edit_option_toggle_inline_comment() {
}
String delimiter = "#";
List<String> comment_delimiters;
script->get_language()->get_comment_delimiters(&comment_delimiters);
for (const String &script_delimiter : comment_delimiters) {
for (const String &script_delimiter : script->get_language()->get_comment_delimiters()) {
if (!script_delimiter.contains_char(' ')) {
delimiter = script_delimiter;
break;

View File

@@ -746,9 +746,7 @@ ScriptLanguage::ScriptTemplate ScriptCreateDialog::_parse_template(const ScriptL
int space_indent_size = 4;
// Get meta delimiter
String meta_delimiter;
List<String> comment_delimiters;
p_language->get_comment_delimiters(&comment_delimiters);
for (const String &script_delimiter : comment_delimiters) {
for (const String &script_delimiter : p_language->get_comment_delimiters()) {
if (!script_delimiter.contains_char(' ')) {
meta_delimiter = script_delimiter;
break;

View File

@@ -756,13 +756,11 @@ void GDScriptSyntaxHighlighter::_update_cache() {
/* Reserved words. */
const Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color");
const Color control_flow_keyword_color = EDITOR_GET("text_editor/theme/highlighting/control_flow_keyword_color");
List<String> keyword_list;
gdscript->get_reserved_words(&keyword_list);
for (const String &E : keyword_list) {
if (gdscript->is_control_flow_keyword(E)) {
reserved_keywords[StringName(E)] = control_flow_keyword_color;
for (const String &keyword : gdscript->get_reserved_words()) {
if (gdscript->is_control_flow_keyword(keyword)) {
reserved_keywords[StringName(keyword)] = control_flow_keyword_color;
} else {
reserved_keywords[StringName(E)] = keyword_color;
reserved_keywords[StringName(keyword)] = keyword_color;
}
}
@@ -783,9 +781,7 @@ void GDScriptSyntaxHighlighter::_update_cache() {
/* Comments */
const Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color");
List<String> comments;
gdscript->get_comment_delimiters(&comments);
for (const String &comment : comments) {
for (const String &comment : gdscript->get_comment_delimiters()) {
String beg = comment.get_slicec(' ', 0);
String end = comment.get_slice_count(" ") > 1 ? comment.get_slicec(' ', 1) : String();
add_color_region(ColorRegion::TYPE_COMMENT, beg, end, comment_color, end.is_empty());
@@ -793,9 +789,7 @@ void GDScriptSyntaxHighlighter::_update_cache() {
/* Doc comments */
const Color doc_comment_color = EDITOR_GET("text_editor/theme/highlighting/doc_comment_color");
List<String> doc_comments;
gdscript->get_doc_comment_delimiters(&doc_comments);
for (const String &doc_comment : doc_comments) {
for (const String &doc_comment : gdscript->get_doc_comment_delimiters()) {
String beg = doc_comment.get_slicec(' ', 0);
String end = doc_comment.get_slice_count(" ") > 1 ? doc_comment.get_slicec(' ', 1) : String();
add_color_region(ColorRegion::TYPE_COMMENT, beg, end, doc_comment_color, end.is_empty());

View File

@@ -2731,9 +2731,9 @@ void GDScriptLanguage::frame() {
}
/* EDITOR FUNCTIONS */
void GDScriptLanguage::get_reserved_words(List<String> *p_words) const {
Vector<String> GDScriptLanguage::get_reserved_words() const {
// Please keep alphabetical order within categories.
static const char *_reserved_words[] = {
static const Vector<String> ret = {
// Control flow.
"break",
"continue",
@@ -2786,15 +2786,9 @@ void GDScriptLanguage::get_reserved_words(List<String> *p_words) const {
"preload",
// Types (highlighter uses type color instead).
"void",
nullptr,
};
const char **w = _reserved_words;
while (*w) {
p_words->push_back(*w);
w++;
}
return ret;
}
bool GDScriptLanguage::is_control_flow_keyword(const String &p_keyword) const {

View File

@@ -603,11 +603,11 @@ public:
virtual void finish() override;
/* EDITOR FUNCTIONS */
virtual void get_reserved_words(List<String> *p_words) const override;
virtual Vector<String> get_reserved_words() const override;
virtual bool is_control_flow_keyword(const String &p_keywords) const override;
virtual void get_comment_delimiters(List<String> *p_delimiters) const override;
virtual void get_doc_comment_delimiters(List<String> *p_delimiters) const override;
virtual void get_string_delimiters(List<String> *p_delimiters) const override;
virtual Vector<String> get_comment_delimiters() const override;
virtual Vector<String> get_doc_comment_delimiters() const override;
virtual Vector<String> get_string_delimiters() const override;
virtual bool is_using_templates() override;
virtual Ref<Script> make_template(const String &p_template, const String &p_class_name, const String &p_base_class_name) const override;
virtual Vector<ScriptTemplate> get_built_in_templates(const StringName &p_object) override;

View File

@@ -51,20 +51,25 @@
#include "editor/editor_settings.h"
#endif
void GDScriptLanguage::get_comment_delimiters(List<String> *p_delimiters) const {
p_delimiters->push_back("#");
Vector<String> GDScriptLanguage::get_comment_delimiters() const {
static const Vector<String> delimiters = { "#" };
return delimiters;
}
void GDScriptLanguage::get_doc_comment_delimiters(List<String> *p_delimiters) const {
p_delimiters->push_back("##");
Vector<String> GDScriptLanguage::get_doc_comment_delimiters() const {
static const Vector<String> delimiters = { "##" };
return delimiters;
}
void GDScriptLanguage::get_string_delimiters(List<String> *p_delimiters) const {
p_delimiters->push_back("\" \"");
p_delimiters->push_back("' '");
p_delimiters->push_back("\"\"\" \"\"\"");
p_delimiters->push_back("''' '''");
Vector<String> GDScriptLanguage::get_string_delimiters() const {
static const Vector<String> delimiters = {
"\" \"",
"' '",
"\"\"\" \"\"\"",
"''' '''",
};
// NOTE: StringName, NodePath and r-strings are not listed here.
return delimiters;
}
bool GDScriptLanguage::is_using_templates() {

View File

@@ -187,8 +187,8 @@ void CSharpLanguage::finalize() {
finalized = true;
}
void CSharpLanguage::get_reserved_words(List<String> *p_words) const {
static const char *_reserved_words[] = {
Vector<String> CSharpLanguage::get_reserved_words() const {
static const Vector<String> ret = {
// Reserved keywords
"abstract",
"as",
@@ -298,15 +298,9 @@ void CSharpLanguage::get_reserved_words(List<String> *p_words) const {
"when",
"where",
"yield",
nullptr
};
const char **w = _reserved_words;
while (*w) {
p_words->push_back(*w);
w++;
}
return ret;
}
bool CSharpLanguage::is_control_flow_keyword(const String &p_keyword) const {
@@ -329,21 +323,30 @@ bool CSharpLanguage::is_control_flow_keyword(const String &p_keyword) const {
p_keyword == "while";
}
void CSharpLanguage::get_comment_delimiters(List<String> *p_delimiters) const {
p_delimiters->push_back("//"); // single-line comment
p_delimiters->push_back("/* */"); // delimited comment
Vector<String> CSharpLanguage::get_comment_delimiters() const {
static const Vector<String> delimiters = {
"//", // single-line comment
"/* */" // delimited comment
};
return delimiters;
}
void CSharpLanguage::get_doc_comment_delimiters(List<String> *p_delimiters) const {
p_delimiters->push_back("///"); // single-line doc comment
p_delimiters->push_back("/** */"); // delimited doc comment
Vector<String> CSharpLanguage::get_doc_comment_delimiters() const {
static const Vector<String> delimiters = {
"///", // single-line doc comment
"/** */" // delimited doc comment
};
return delimiters;
}
void CSharpLanguage::get_string_delimiters(List<String> *p_delimiters) const {
p_delimiters->push_back("' '"); // character literal
p_delimiters->push_back("\" \""); // regular string literal
p_delimiters->push_back("@\" \""); // verbatim string literal
Vector<String> CSharpLanguage::get_string_delimiters() const {
static const Vector<String> delimiters = {
"' '", // character literal
"\" \"", // regular string literal
"@\" \"" // verbatim string literal
};
// Generic string highlighting suffices as a workaround for now.
return delimiters;
}
static String get_base_class_name(const String &p_base_class_name, const String p_class_name) {
@@ -387,9 +390,7 @@ Vector<ScriptLanguage::ScriptTemplate> CSharpLanguage::get_built_in_templates(co
String CSharpLanguage::validate_path(const String &p_path) const {
String class_name = p_path.get_file().get_basename();
List<String> keywords;
get_reserved_words(&keywords);
if (keywords.find(class_name)) {
if (get_reserved_words().has(class_name)) {
return RTR("Class name can't be a reserved keyword");
}
if (!TS->is_valid_identifier(class_name)) {

View File

@@ -499,11 +499,11 @@ public:
void finalize();
/* EDITOR FUNCTIONS */
void get_reserved_words(List<String> *p_words) const override;
Vector<String> get_reserved_words() const override;
bool is_control_flow_keyword(const String &p_keyword) const override;
void get_comment_delimiters(List<String> *p_delimiters) const override;
void get_doc_comment_delimiters(List<String> *p_delimiters) const override;
void get_string_delimiters(List<String> *p_delimiters) const override;
Vector<String> get_comment_delimiters() const override;
Vector<String> get_doc_comment_delimiters() const override;
Vector<String> get_string_delimiters() const override;
bool is_using_templates() override;
virtual Ref<Script> make_template(const String &p_template, const String &p_class_name, const String &p_base_class_name) const override;
virtual Vector<ScriptTemplate> get_built_in_templates(const StringName &p_object) override;