@@ -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,24 @@ 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_pair_colors.size () > 0 ) {
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 ];
117+ }
96118 }
97119
98120 const String &str = text_edit->get_line_with_ime (p_line);
@@ -655,6 +677,51 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
655677 next_type = IDENTIFIER;
656678 }
657679
680+ // Bracket pair colorization
681+ if (bracket_pair_colors.size () > 0 ) {
682+ bool is_bracket = false ;
683+ Color bracket_color;
684+
685+ switch (str[j]) {
686+ case ' (' : {
687+ bracket_color = bracket_pair_colors[paren_level % bracket_pair_colors.size ()];
688+ paren_level++;
689+ is_bracket = true ;
690+ } break ;
691+ case ' )' : {
692+ paren_level = MAX (0 , paren_level - 1 );
693+ bracket_color = bracket_pair_colors[paren_level % bracket_pair_colors.size ()];
694+ is_bracket = true ;
695+ } break ;
696+
697+ case ' [' : {
698+ bracket_color = bracket_pair_colors[square_bracket_level % bracket_pair_colors.size ()];
699+ square_bracket_level++;
700+ is_bracket = true ;
701+ } break ;
702+ case ' ]' : {
703+ square_bracket_level = MAX (0 , square_bracket_level - 1 );
704+ bracket_color = bracket_pair_colors[square_bracket_level % bracket_pair_colors.size ()];
705+ is_bracket = true ;
706+ } break ;
707+
708+ case ' {' : {
709+ bracket_color = bracket_pair_colors[curly_brace_level % bracket_pair_colors.size ()];
710+ curly_brace_level++;
711+ is_bracket = true ;
712+ } break ;
713+ case ' }' : {
714+ curly_brace_level = MAX (0 , curly_brace_level - 1 );
715+ bracket_color = bracket_pair_colors[curly_brace_level % bracket_pair_colors.size ()];
716+ is_bracket = true ;
717+ } break ;
718+ }
719+
720+ if (is_bracket) {
721+ color = bracket_color;
722+ }
723+ }
724+
658725 if (next_type != current_type) {
659726 if (current_type == NONE) {
660727 current_type = next_type;
@@ -688,6 +755,13 @@ Dictionary GDScriptSyntaxHighlighter::_get_line_syntax_highlighting_impl(int p_l
688755 color_map[j] = highlighter_info;
689756 }
690757 }
758+
759+ Vector<int > final_levels;
760+ final_levels.push_back (paren_level);
761+ final_levels.push_back (square_bracket_level);
762+ final_levels.push_back (curly_brace_level);
763+ bracket_level_cache[p_line] = final_levels;
764+
691765 return color_map;
692766}
693767
@@ -910,6 +984,7 @@ void GDScriptSyntaxHighlighter::_update_cache() {
910984 annotation_color = EDITOR_GET (" text_editor/theme/highlighting/gdscript/annotation_color" );
911985 string_name_color = EDITOR_GET (" text_editor/theme/highlighting/gdscript/string_name_color" );
912986 type_color = EDITOR_GET (" text_editor/theme/highlighting/base_type_color" );
987+ bracket_pair_colors = EDITOR_GET (" text_editor/theme/highlighting/gdscript/bracket_pair_colors" );
913988 comment_marker_colors[COMMENT_MARKER_CRITICAL] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/critical_color" );
914989 comment_marker_colors[COMMENT_MARKER_WARNING] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/warning_color" );
915990 comment_marker_colors[COMMENT_MARKER_NOTICE] = EDITOR_GET (" text_editor/theme/highlighting/comment_markers/notice_color" );
@@ -960,6 +1035,10 @@ void GDScriptSyntaxHighlighter::add_color_region(ColorRegion::Type p_type, const
9601035 clear_highlighting_cache ();
9611036}
9621037
1038+ void GDScriptSyntaxHighlighter::_clear_highlighting_cache () {
1039+ bracket_level_cache.clear ();
1040+ }
1041+
9631042Ref<EditorSyntaxHighlighter> GDScriptSyntaxHighlighter::_create () const {
9641043 Ref<GDScriptSyntaxHighlighter> syntax_highlighter;
9651044 syntax_highlighter.instantiate ();
0 commit comments