[vala/staging] Set TypeParameter as symbol of GenericType



commit cdcaaab581118b843d8644020e89aef91202dd38
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sun Apr 18 21:02:21 2021 +0200

    Set TypeParameter as symbol of GenericType

 codegen/valaccodeattribute.vala  | 16 ++++++++++++++++
 codegen/valaccodebasemodule.vala |  2 +-
 codegen/valagirwriter.vala       |  8 ++++----
 vala/valadatatype.vala           |  5 ++---
 vala/valagenerictype.vala        |  8 ++++++--
 vala/valatypeparameter.vala      |  1 +
 6 files changed, 30 insertions(+), 10 deletions(-)
---
diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala
index d39fc284e..c3144e0c6 100644
--- a/codegen/valaccodeattribute.vala
+++ b/codegen/valaccodeattribute.vala
@@ -798,6 +798,22 @@ public class Vala.CCodeAttribute : AttributeCache {
                                } else {
                                        return name;
                                }
+                       } else if (sym is TypeParameter) {
+                               assert (node is GenericType);
+                               var type = (GenericType) node;
+                               if (type.value_owned) {
+                                       if (CodeContext.get ().profile == Profile.GOBJECT) {
+                                               return "gpointer";
+                                       } else {
+                                               return "void *";
+                                       }
+                               } else {
+                                       if (CodeContext.get ().profile == Profile.GOBJECT) {
+                                               return "gconstpointer";
+                                       } else {
+                                               return "const void *";
+                                       }
+                               }
                        } else {
                                return "%s%s".printf (get_ccode_prefix (sym.parent_symbol), sym.name);
                        }
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 759a8499c..cb472e578 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5779,7 +5779,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        return new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, instance_domain, 
type_domain);
                } else {
                        CCodeFunctionCall ccheck;
-                       if (type.type_symbol == null || type.type_symbol.external_package) {
+                       if (type is GenericType || type.type_symbol == null || 
type.type_symbol.external_package) {
                                ccheck = new CCodeFunctionCall (new CCodeIdentifier 
("G_TYPE_CHECK_INSTANCE_TYPE"));
                                ccheck.add_argument ((CCodeExpression) ccodenode);
                                ccheck.add_argument (get_type_id_expression (type));
diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala
index d60c3da3d..d0670d99e 100644
--- a/codegen/valagirwriter.vala
+++ b/codegen/valagirwriter.vala
@@ -1640,6 +1640,10 @@ public class Vala.GIRWriter : CodeVisitor {
                } else if (type is PointerType) {
                        write_indent ();
                        buffer.append_printf ("<type name=\"gpointer\" c:type=\"%s%s\"/>\n", get_ccode_name 
(type), direction == ParameterDirection.IN ? "" : "*");
+               } else if (type is GenericType) {
+                       // generic type parameters not supported in GIR
+                       write_indent ();
+                       buffer.append ("<type name=\"gpointer\" c:type=\"gpointer\"/>\n");
                } else if (type is DelegateType) {
                        var deleg_type = (DelegateType) type;
                        write_indent ();
@@ -1668,10 +1672,6 @@ public class Vala.GIRWriter : CodeVisitor {
                                write_indent ();
                                buffer.append_printf ("</%s>\n", is_array ? "array" : "type");
                        }
-               } else if (type is GenericType) {
-                       // generic type parameters not supported in GIR
-                       write_indent ();
-                       buffer.append ("<type name=\"gpointer\" c:type=\"gpointer\"/>\n");
                } else {
                        write_indent ();
                        buffer.append_printf ("<type name=\"%s\"/>\n", type.to_string ());
diff --git a/vala/valadatatype.vala b/vala/valadatatype.vala
index 8ad4cc0cc..03c282cd1 100644
--- a/vala/valadatatype.vala
+++ b/vala/valadatatype.vala
@@ -524,9 +524,8 @@ public abstract class Vala.DataType : CodeNode {
 
        public void replace_type_parameter (TypeParameter old_type_param, TypeParameter new_type_param) {
                if (this is GenericType) {
-                       unowned GenericType generic_type = (GenericType) this;
-                       if (generic_type.type_parameter == old_type_param) {
-                               generic_type.type_parameter = new_type_param;
+                       if (symbol == old_type_param) {
+                               symbol = new_type_param;
                        }
                        return;
                }
diff --git a/vala/valagenerictype.vala b/vala/valagenerictype.vala
index 1f7a2d1ee..1a20241d9 100644
--- a/vala/valagenerictype.vala
+++ b/vala/valagenerictype.vala
@@ -29,13 +29,17 @@ public class Vala.GenericType : DataType {
        /**
         * The referred generic type parameter.
         */
-       public weak TypeParameter type_parameter { get; set; }
+       public weak TypeParameter type_parameter {
+               get {
+                       return (TypeParameter) type_symbol;
+               }
+       }
 
        GenericDupField? dup_field;
        GenericDestroyField? destroy_field;
 
        public GenericType (TypeParameter type_parameter) {
-               this.type_parameter = type_parameter;
+               base.with_symbol (type_parameter);
                // type parameters are always considered nullable
                this.nullable = true;
        }
diff --git a/vala/valatypeparameter.vala b/vala/valatypeparameter.vala
index d148d6eeb..5c1260982 100644
--- a/vala/valatypeparameter.vala
+++ b/vala/valatypeparameter.vala
@@ -35,6 +35,7 @@ public class Vala.TypeParameter : TypeSymbol {
         */
        public TypeParameter (string name, SourceReference? source_reference = null) {
                base (name, source_reference);
+               access = SymbolAccessibility.PUBLIC;
        }
 
        public override void accept (CodeVisitor visitor) {


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