Browse Source

Fix signal completion in GDScript editor

Yuri Rubinsky 3 years ago
parent
commit
a439832035

+ 1 - 0
core/object/script_language.h

@@ -346,6 +346,7 @@ public:
 		LOOKUP_RESULT_CLASS_CONSTANT,
 		LOOKUP_RESULT_CLASS_PROPERTY,
 		LOOKUP_RESULT_CLASS_METHOD,
+		LOOKUP_RESULT_CLASS_SIGNAL,
 		LOOKUP_RESULT_CLASS_ENUM,
 		LOOKUP_RESULT_CLASS_TBD_GLOBALSCOPE,
 		LOOKUP_RESULT_MAX

+ 1 - 0
core/object/script_language_extension.cpp

@@ -157,6 +157,7 @@ void ScriptLanguageExtension::_bind_methods() {
 	BIND_ENUM_CONSTANT(LOOKUP_RESULT_CLASS_CONSTANT);
 	BIND_ENUM_CONSTANT(LOOKUP_RESULT_CLASS_PROPERTY);
 	BIND_ENUM_CONSTANT(LOOKUP_RESULT_CLASS_METHOD);
+	BIND_ENUM_CONSTANT(LOOKUP_RESULT_CLASS_SIGNAL);
 	BIND_ENUM_CONSTANT(LOOKUP_RESULT_CLASS_ENUM);
 	BIND_ENUM_CONSTANT(LOOKUP_RESULT_CLASS_TBD_GLOBALSCOPE);
 	BIND_ENUM_CONSTANT(LOOKUP_RESULT_MAX);

+ 5 - 3
doc/classes/ScriptLanguageExtension.xml

@@ -372,11 +372,13 @@
 		</constant>
 		<constant name="LOOKUP_RESULT_CLASS_METHOD" value="4" enum="LookupResultType">
 		</constant>
-		<constant name="LOOKUP_RESULT_CLASS_ENUM" value="5" enum="LookupResultType">
+		<constant name="LOOKUP_RESULT_CLASS_SIGNAL" value="5" enum="LookupResultType">
 		</constant>
-		<constant name="LOOKUP_RESULT_CLASS_TBD_GLOBALSCOPE" value="6" enum="LookupResultType">
+		<constant name="LOOKUP_RESULT_CLASS_ENUM" value="6" enum="LookupResultType">
 		</constant>
-		<constant name="LOOKUP_RESULT_MAX" value="7" enum="LookupResultType">
+		<constant name="LOOKUP_RESULT_CLASS_TBD_GLOBALSCOPE" value="7" enum="LookupResultType">
+		</constant>
+		<constant name="LOOKUP_RESULT_MAX" value="8" enum="LookupResultType">
 		</constant>
 		<constant name="LOCATION_LOCAL" value="0" enum="CodeCompletionLocation">
 			The option is local to the location of the code completion query - e.g. a local variable.

+ 15 - 0
editor/plugins/script_text_editor.cpp

@@ -854,6 +854,21 @@ void ScriptTextEditor::_lookup_symbol(const String &p_symbol, int p_row, int p_c
 
 				emit_signal(SNAME("go_to_help"), "class_method:" + result.class_name + ":" + result.class_member);
 
+			} break;
+			case ScriptLanguage::LOOKUP_RESULT_CLASS_SIGNAL: {
+				StringName cname = result.class_name;
+
+				while (true) {
+					if (ClassDB::has_signal(cname, result.class_member)) {
+						result.class_name = cname;
+						cname = ClassDB::get_parent_class(cname);
+					} else {
+						break;
+					}
+				}
+
+				emit_signal(SNAME("go_to_help"), "class_signal:" + result.class_name + ":" + result.class_member);
+
 			} break;
 			case ScriptLanguage::LOOKUP_RESULT_CLASS_ENUM: {
 				StringName cname = result.class_name;

+ 15 - 0
modules/gdscript/gdscript_editor.cpp

@@ -1057,6 +1057,14 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
 						r_result.insert(option.display, option);
 					}
 
+					List<MethodInfo> signals;
+					ClassDB::get_signal_list(type, &signals);
+					for (const MethodInfo &E : signals) {
+						int location = p_recursion_depth + _get_signal_location(type, StringName(E.name));
+						ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_SIGNAL, location);
+						r_result.insert(option.display, option);
+					}
+
 					if (!_static || Engine::get_singleton()->has_singleton(type)) {
 						List<PropertyInfo> pinfo;
 						ClassDB::get_property_list(type, &pinfo);
@@ -3058,6 +3066,13 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co
 					}
 				}
 
+				if (ClassDB::has_signal(class_name, p_symbol, true)) {
+					r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_SIGNAL;
+					r_result.class_name = base_type.native_type;
+					r_result.class_member = p_symbol;
+					return OK;
+				}
+
 				StringName enum_name = ClassDB::get_integer_constant_enum(class_name, p_symbol, true);
 				if (enum_name != StringName()) {
 					r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_ENUM;