Browse Source

Merge pull request #94082 from HolonProduction/completion-force

Autocompletion: Rework argument options string literal completion
Rémi Verschelde 11 months ago
parent
commit
58505b0bce
30 changed files with 201 additions and 21 deletions
  1. 37 15
      modules/gdscript/gdscript_parser.cpp
  2. 5 3
      modules/gdscript/gdscript_parser.h
  3. 5 0
      modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.cfg
  4. 8 0
      modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.gd
  5. 5 1
      modules/gdscript/tests/scripts/completion/common/identifiers_in_call.cfg
  6. 18 0
      modules/gdscript/tests/scripts/completion/common/identifiers_in_call.gd
  7. 25 0
      modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.cfg
  8. 3 1
      modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.gd
  9. 25 0
      modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.cfg
  10. 22 0
      modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.gd
  11. 26 0
      modules/gdscript/tests/scripts/completion/common/no_completion_in_string.cfg
  12. 19 0
      modules/gdscript/tests/scripts/completion/common/no_completion_in_string.gd
  13. 1 0
      modules/gdscript/tests/scripts/completion/common/self.gd
  14. 2 1
      modules/gdscript/tests/scripts/completion/filter/organized_export.gd
  15. 0 0
      modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.cfg
  16. 0 0
      modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.gd
  17. 0 0
      modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.cfg
  18. 0 0
      modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.gd
  19. 0 0
      modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.cfg
  20. 0 0
      modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.gd
  21. 0 0
      modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.cfg
  22. 0 0
      modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.gd
  23. 0 0
      modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.cfg
  24. 0 0
      modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.gd
  25. 0 0
      modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.cfg
  26. 0 0
      modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.gd
  27. 0 0
      modules/gdscript/tests/scripts/completion/types/local/infered.cfg
  28. 0 0
      modules/gdscript/tests/scripts/completion/types/local/infered.gd
  29. 0 0
      modules/gdscript/tests/scripts/completion/types/member/infered.cfg
  30. 0 0
      modules/gdscript/tests/scripts/completion/types/member/infered.gd

+ 37 - 15
modules/gdscript/gdscript_parser.cpp

@@ -245,8 +245,26 @@ void GDScriptParser::apply_pending_warnings() {
 }
 }
 #endif
 #endif
 
 
