Path: blob/master/editor/script/syntax_highlighters.cpp
20860 views
/**************************************************************************/1/* syntax_highlighters.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "syntax_highlighters.h"3132#include "core/config/project_settings.h"33#include "core/object/script_language.h"34#include "editor/settings/editor_settings.h"3536String EditorSyntaxHighlighter::_get_name() const {37String ret = "Unnamed";38GDVIRTUAL_CALL(_get_name, ret);39return ret;40}4142PackedStringArray EditorSyntaxHighlighter::_get_supported_languages() const {43PackedStringArray ret;44GDVIRTUAL_CALL(_get_supported_languages, ret);45return ret;46}4748Ref<EditorSyntaxHighlighter> EditorSyntaxHighlighter::_create() const {49Ref<EditorSyntaxHighlighter> syntax_highlighter;50if (GDVIRTUAL_IS_OVERRIDDEN(_create)) {51GDVIRTUAL_CALL(_create, syntax_highlighter);52} else {53syntax_highlighter.instantiate();54if (get_script_instance()) {55syntax_highlighter->set_script(get_script_instance()->get_script());56}57}58return syntax_highlighter;59}6061void EditorSyntaxHighlighter::_bind_methods() {62ClassDB::bind_method(D_METHOD("_get_edited_resource"), &EditorSyntaxHighlighter::_get_edited_resource);6364GDVIRTUAL_BIND(_get_name)65GDVIRTUAL_BIND(_get_supported_languages)66GDVIRTUAL_BIND(_create)67}6869////7071void EditorStandardSyntaxHighlighter::_update_cache() {72highlighter->set_text_edit(text_edit);73highlighter->clear_keyword_colors();74highlighter->clear_member_keyword_colors();75highlighter->clear_color_regions();7677highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color"));78highlighter->set_function_color(EDITOR_GET("text_editor/theme/highlighting/function_color"));79highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color"));80highlighter->set_member_variable_color(EDITOR_GET("text_editor/theme/highlighting/member_variable_color"));8182/* Engine types. */83const Color type_color = EDITOR_GET("text_editor/theme/highlighting/engine_type_color");84LocalVector<StringName> types;85ClassDB::get_class_list(types);86for (const StringName &type : types) {87highlighter->add_keyword_color(type, type_color);88}8990/* User types. */91const Color usertype_color = EDITOR_GET("text_editor/theme/highlighting/user_type_color");92LocalVector<StringName> global_classes;93ScriptServer::get_global_class_list(global_classes);94for (const StringName &class_name : global_classes) {95highlighter->add_keyword_color(class_name, usertype_color);96}9798/* Autoloads. */99HashMap<StringName, ProjectSettings::AutoloadInfo> autoloads(ProjectSettings::get_singleton()->get_autoload_list());100for (const KeyValue<StringName, ProjectSettings::AutoloadInfo> &E : autoloads) {101const ProjectSettings::AutoloadInfo &info = E.value;102if (info.is_singleton) {103highlighter->add_keyword_color(info.name, usertype_color);104}105}106107const ScriptLanguage *scr_lang = script_language;108StringName instance_base;109110if (scr_lang == nullptr) {111const Ref<Script> scr = _get_edited_resource();112if (scr.is_valid()) {113scr_lang = scr->get_language();114instance_base = scr->get_instance_base_type();115}116}117118if (scr_lang != nullptr) {119/* Core types. */120const Color basetype_color = EDITOR_GET("text_editor/theme/highlighting/base_type_color");121List<String> core_types;122scr_lang->get_core_type_words(&core_types);123for (const String &E : core_types) {124highlighter->add_keyword_color(E, basetype_color);125}126127/* Reserved words. */128const Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color");129const Color control_flow_keyword_color = EDITOR_GET("text_editor/theme/highlighting/control_flow_keyword_color");130for (const String &keyword : scr_lang->get_reserved_words()) {131if (scr_lang->is_control_flow_keyword(keyword)) {132highlighter->add_keyword_color(keyword, control_flow_keyword_color);133} else {134highlighter->add_keyword_color(keyword, keyword_color);135}136}137138/* Member types. */139const Color member_variable_color = EDITOR_GET("text_editor/theme/highlighting/member_variable_color");140if (instance_base != StringName()) {141List<PropertyInfo> plist;142ClassDB::get_property_list(instance_base, &plist);143for (const PropertyInfo &E : plist) {144String prop_name = E.name;145if (E.usage & PROPERTY_USAGE_CATEGORY || E.usage & PROPERTY_USAGE_GROUP || E.usage & PROPERTY_USAGE_SUBGROUP) {146continue;147}148if (prop_name.contains_char('/')) {149continue;150}151highlighter->add_member_keyword_color(prop_name, member_variable_color);152}153154List<String> clist;155ClassDB::get_integer_constant_list(instance_base, &clist);156for (const String &E : clist) {157highlighter->add_member_keyword_color(E, member_variable_color);158}159}160161/* Comments */162const Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color");163for (const String &comment : scr_lang->get_comment_delimiters()) {164String beg = comment.get_slicec(' ', 0);165String end = comment.get_slice_count(" ") > 1 ? comment.get_slicec(' ', 1) : String();166highlighter->add_color_region(beg, end, comment_color, end.is_empty());167}168169/* Doc comments */170const Color doc_comment_color = EDITOR_GET("text_editor/theme/highlighting/doc_comment_color");171for (const String &doc_comment : scr_lang->get_doc_comment_delimiters()) {172String beg = doc_comment.get_slicec(' ', 0);173String end = doc_comment.get_slice_count(" ") > 1 ? doc_comment.get_slicec(' ', 1) : String();174highlighter->add_color_region(beg, end, doc_comment_color, end.is_empty());175}176177/* Strings */178const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color");179for (const String &string : scr_lang->get_string_delimiters()) {180String beg = string.get_slicec(' ', 0);181String end = string.get_slice_count(" ") > 1 ? string.get_slicec(' ', 1) : String();182highlighter->add_color_region(beg, end, string_color, end.is_empty());183}184}185}186187Ref<EditorSyntaxHighlighter> EditorStandardSyntaxHighlighter::_create() const {188Ref<EditorStandardSyntaxHighlighter> syntax_highlighter;189syntax_highlighter.instantiate();190return syntax_highlighter;191}192193////194195Ref<EditorSyntaxHighlighter> EditorPlainTextSyntaxHighlighter::_create() const {196Ref<EditorPlainTextSyntaxHighlighter> syntax_highlighter;197syntax_highlighter.instantiate();198return syntax_highlighter;199}200201////202203void EditorJSONSyntaxHighlighter::_update_cache() {204highlighter->set_text_edit(text_edit);205highlighter->clear_keyword_colors();206highlighter->clear_member_keyword_colors();207highlighter->clear_color_regions();208209highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color"));210highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color"));211212const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color");213highlighter->add_color_region("\"", "\"", string_color);214}215216Ref<EditorSyntaxHighlighter> EditorJSONSyntaxHighlighter::_create() const {217Ref<EditorJSONSyntaxHighlighter> syntax_highlighter;218syntax_highlighter.instantiate();219return syntax_highlighter;220}221222////223224void EditorMarkdownSyntaxHighlighter::_update_cache() {225highlighter->set_text_edit(text_edit);226highlighter->clear_keyword_colors();227highlighter->clear_member_keyword_colors();228highlighter->clear_color_regions();229230// Disable automatic symbolic highlights, as these don't make sense for prose.231highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/text_color"));232highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/text_color"));233highlighter->set_member_variable_color(EDITOR_GET("text_editor/theme/highlighting/text_color"));234highlighter->set_function_color(EDITOR_GET("text_editor/theme/highlighting/text_color"));235236// Headings (any level).237const Color function_color = EDITOR_GET("text_editor/theme/highlighting/function_color");238highlighter->add_color_region("#", "", function_color);239240// Bold.241highlighter->add_color_region("**", "**", function_color);242// `__bold__` syntax is not supported as color regions must begin with a symbol,243// not a character that is valid in an identifier.244245// Code (both inline code and triple-backticks code blocks).246const Color code_color = EDITOR_GET("text_editor/theme/highlighting/engine_type_color");247highlighter->add_color_region("`", "`", code_color);248249// Link (both references and inline links with URLs). The URL is not highlighted.250const Color link_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color");251highlighter->add_color_region("[", "]", link_color);252253// Quote.254const Color quote_color = EDITOR_GET("text_editor/theme/highlighting/string_color");255highlighter->add_color_region(">", "", quote_color, true);256257// HTML comment, which is also supported in Markdown.258const Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color");259highlighter->add_color_region("<!--", "-->", comment_color);260}261262Ref<EditorSyntaxHighlighter> EditorMarkdownSyntaxHighlighter::_create() const {263Ref<EditorMarkdownSyntaxHighlighter> syntax_highlighter;264syntax_highlighter.instantiate();265return syntax_highlighter;266}267268///269270void EditorConfigFileSyntaxHighlighter::_update_cache() {271highlighter->set_text_edit(text_edit);272highlighter->clear_keyword_colors();273highlighter->clear_member_keyword_colors();274highlighter->clear_color_regions();275276highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color"));277highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color"));278// Assume that all function-style syntax is for types such as `Vector2()` and `PackedStringArray()`.279highlighter->set_function_color(EDITOR_GET("text_editor/theme/highlighting/base_type_color"));280281// Disable member variable highlighting as it's not relevant for ConfigFile.282highlighter->set_member_variable_color(EDITOR_GET("text_editor/theme/highlighting/text_color"));283284const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color");285highlighter->add_color_region("\"", "\"", string_color);286287// FIXME: Sections in ConfigFile must be at the beginning of a line. Otherwise, it can be an array within a line.288const Color function_color = EDITOR_GET("text_editor/theme/highlighting/function_color");289highlighter->add_color_region("[", "]", function_color);290291const Color keyword_color = EDITOR_GET("text_editor/theme/highlighting/keyword_color");292highlighter->add_keyword_color("true", keyword_color);293highlighter->add_keyword_color("false", keyword_color);294highlighter->add_keyword_color("null", keyword_color);295highlighter->add_keyword_color("ExtResource", keyword_color);296highlighter->add_keyword_color("SubResource", keyword_color);297298const Color comment_color = EDITOR_GET("text_editor/theme/highlighting/comment_color");299highlighter->add_color_region(";", "", comment_color);300}301302Ref<EditorSyntaxHighlighter> EditorConfigFileSyntaxHighlighter::_create() const {303Ref<EditorConfigFileSyntaxHighlighter> syntax_highlighter;304syntax_highlighter.instantiate();305return syntax_highlighter;306}307308309