generics/parameter-invalid-initializer.test \
generics/parameter-sizeof-initializer.vala \
generics/member-dup-destroy.vala \
+ generics/method-parameter-unknown-type-parameter.test \
+ generics/method-parameter-unknown-type-parameter-2.test \
+ generics/method-return-unknown-type-parameter.test \
+ generics/method-return-unknown-type-parameter-2.test \
generics/null-type.vala \
generics/property-gobject-set.vala \
generics/property-int-cast.vala \
Report.error (source_reference, "[Print] methods must have exactly one parameter of type `string'");
}
+ // Collect generic type references
+ // TODO Can this be done in the SymbolResolver?
+ List<GenericType> referenced_generics = new ArrayList<GenericType> ();
+ var traverse = new TraverseVisitor (node => {
+ if (node is GenericType) {
+ referenced_generics.add ((GenericType) node);
+ return TraverseStatus.STOP;
+ }
+ return TraverseStatus.CONTINUE;
+ });
+
+ return_type.accept (traverse);
+
var optional_param = false;
var params_array_param = false;
var ellipsis_param = false;
Report.error (param.source_reference, "Variadic parameters are not supported for async methods");
return false;
}
+
+ param.accept_children (traverse);
+
// TODO: begin and end parameters must be checked separately for coroutines
if (coroutine) {
continue;
}
}
+ // Check if referenced type-parameters are present
+ // TODO Can this be done in the SymbolResolver?
+ if (binding == MemberBinding.STATIC && parent_symbol is Class && !((Class) parent_symbol).is_compact) {
+ Iterator<GenericType> ref_generics_it = referenced_generics.iterator ();
+ while (ref_generics_it.next ()) {
+ var ref_generics = ref_generics_it.get ();
+ foreach (var type_param in get_type_parameters ()) {
+ if (ref_generics.type_parameter.name == type_param.name) {
+ ref_generics_it.remove ();
+ }
+ }
+ }
+ foreach (var type in referenced_generics) {
+ error = true;
+ Report.error (type.source_reference, "The type name `%s' could not be found", type.type_parameter.name);
+ }
+ }
+
if (coroutine) {
// TODO: async methods with out-parameters before in-parameters are not supported
bool requires_pointer = false;