3535
3636#include " core/config/project_settings.h"
3737#include " core/core_constants.h"
38+ #include " core/typedefs.h"
3839#include " editor/settings/editor_settings.h"
3940#include " editor/themes/editor_theme_manager.h"
4041#include " scene/gui/text_edit.h"
@@ -76,6 +77,10 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
7677 int in_declaration_param_dicts = 0 ; // The number of opened `{` inside func params.
7778 int in_type_params = 0 ; // The number of opened `[` after type name.
7879
80+ int square_bracket_level = 0 ; // for ()
81+ int curly_brace_level = 0 ; // for {}
82+ int paren_level = 0 ; // for []
83+
7984 Color keyword_color;
8085 Color color;
8186
@@ -93,6 +98,22 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
9398 get_line_syntax_highlighting (p_line - 1 );
9499 }
95100 in_region = color_region_cache[p_line - 1 ];
101+
102+ if (!bracket_level_cache.has (p_line - 1 )) {
103+ int prev_line = p_line - 1 ;
104+ while (prev_line > 0 && !bracket_level_cache.has (prev_line)) {
105+ prev_line--;
106+ }
107+
108+ for (int i = prev_line; i < p_line; i++) {
109+ get_line_syntax_highlighting (i);
110+ }
111+ }
112+
113+ Vector<int > prev_levels = bracket_level_cache[p_line - 1 ];
114+ paren_level = prev_levels[0 ];
115+ square_bracket_level = prev_levels[1 ];
116+ curly_brace_level = prev_levels[2 ];
96117 }
97118
98119 const String &str = text_edit->get_line_with_ime (p_line);
@@ -655,6 +676,51 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
655676 next_type = IDENTIFIER;
656677 }
657678
679+ // Bracket pair colorization
680+ if (bracket_pair_colors.size () > 0 ) {
681+ bool is_bracket = false ;
682+ Color bracket_color;
683+
684+ switch (str[j]) {
685+ case ' (' : {
686+ bracket_color = bracket_pair_colors[paren_level % bracket_pair_colors.size ()];
687+ paren_level++;
688+ is_bracket = true ;
689+ } break ;
690+ case ' )' : {
691+ paren_level = MAX (0 , paren_level - 1 );
692+ bracket_color = bracket_pair_colors[paren_level % bracket_pair_colors.size ()];
693+ is_bracket = true ;
694+ } break ;
695+
696+ case ' [' : {
697+ bracket_color = bracket_pair_colors[square_bracket_level % bracket_pair_colors.size ()];
698+ square_bracket_level++;
699+ is_bracket = true ;
700+ } break ;
701+ case ' ]' : {
702+ square_bracket_level = MAX (0 , square_bracket_level - 1 );
703+ bracket_color = bracket_pair_colors[square_bracket_level % bracket_pair_colors.size ()];
704+ is_bracket = true ;
705+ } break ;
706+
707+ case ' {' : {
708+ bracket_color = bracket_pair_colors[curly_brace_level % bracket_pair_colors.size ()];
709+ curly_brace_level++;
710+ is_bracket = true ;
711+ } break ;
712+ case ' }' : {
713+ curly_brace_level = MAX (0 , curly_brace_level - 1 );
714+ bracket_color = bracket_pair_colors[curly_brace_level % bracket_pair_colors.size ()];
715+ is_bracket = true ;
716+ } break ;
717+ }
718+
719+ if (is_bracket) {
720+ color = bracket_color;
721+ }
722+ }
723+
658724 if (next_type != current_type) {
659725 if (current_type == NONE) {
660726 current_type = next_type;
@@ -688,6 +754,13 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
688754 color_map[j] = highlighter_info;
689755 }
690756 }
757+
758+ Vector<int > final_levels;
759+ final_levels.push_back (paren_level);
760+ final_levels.push_back (square_bracket_level);
761+ final_levels.push_back (curly_brace_level);
762+ bracket_level_cache[p_line] = final_levels;
763+
691764 return color_map;
692765}
693766
@@ -910,6 +983,7 @@ void GDScriptSyntaxHighlighter::_update_cache() {
910983 annotation_color = EDITOR_GET (" text_editor/theme/highlighting/gdscript/annotation_color" );
911984 string_name_color = EDITOR_GET (" text_editor/theme/highlighting/gdscript/string_name_color" );
912985 type_color = EDITOR_GET (" text_editor/theme/highlighting/base_type_color" );
986+ bracket_pair_colors = EDITOR_GET (" text_editor/theme/highlighting/gdscript/bracket_pair_colors" );
913987 comment_marker_colors[COMMENT_MARKER_CRITICAL] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/critical_color" );
914988 comment_marker_colors[COMMENT_MARKER_WARNING] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/warning_color" );
915989 comment_marker_colors[COMMENT_MARKER_NOTICE] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/notice_color" );
@@ -960,6 +1034,10 @@ void GDScriptSyntaxHighlighter::add_color_region(ColorRegion::Type p_type, const
9601034 clear_highlighting_cache ();
9611035}
9621036
1037+ void GDScriptSyntaxHighlighter::_clear_highlighting_cache () {
1038+ bracket_level_cache.clear ();
1039+ }
1040+
9631041Ref<EditorSyntaxHighlighter> GDScriptSyntaxHighlighter::_create () const {
9641042 Ref<GDScriptSyntaxHighlighter> syntax_highlighter;
9651043 syntax_highlighter.instantiate ();
0 commit comments