Browse Source

GDScript highlighter now remembers previous state

Paulb23 7 years ago
parent
commit
28dfc7f915

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

@@ -61,6 +61,13 @@ static bool _is_hex_symbol(CharType c) {
 Map<int, TextEdit::HighlighterInfo> GDScriptSyntaxHighlighter::_get_line_syntax_highlighting(int p_line) {
 	Map<int, TextEdit::HighlighterInfo> color_map;
 
+	Type next_type = NONE;
+	Type current_type = NONE;
+	Type previous_type = NONE;
+
+	String previous_text = "";
+	int previous_column = 0;
+
 	bool prev_is_char = false;
 	bool prev_is_number = false;
 	bool in_keyword = false;
@@ -214,18 +221,50 @@ Map<int, TextEdit::HighlighterInfo> GDScriptSyntaxHighlighter::_get_line_syntax_
 			in_member_variable = false;
 		}
 
-		if (in_region >= 0)
+		if (in_region >= 0) {
+			next_type = REGION;
 			color = text_editor->_get_color_region(in_region).color;
-		else if (in_keyword)
+		} else if (in_keyword) {
+			next_type = KEYWORD;
 			color = keyword_color;
-		else if (in_member_variable)
+		} else if (in_member_variable) {
+			next_type = MEMBER;
 			color = member_color;
-		else if (in_function_name)
+		} else if (in_function_name) {
+			next_type = FUNCTION;
 			color = function_color;
-		else if (is_symbol)
+		} else if (is_symbol) {
+			next_type = SYMBOL;
 			color = symbol_color;
-		else if (is_number)
+		} else if (is_number) {
+			next_type = NUMBER;
 			color = number_color;
+		} else {
+			next_type = IDENTIFIER;
+		}
+
+		if (next_type != current_type) {
+			if (current_type == NONE) {
+				current_type = next_type;
+			} else {
+				previous_type = current_type;
+				current_type = next_type;
+
+				// no need to store regions...
+				if (previous_type == REGION) {
+					previous_text = "";
+					previous_column = j;
+				} else {
+					String text = str.substr(previous_column, j - previous_column).strip_edges();
+					previous_column = j;
+
+					// ignore if just whitespace
+					if (text != "") {
+						previous_text = text;
+					}
+				}
+			}
+		}
 
 		prev_is_char = is_char;
 		prev_is_number = is_number;

+ 11 - 0
modules/gdscript/editor/gdscript_highlighter.h

@@ -35,6 +35,17 @@
 
 class GDScriptSyntaxHighlighter : public SyntaxHighlighter {
 private:
+	enum Type {
+		NONE,
+		REGION,
+		SYMBOL,
+		NUMBER,
+		FUNCTION,
+		KEYWORD,
+		MEMBER,
+		IDENTIFIER
+	};
+
 	// colours
 	Color font_color;
 	Color symbol_color;