]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Improve error message for missing type-parameter on enclosing type
authorRico Tzschichholz <ricotz@ubuntu.com>
Fri, 8 Dec 2017 23:19:06 +0000 (00:19 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 9 Dec 2017 13:34:50 +0000 (14:34 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=587905

vala/valasemanticanalyzer.vala

index e407ee29dfa1ecf556026bb78a55c46a06079858..7da758aab0463860c513eac05577bb1378487cac 100644 (file)
@@ -379,6 +379,28 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                return type;
        }
 
+       public static Symbol? get_symbol_for_data_type (DataType type) {
+               Symbol? sym = null;
+
+               if (type is ObjectType) {
+                       sym = ((ObjectType) type).type_symbol;
+               } else if (type is ClassType) {
+                       sym = ((ClassType) type).class_symbol;
+               } else if (type is InterfaceType) {
+                       sym = ((InterfaceType) type).interface_symbol;
+               } else if (type is MethodType) {
+                       sym = ((MethodType) type).method_symbol;
+               } else if (type is SignalType) {
+                       sym = ((SignalType) type).signal_symbol;
+               } else if (type is DelegateType) {
+                       sym = ((DelegateType) type).delegate_symbol;
+               } else if (type is ValueType) {
+                       sym = ((ValueType) type).type_symbol;
+               }
+
+               return sym;
+       }
+
        public bool check_arguments (Expression expr, DataType mtype, List<Parameter> params, List<Expression> args) {
                Expression prev_arg = null;
                Iterator<Expression> arg_it = args.iterator ();
@@ -818,7 +840,8 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                                var instance_type = get_instance_base_type_for_member (derived_instance_type, (TypeSymbol) generic_type.type_parameter.parent_symbol, node_reference);
 
                                if (instance_type == null) {
-                                       Report.error (node_reference.source_reference, "The type-parameter `%s' must be defined on enclosing type".printf (generic_type.to_string ()));
+                                       CodeNode? reference = get_symbol_for_data_type (derived_instance_type);
+                                       Report.error ((reference ?? node_reference).source_reference, "The type-parameter `%s' is missing".printf (generic_type.to_string ()));
                                        node_reference.error = true;
                                        return new InvalidType ();
                                }