-void GDScriptParser::make_completion_context(CompletionType p_type, Node *p_node, int p_argument, bool p_force) {
-	if (!for_completion || (!p_force && completion_context.type != COMPLETION_NONE)) {
+void GDScriptParser::override_completion_context(const Node *p_for_node, CompletionType p_type, Node *p_node, int p_argument) {
+	if (!for_completion) {
+		return;
+	}
+	if (completion_context.node != p_for_node) {
+		return;
+	}
+	CompletionContext context;
+	context.type = p_type;
+	context.current_class = current_class;
+	context.current_function = current_function;
+	context.current_suite = current_suite;
+	context.current_line = tokenizer->get_cursor_line();
+	context.current_argument = p_argument;
+	context.node = p_node;
+	completion_context = context;
+}
+
+void GDScriptParser::make_completion_context(CompletionType p_type, Node *p_node, int p_argument) {
+	if (!for_completion) {
 		return;
 		return;
 	}
 	}
 	if (previous.cursor_place != GDScriptTokenizerText::CURSOR_MIDDLE && previous.cursor_place != GDScriptTokenizerText::CURSOR_END && current.cursor_place == GDScriptTokenizerText::CURSOR_NONE) {
 	if (previous.cursor_place != GDScriptTokenizerText::CURSOR_MIDDLE && previous.cursor_place != GDScriptTokenizerText::CURSOR_END && current.cursor_place == GDScriptTokenizerText::CURSOR_NONE) {
@@ -264,8 +282,8 @@ void GDScriptParser::make_completion_context(CompletionType p_type, Node *p_node
 	completion_context = context;
 	completion_context = context;
 }
 }
 
 
-void GDScriptParser::make_completion_context(CompletionType p_type, Variant::Type p_builtin_type, bool p_force) {
-	if (!for_completion || (!p_force && completion_context.type != COMPLETION_NONE)) {
+void GDScriptParser::make_completion_context(CompletionType p_type, Variant::Type p_builtin_type) {
+	if (!for_completion) {
 		return;
 		return;
 	}
 	}
 	if (previous.cursor_place != GDScriptTokenizerText::CURSOR_MIDDLE && previous.cursor_place != GDScriptTokenizerText::CURSOR_END && current.cursor_place == GDScriptTokenizerText::CURSOR_NONE) {
 	if (previous.cursor_place != GDScriptTokenizerText::CURSOR_MIDDLE && previous.cursor_place != GDScriptTokenizerText::CURSOR_END && current.cursor_place == GDScriptTokenizerText::CURSOR_NONE) {
@@ -1620,7 +1638,7 @@ GDScriptParser::AnnotationNode *GDScriptParser::parse_annotation(uint32_t p_vali
 		advance();
 		advance();
 		// Arguments.
 		// Arguments.
 		push_completion_call(annotation);
 		push_completion_call(annotation);
-		make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, 0, true);
+		make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, 0);
 		int argument_index = 0;
 		int argument_index = 0;
 		do {
 		do {
 			if (check(GDScriptTokenizer::Token::PARENTHESIS_CLOSE)) {
 			if (check(GDScriptTokenizer::Token::PARENTHESIS_CLOSE)) {
@@ -1628,7 +1646,7 @@ GDScriptParser::AnnotationNode *GDScriptParser::parse_annotation(uint32_t p_vali
 				break;
 				break;
 			}
 			}
 
 
-			make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, argument_index, true);
+			make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, argument_index);
 			set_last_completion_call_arg(argument_index++);
 			set_last_completion_call_arg(argument_index++);
 			ExpressionNode *argument = parse_expression(false);
 			ExpressionNode *argument = parse_expression(false);
 			if (argument == nullptr) {
 			if (argument == nullptr) {
@@ -2569,8 +2587,11 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_literal(ExpressionNode *p_
 	}
 	}
 
 
 	LiteralNode *literal = alloc_node<LiteralNode>();
 	LiteralNode *literal = alloc_node<LiteralNode>();
-	complete_extents(literal);
 	literal->value = previous.literal;
 	literal->value = previous.literal;
+	reset_extents(literal, p_previous_operand);
+	update_extents(literal);
+	make_completion_context(COMPLETION_NONE, literal, -1);
+	complete_extents(literal);
 	return literal;
 	return literal;
 }
 }
 
 
@@ -3065,12 +3086,12 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_attribute(ExpressionNode *
 			const IdentifierNode *id = static_cast<const IdentifierNode *>(p_previous_operand);
 			const IdentifierNode *id = static_cast<const IdentifierNode *>(p_previous_operand);
 			Variant::Type builtin_type = get_builtin_type(id->name);
 			Variant::Type builtin_type = get_builtin_type(id->name);
 			if (builtin_type < Variant::VARIANT_MAX) {
 			if (builtin_type < Variant::VARIANT_MAX) {
-				make_completion_context(COMPLETION_BUILT_IN_TYPE_CONSTANT_OR_STATIC_METHOD, builtin_type, true);
+				make_completion_context(COMPLETION_BUILT_IN_TYPE_CONSTANT_OR_STATIC_METHOD, builtin_type);
 				is_builtin = true;
 				is_builtin = true;
 			}
 			}
 		}
 		}
 		if (!is_builtin) {
 		if (!is_builtin) {
-			make_completion_context(COMPLETION_ATTRIBUTE, attribute, -1, true);
+			make_completion_context(COMPLETION_ATTRIBUTE, attribute, -1);
 		}
 		}
 	}
 	}
 
 
@@ -3195,23 +3216,24 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre
 	push_completion_call(call);
 	push_completion_call(call);
 	int argument_index = 0;
 	int argument_index = 0;
 	do {
 	do {
-		make_completion_context(ct, call, argument_index++, true);
+		make_completion_context(ct, call, argument_index);
 		if (check(GDScriptTokenizer::Token::PARENTHESIS_CLOSE)) {
 		if (check(GDScriptTokenizer::Token::PARENTHESIS_CLOSE)) {
 			// Allow for trailing comma.
 			// Allow for trailing comma.
 			break;
 			break;
 		}
 		}
-		bool use_identifier_completion = current.cursor_place == GDScriptTokenizerText::CURSOR_END || current.cursor_place == GDScriptTokenizerText::CURSOR_MIDDLE;
 		ExpressionNode *argument = parse_expression(false);
 		ExpressionNode *argument = parse_expression(false);
 		if (argument == nullptr) {
 		if (argument == nullptr) {
 			push_error(R"(Expected expression as the function argument.)");
 			push_error(R"(Expected expression as the function argument.)");
 		} else {
 		} else {
 			call->arguments.push_back(argument);
 			call->arguments.push_back(argument);
 
 
-			if (argument->type == Node::IDENTIFIER && use_identifier_completion) {
-				completion_context.type = COMPLETION_IDENTIFIER;
+			if (argument->type == Node::LITERAL) {
+				override_completion_context(argument, ct, call, argument_index);
 			}
 			}
 		}
 		}
+
 		ct = COMPLETION_CALL_ARGUMENTS;
 		ct = COMPLETION_CALL_ARGUMENTS;
+		argument_index++;
 	} while (match(GDScriptTokenizer::Token::COMMA));
 	} while (match(GDScriptTokenizer::Token::COMMA));
 	pop_completion_call();
 	pop_completion_call();
 
 
@@ -3224,7 +3246,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre
 
 
 GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p_previous_operand, bool p_can_assign) {
 GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p_previous_operand, bool p_can_assign) {
 	// We want code completion after a DOLLAR even if the current code is invalid.
 	// We want code completion after a DOLLAR even if the current code is invalid.
-	make_completion_context(COMPLETION_GET_NODE, nullptr, -1, true);
+	make_completion_context(COMPLETION_GET_NODE, nullptr, -1);
 
 
 	if (!current.is_node_name() && !check(GDScriptTokenizer::Token::LITERAL) && !check(GDScriptTokenizer::Token::SLASH) && !check(GDScriptTokenizer::Token::PERCENT)) {
 	if (!current.is_node_name() && !check(GDScriptTokenizer::Token::LITERAL) && !check(GDScriptTokenizer::Token::SLASH) && !check(GDScriptTokenizer::Token::PERCENT)) {
 		push_error(vformat(R"(Expected node path as string or identifier after "%s".)", previous.get_name()));
 		push_error(vformat(R"(Expected node path as string or identifier after "%s".)", previous.get_name()));
@@ -3281,7 +3303,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p
 			path_state = PATH_STATE_SLASH;
 			path_state = PATH_STATE_SLASH;
 		}
 		}
 
 
-		make_completion_context(COMPLETION_GET_NODE, get_node, context_argument++, true);
+		make_completion_context(COMPLETION_GET_NODE, get_node, context_argument++);
 
 
 		if (match(GDScriptTokenizer::Token::LITERAL)) {
 		if (match(GDScriptTokenizer::Token::LITERAL)) {
 			if (previous.literal.get_type() != Variant::STRING) {
 			if (previous.literal.get_type() != Variant::STRING) {

+ 5 - 3
modules/gdscript/gdscript_parser.h

@@ -1455,9 +1455,11 @@ private:
 	}
 	}
 	void apply_pending_warnings();
 	void apply_pending_warnings();
 #endif
 #endif
-
-	void make_completion_context(CompletionType p_type, Node *p_node, int p_argument = -1, bool p_force = false);
-	void make_completion_context(CompletionType p_type, Variant::Type p_builtin_type, bool p_force = false);
+	void make_completion_context(CompletionType p_type, Node *p_node, int p_argument = -1);
+	void make_completion_context(CompletionType p_type, Variant::Type p_builtin_type);
+	// In some cases it might become necessary to alter the completion context after parsing a subexpression.
+	// For example to not override COMPLETE_CALL_ARGUMENTS with COMPLETION_NONE from string literals.
+	void override_completion_context(const Node *p_for_node, CompletionType p_type, Node *p_node, int p_argument = -1);
 	void push_completion_call(Node *p_call);
 	void push_completion_call(Node *p_call);
 	void pop_completion_call();
 	void pop_completion_call();
 	void set_last_completion_call_arg(int p_argument);
 	void set_last_completion_call_arg(int p_argument);

+ 5 - 0
modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.cfg

@@ -0,0 +1,5 @@
+[output]
+include=[
+    {"insert_text": "\"property_of_a\""},
+    {"insert_text": "\"name\""},
+]

+ 8 - 0
modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.gd

@@ -0,0 +1,8 @@
+extends Node
+
+const A = preload ("res://completion/class_a.notest.gd")
+
+func _ready() -> void:
+    var a := A.new()
+    var tween := get_tree().create_tween()
+    tween.tween_property(a, "➡")

+ 5 - 1
modules/gdscript/tests/scripts/completion/common/identifiers.cfg → modules/gdscript/tests/scripts/completion/common/identifiers_in_call.cfg

@@ -11,11 +11,15 @@ include=[
     {"display": "func_of_a"},
     {"display": "func_of_a"},
     {"display": "signal_of_a"},
     {"display": "signal_of_a"},
 
 
-    ; GDScript: self.gd
+    ; GDScript: identifiers.gd
     {"display": "test_signal_1"},
     {"display": "test_signal_1"},
     {"display": "test_signal_2"},
     {"display": "test_signal_2"},
     {"display": "test_var_1"},
     {"display": "test_var_1"},
     {"display": "test_var_2"},
     {"display": "test_var_2"},
     {"display": "test_func_1"},
     {"display": "test_func_1"},
     {"display": "test_func_2"},
     {"display": "test_func_2"},
+    {"display": "test_parameter_1"},
+    {"display": "test_parameter_2"},
+    {"display": "local_test_var_1"},
+    {"display": "local_test_var_2"},
 ]
 ]

+ 18 - 0
modules/gdscript/tests/scripts/completion/common/identifiers_in_call.gd

@@ -0,0 +1,18 @@
+extends "res://completion/class_a.notest.gd"
+
+signal test_signal_1(a)
+signal test_signal_2(a: int)
+
+var test_var_1
+var test_var_2: int
+
+func test_func_1(t):
+    pass
+
+func test_func_2(t: int) -> void:
+    pass
+
+func _init(test_parameter_1, test_parameter_2: String):
+    var local_test_var_1
+    var local_test_var_2: int
+    print(t➡)

+ 25 - 0
modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.cfg

@@ -0,0 +1,25 @@
+scene="res://completion/get_node/get_node.tscn"
+[output]
+include=[
+    ; Node
+    {"display": "add_child"},
+    {"display": "owner"},
+    {"display": "child_entered_tree"},
+
+    ; GDScript: class_a.notest.gd
+    {"display": "property_of_a"},
+    {"display": "func_of_a"},
+    {"display": "signal_of_a"},
+
+    ; GDScript: identifiers.gd
+    {"display": "test_signal_1"},
+    {"display": "test_signal_2"},
+    {"display": "test_var_1"},
+    {"display": "test_var_2"},
+    {"display": "test_func_1"},
+    {"display": "test_func_2"},
+    {"display": "test_parameter_1"},
+    {"display": "test_parameter_2"},
+    {"display": "local_test_var_1"},
+    {"display": "local_test_var_2"},
+]

+ 3 - 1
modules/gdscript/tests/scripts/completion/common/identifiers.gd → modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.gd

@@ -12,5 +12,7 @@ func test_func_1(t):
 func test_func_2(t: int) -> void:
 func test_func_2(t: int) -> void:
     pass
     pass
 
 
-func _init():
+func _init(test_parameter_1, test_parameter_2: String):
+    var local_test_var_1
+    var local_test_var_2: int
     t➡
     t➡

+ 25 - 0
modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.cfg

@@ -0,0 +1,25 @@
+scene="res://completion/get_node/get_node.tscn"
+[output]
+include=[
+    ; Node
+    {"display": "add_child"},
+    {"display": "owner"},
+    {"display": "child_entered_tree"},
+
+    ; GDScript: class_a.notest.gd
+    {"display": "property_of_a"},
+    {"display": "func_of_a"},
+    {"display": "signal_of_a"},
+
+    ; GDScript: identifiers.gd
+    {"display": "test_signal_1"},
+    {"display": "test_signal_2"},
+    {"display": "test_var_1"},
+    {"display": "test_var_2"},
+    {"display": "test_func_1"},
+    {"display": "test_func_2"},
+    {"display": "test_parameter_1"},
+    {"display": "test_parameter_2"},
+    {"display": "local_test_var_1"},
+    {"display": "local_test_var_2"},
+]

+ 22 - 0
modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.gd

@@ -0,0 +1,22 @@
+# godotengine/godot#92226
+extends "res://completion/class_a.notest.gd"
+
+signal test_signal_1(a)
+signal test_signal_2(a: int)
+
+var test_var_1
+var test_var_2: int
+
+func test_func_1(t):
+    pass
+
+func test_func_2(t: int) -> void:
+    pass
+
+func _init(test_parameter_1, test_parameter_2: String):
+    var local_test_var_1
+    var local_test_var_2: int
+    print(t➡
+
+    if true:
+        pass

+ 26 - 0
modules/gdscript/tests/scripts/completion/common/no_completion_in_string.cfg

@@ -0,0 +1,26 @@
+scene="res://completion/get_node/get_node.tscn"
+[output]
+exclude=[
+    ; Node
+    {"display": "add_child"},
+    {"display": "owner"},
+    {"display": "child_entered_tree"},
+    {"display": "add_child"},
+
+    ; GDScript: class_a.notest.gd
+    {"display": "property_of_a"},
+    {"display": "func_of_a"},
+    {"display": "signal_of_a"},
+
+    ; GDScript: no_completion_in_string.gd
+    {"display": "test_signal_1"},
+    {"display": "test_signal_2"},
+    {"display": "test_var_1"},
+    {"display": "test_var_2"},
+    {"display": "test_func_1"},
+    {"display": "test_func_2"},
+    {"display": "test_parameter_1"},
+    {"display": "test_parameter_2"},
+    {"display": "local_test_var_1"},
+    {"display": "local_test_var_2"},
+]

+ 19 - 0
modules/gdscript/tests/scripts/completion/common/no_completion_in_string.gd

@@ -0,0 +1,19 @@
+# godotengine/godot#62945
+extends "res://completion/class_a.notest.gd"
+
+signal test_signal_1(a)
+signal test_signal_2(a: int)
+
+var test_var_1
+var test_var_2: int
+
+func test_func_1(t):
+    pass
+
+func test_func_2(t: int) -> void:
+    pass
+
+func _init(test_parameter_1, test_parameter_2: String):
+    var local_test_var_1
+    var local_test_var_2: int
+    var a = "➡"

+ 1 - 0
modules/gdscript/tests/scripts/completion/common/self.gd

@@ -14,3 +14,4 @@ func test_func_2(t: int) -> void:
 
 
 func _init():
 func _init():
     self.➡
     self.➡
+    pass

+ 2 - 1
modules/gdscript/tests/scripts/completion/filter/organized_export.gd

@@ -5,4 +5,5 @@ extends CPUParticles2D
 @export_subgroup("Test Subgroup")
 @export_subgroup("Test Subgroup")
 
 
 func _init():
 func _init():
-    ➡
+    t➡
+    pass

+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/local_interfered/local_interfered.cfg → modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/local_interfered/local_interfered.gd → modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.gd


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/class_local_interfered_scene.cfg → modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/class_local_interfered_scene.gd → modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.gd


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/native_local_interfered_scene.cfg → modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/native_local_interfered_scene.gd → modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.gd


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/member_interfered/member_interfered.cfg → modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/member_interfered/member_interfered.gd → modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.gd


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/class_member_interfered_scene.cfg → modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/class_member_interfered_scene.gd → modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.gd


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/native_member_interfered_scene.cfg → modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/native_member_interfered_scene.gd → modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.gd


+ 0 - 0
modules/gdscript/tests/scripts/completion/types/local/interfered.cfg → modules/gdscript/tests/scripts/completion/types/local/infered.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/types/local/interfered.gd → modules/gdscript/tests/scripts/completion/types/local/infered.gd


+ 0 - 0
modules/gdscript/tests/scripts/completion/types/member/interfered.cfg → modules/gdscript/tests/scripts/completion/types/member/infered.cfg


+ 0 - 0
modules/gdscript/tests/scripts/completion/types/member/interfered.gd → modules/gdscript/tests/scripts/completion/types/member/infered.gd