浏览代码

Merge pull request #70297 from Paulb23/fix-autocomplete-brace-completion

Fix autocomplete with autobrace completion not adding closing pair
Rémi Verschelde 2 年之前
父节点
当前提交
d34594179a
共有 2 个文件被更改,包括 94 次插入9 次删除
  1. 11 9
      scene/gui/code_edit.cpp
  2. 83 0
      tests/scene/test_code_edit.h

+ 11 - 9
scene/gui/code_edit.cpp

@@ -2081,20 +2081,22 @@ void CodeEdit::confirm_code_completion(bool p_replace) {
 		}
 		char32_t last_completion_char_display = display_text[display_text.length() - 1];
 
+		bool last_char_matches = (last_completion_char == next_char || last_completion_char_display == next_char);
 		int pre_brace_pair = get_caret_column(i) > 0 ? _get_auto_brace_pair_open_at_pos(caret_line, get_caret_column(i)) : -1;
 		int post_brace_pair = get_caret_column(i) < get_line(caret_line).length() ? _get_auto_brace_pair_close_at_pos(caret_line, get_caret_column(i)) : -1;
 
-		if (post_brace_pair != -1 && (last_completion_char == next_char || last_completion_char_display == next_char)) {
+		// Strings do not nest like brackets, so ensure we don't add an additional closing pair.
+		if (has_string_delimiter(String::chr(last_completion_char)) && post_brace_pair != -1 && last_char_matches) {
 			remove_text(caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1);
 			adjust_carets_after_edit(i, caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1);
-		}
-
-		if (pre_brace_pair != -1 && pre_brace_pair != post_brace_pair && (last_completion_char == next_char || last_completion_char_display == next_char)) {
-			remove_text(caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1);
-			adjust_carets_after_edit(i, caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1);
-		} else if (auto_brace_completion_enabled && pre_brace_pair != -1 && post_brace_pair == -1) {
-			insert_text_at_caret(auto_brace_completion_pairs[pre_brace_pair].close_key, i);
-			set_caret_column(get_caret_column(i) - auto_brace_completion_pairs[pre_brace_pair].close_key.length(), i == 0, i);
+		} else {
+			if (pre_brace_pair != -1 && pre_brace_pair != post_brace_pair && last_char_matches) {
+				remove_text(caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1);
+				adjust_carets_after_edit(i, caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1);
+			} else if (auto_brace_completion_enabled && pre_brace_pair != -1) {
+				insert_text_at_caret(auto_brace_completion_pairs[pre_brace_pair].close_key, i);
+				set_caret_column(get_caret_column(i) - auto_brace_completion_pairs[pre_brace_pair].close_key.length(), i == 0, i);
+			}
 		}
 
 		if (pre_brace_pair == -1 && post_brace_pair == -1 && get_caret_column(i) > 0 && get_caret_column(i) < get_line(caret_line).length()) {

+ 83 - 0
tests/scene/test_code_edit.h

@@ -2871,6 +2871,89 @@ TEST_CASE("[SceneTree][CodeEdit] completion") {
 		CHECK(code_edit->get_text() == "\'\'\'");
 	}
 
+	SUBCASE("[CodeEdit] autocomplete with brace completion") {
+		code_edit->set_auto_brace_completion_enabled(true);
+		CHECK(code_edit->is_auto_brace_completion_enabled());
+
+		code_edit->insert_text_at_caret("(te)");
+		code_edit->set_caret_column(3);
+
+		// Full completion.
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test()", "test()");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "(test())");
+		CHECK(code_edit->get_caret_column() == 7);
+		code_edit->undo();
+
+		// With "arg".
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test(", "test(");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "(test())");
+		CHECK(code_edit->get_caret_column() == 6);
+		code_edit->undo();
+
+		// brace completion disbaled
+		code_edit->set_auto_brace_completion_enabled(false);
+
+		// Full completion.
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test()", "test()");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "(test())");
+		CHECK(code_edit->get_caret_column() == 7);
+		code_edit->undo();
+
+		// With "arg".
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test(", "test(");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "(test()");
+		CHECK(code_edit->get_caret_column() == 6);
+
+		// String
+		code_edit->set_auto_brace_completion_enabled(true);
+		code_edit->clear();
+		code_edit->insert_text_at_caret("\"\"");
+		code_edit->set_caret_column(1);
+
+		// Full completion.
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test\"", "\"test\"");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "\"test\"");
+		CHECK(code_edit->get_caret_column() == 6);
+		code_edit->undo();
+
+		// With "arg".
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test", "\"test");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "\"\"test\"\"");
+		CHECK(code_edit->get_caret_column() == 7);
+		code_edit->undo();
+
+		// brace completion disbaled
+		code_edit->set_auto_brace_completion_enabled(false);
+
+		// Full completion.
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test\"", "\"test\"");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "\"test\"");
+		CHECK(code_edit->get_caret_column() == 6);
+		code_edit->undo();
+
+		// With "arg".
+		code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test", "\"test");
+		code_edit->update_code_completion_options();
+		code_edit->confirm_code_completion();
+		CHECK(code_edit->get_line(0) == "\"\"test\"");
+		CHECK(code_edit->get_caret_column() == 7);
+		code_edit->undo();
+	}
+
 	SUBCASE("[CodeEdit] autocomplete") {
 		code_edit->set_code_completion_enabled(true);
 		CHECK(code_edit->is_code_completion_enabled());