Răsfoiți Sursa

Improve ScriptLanguage get keyword API.

Yufeng Ying 6 luni în urmă
părinte
comite
1384e82c2c

+ 4 - 4
core/object/script_language.h

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

+ 8 - 16
core/object/script_language_extension.h

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

+ 2 - 4
editor/editor_autoload_settings.cpp

@@ -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.");
 				}

+ 7 - 10
editor/plugins/editor_preview_plugins.cpp

@@ -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);
+			}
 		}
 	}
 

+ 7 - 15
editor/plugins/script_editor_plugin.cpp

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

+ 4 - 11
editor/plugins/script_text_editor.cpp

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

+ 1 - 3
editor/script_create_dialog.cpp

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

+ 6 - 12
modules/gdscript/editor/gdscript_highlighter.cpp

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

+ 3 - 9
modules/gdscript/gdscript.cpp

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

+ 4 - 4
modules/gdscript/gdscript.h

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

+ 14 - 9
modules/gdscript/gdscript_editor.cpp

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

+ 23 - 22
modules/mono/csharp_script.cpp

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

+ 4 - 4
modules/mono/csharp_script.h

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