Browse Source

Add MethodInfo to signal datatype

ocean (they/them) 2 years ago
parent
commit
d93dbab054

+ 11 - 10
modules/gdscript/gdscript_analyzer.cpp

@@ -901,18 +901,19 @@ void GDScriptAnalyzer::resolve_class_member(GDScriptParser::ClassNode *p_class,
 
 				member.signal->set_datatype(resolving_datatype);
 
+				// This is the _only_ way to declare a signal. Therefore, we can generate its
+				// MethodInfo inline so it's a tiny bit more efficient.
+				MethodInfo mi = MethodInfo(member.signal->identifier->name);
+
 				for (int j = 0; j < member.signal->parameters.size(); j++) {
-					GDScriptParser::DataType signal_type = resolve_datatype(member.signal->parameters[j]->datatype_specifier);
-					signal_type.is_meta_type = false;
-					member.signal->parameters[j]->set_datatype(signal_type);
+					GDScriptParser::ParameterNode *param = member.signal->parameters[j];
+					GDScriptParser::DataType param_type = resolve_datatype(param->datatype_specifier);
+					param_type.is_meta_type = false;
+					param->set_datatype(param_type);
+					mi.arguments.push_back(PropertyInfo(param_type.builtin_type, param->identifier->name));
+					// TODO: add signal parameter default values
 				}
-				// TODO: Make MethodInfo from signal.
-				GDScriptParser::DataType signal_type;
-				signal_type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
-				signal_type.kind = GDScriptParser::DataType::BUILTIN;
-				signal_type.builtin_type = Variant::SIGNAL;
-
-				member.signal->set_datatype(signal_type);
+				member.signal->set_datatype(make_signal_type(mi));
 
 				// Apply annotations.
 				for (GDScriptParser::AnnotationNode *&E : member.signal->annotations) {

+ 4 - 0
modules/gdscript/tests/scripts/analyzer/errors/assign_signal.gd

@@ -0,0 +1,4 @@
+signal your_base
+signal my_base
+func test():
+	your_base = my_base

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/assign_signal.out

@@ -0,0 +1,2 @@
+GDTEST_ANALYZER_ERROR
+Cannot assign a new value to a constant.