[vala/wip/issue548: 5/5] vala: Allow get_actual_type() to be used for expected failures



commit 3c89226ed5eeaa25b5bac0de3c39a84845fb6359
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sat Dec 1 14:13:31 2018 +0100

    vala: Allow get_actual_type() to be used for expected failures
    
    If the passed node_reference is null there won't be any error reporting.
    The resovled DataType will be an InvalidType on errors as usual.

 vala/valaarraytype.vala        |  2 +-
 vala/valadatatype.vala         |  2 +-
 vala/valagenerictype.vala      |  2 +-
 vala/valapointertype.vala      |  2 +-
 vala/valasemanticanalyzer.vala | 24 +++++++++++++++---------
 5 files changed, 19 insertions(+), 13 deletions(-)
---
diff --git a/vala/valaarraytype.vala b/vala/valaarraytype.vala
index 7f4b45dda..8265a8027 100644
--- a/vala/valaarraytype.vala
+++ b/vala/valaarraytype.vala
@@ -316,7 +316,7 @@ public class Vala.ArrayType : ReferenceType {
                return element_type.check (context);
        }
 
-       public override DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode node_reference) {
+       public override DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode? node_reference) {
                ArrayType result = (ArrayType) this.copy ();
 
                if (derived_instance_type == null && method_type_arguments == null) {
diff --git a/vala/valadatatype.vala b/vala/valadatatype.vala
index 85d8fb87b..51594c7a9 100644
--- a/vala/valadatatype.vala
+++ b/vala/valadatatype.vala
@@ -456,7 +456,7 @@ public abstract class Vala.DataType : CodeNode {
                return false;
        }
 
-       public virtual DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode node_reference) {
+       public virtual DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode? node_reference) {
                DataType result = this.copy ();
 
                if (derived_instance_type == null && method_type_arguments == null) {
diff --git a/vala/valagenerictype.vala b/vala/valagenerictype.vala
index 0a229a43e..e5e1a50a8 100644
--- a/vala/valagenerictype.vala
+++ b/vala/valagenerictype.vala
@@ -47,7 +47,7 @@ public class Vala.GenericType : DataType {
                return result;
        }
 
-       public override DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode node_reference) {
+       public override DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode? node_reference) {
                var result = this.copy ();
 
                if (derived_instance_type == null && method_type_arguments == null) {
diff --git a/vala/valapointertype.vala b/vala/valapointertype.vala
index 6e0d799cf..01d759eda 100644
--- a/vala/valapointertype.vala
+++ b/vala/valapointertype.vala
@@ -123,7 +123,7 @@ public class Vala.PointerType : DataType {
                return false;
        }
 
-       public override DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode node_reference) {
+       public override DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, CodeNode? node_reference) {
                PointerType result = (PointerType) this.copy ();
 
                if (derived_instance_type == null && method_type_arguments == null) {
diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala
index 139103b89..485ab222d 100644
--- a/vala/valasemanticanalyzer.vala
+++ b/vala/valasemanticanalyzer.vala
@@ -765,7 +765,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                return instance_base_type;
        }
 
-       internal static DataType? get_instance_base_type_for_member (DataType derived_instance_type, 
TypeSymbol type_symbol, CodeNode node_reference) {
+       internal static DataType? get_instance_base_type_for_member (DataType derived_instance_type, 
TypeSymbol type_symbol, CodeNode? node_reference) {
                DataType instance_type = derived_instance_type;
 
                while (instance_type is PointerType) {
@@ -840,7 +840,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                return null;
        }
 
-       public static DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, GenericType generic_type, CodeNode node_reference) {
+       public static DataType get_actual_type (DataType? derived_instance_type, List<DataType>? 
method_type_arguments, GenericType generic_type, CodeNode? node_reference) {
                DataType actual_type = null;
                if (generic_type.type_parameter.parent_symbol is TypeSymbol) {
                        if (derived_instance_type != null) {
@@ -848,9 +848,11 @@ 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) {
-                                       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;
+                                       if (node_reference != null) {
+                                               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 ();
                                }
 
@@ -861,8 +863,10 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                                        param_index = instance_type.data_type.get_type_parameter_index 
(generic_type.type_parameter.name);
                                }
                                if (param_index == -1) {
-                                       Report.error (node_reference.source_reference, "internal error: 
unknown type parameter %s".printf (generic_type.type_parameter.name));
-                                       node_reference.error = true;
+                                       if (node_reference != null) {
+                                               Report.error (node_reference.source_reference, "internal 
error: unknown type parameter %s".printf (generic_type.type_parameter.name));
+                                               node_reference.error = true;
+                                       }
                                        return new InvalidType ();
                                }
 
@@ -876,8 +880,10 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
 
                        int param_index = m.get_type_parameter_index (generic_type.type_parameter.name);
                        if (param_index == -1) {
-                               Report.error (node_reference.source_reference, "internal error: unknown type 
parameter %s".printf (generic_type.type_parameter.name));
-                               node_reference.error = true;
+                               if (node_reference != null) {
+                                       Report.error (node_reference.source_reference, "internal error: 
unknown type parameter %s".printf (generic_type.type_parameter.name));
+                                       node_reference.error = true;
+                               }
                                return new InvalidType ();
                        }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]