@@ -76,6 +76,10 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
7676 int in_declaration_param_dicts = 0 ; // The number of opened `{` inside func params.
7777 int in_type_params = 0 ; // The number of opened `[` after type name.
7878
79+ int square_bracket_level = 0 ; // for ()
80+ int curly_brace_level = 0 ; // for {}
81+ int paren_level = 0 ; // for []
82+
7983 Color keyword_color;
8084 Color color;
8185
@@ -93,6 +97,22 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
9397 get_line_syntax_highlighting (p_line - 1 );
9498 }
9599 in_region = color_region_cache[p_line - 1 ];
100+
101+ if (!bracket_level_cache.has (p_line - 1 )) {
102+ int prev_line = p_line - 1 ;
103+ while (prev_line > 0 && !bracket_level_cache.has (prev_line)) {
104+ prev_line--;
105+ }
106+
107+ for (int i = prev_line; i < p_line; i++) {
108+ get_line_syntax_highlighting (i);
109+ }
110+ }
111+
112+ Vector<int > prev_levels = bracket_level_cache[p_line - 1 ];
113+ paren_level = prev_levels[0 ];
114+ square_bracket_level = prev_levels[1 ];
115+ curly_brace_level = prev_levels[2 ];
96116 }
97117
98118 const String &str = text_edit->get_line_with_ime (p_line);
@@ -655,6 +675,51 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
655675 next_type = IDENTIFIER;
656676 }
657677
678+ // Bracket pair colorization
679+ if (bracket_pair_colors.size () > 0 ) {
680+ bool is_bracket = false ;
681+ Color bracket_color;
682+
683+ switch (str[j]) {
684+ case ' (' : {
685+ bracket_color = bracket_pair_colors[paren_level % bracket_pair_colors.size ()];
686+ paren_level++;
687+ is_bracket = true ;
688+ } break ;
689+ case ' )' : {
690+ paren_level = MAX (0 , paren_level - 1 );
691+ bracket_color = bracket_pair_colors[paren_level % bracket_pair_colors.size ()];
692+ is_bracket = true ;
693+ } break ;
694+
695+ case ' [' : {
696+ bracket_color = bracket_pair_colors[square_bracket_level % bracket_pair_colors.size ()];
697+ square_bracket_level++;
698+ is_bracket = true ;
699+ } break ;
700+ case ' ]' : {
701+ square_bracket_level = MAX (0 , square_bracket_level - 1 );
702+ bracket_color = bracket_pair_colors[square_bracket_level % bracket_pair_colors.size ()];
703+ is_bracket = true ;
704+ } break ;
705+
706+ case ' {' : {
707+ bracket_color = bracket_pair_colors[curly_brace_level % bracket_pair_colors.size ()];
708+ curly_brace_level++;
709+ is_bracket = true ;
710+ } break ;
711+ case ' }' : {
712+ curly_brace_level = MAX (0 , curly_brace_level - 1 );
713+ bracket_color = bracket_pair_colors[curly_brace_level % bracket_pair_colors.size ()];
714+ is_bracket = true ;
715+ } break ;
716+ }
717+
718+ if (is_bracket) {
719+ color = bracket_color;
720+ }
721+ }
722+
658723 if (next_type != current_type) {
659724 if (current_type == NONE) {
660725 current_type = next_type;
@@ -688,6 +753,13 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
688753 color_map[j] = highlighter_info;
689754 }
690755 }
756+
757+ Vector<int > final_levels;
758+ final_levels.push_back (paren_level);
759+ final_levels.push_back (square_bracket_level);
760+ final_levels.push_back (curly_brace_level);
761+ bracket_level_cache[p_line] = final_levels;
762+
691763 return color_map;
692764}
693765
@@ -910,6 +982,7 @@ void GDScriptSyntaxHighlighter::_update_cache() {
910982 annotation_color = EDITOR_GET (" text_editor/theme/highlighting/gdscript/annotation_color" );
911983 string_name_color = EDITOR_GET (" text_editor/theme/highlighting/gdscript/string_name_color" );
912984 type_color = EDITOR_GET (" text_editor/theme/highlighting/base_type_color" );
985+ bracket_pair_colors = EDITOR_GET (" text_editor/theme/highlighting/gdscript/bracket_pair_colors" );
913986 comment_marker_colors[COMMENT_MARKER_CRITICAL] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/critical_color" );
914987 comment_marker_colors[COMMENT_MARKER_WARNING] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/warning_color" );
915988 comment_marker_colors[COMMENT_MARKER_NOTICE] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/notice_color" );
@@ -960,6 +1033,10 @@ void GDScriptSyntaxHighlighter::add_color_region(ColorRegion::Type p_type, const
9601033 clear_highlighting_cache ();
9611034}
9621035
1036+ void GDScriptSyntaxHighlighter::_clear_highlighting_cache () {
1037+ bracket_level_cache.clear ();
1038+ }
1039+
9631040Ref<EditorSyntaxHighlighter> GDScriptSyntaxHighlighter::_create () const {
9641041 Ref<GDScriptSyntaxHighlighter> syntax_highlighter;
9651042 syntax_highlighter.instantiate ();
0 commit comments