Exemple #1
0
        public override void visit_delegate(ValaDelegate cb)
        {
            current_scope = cb.scope;

            cb.accept_children(this);

            current_scope = current_scope.parent_scope;
        }
Exemple #2
0
        /// <summary>
        /// Returns generated delegate to be used for signal handlers.
        ///
        /// <returns>delegate</returns>
        /// </summary>
        public ValaDelegate get_delegate(DataType sender_type, CodeNode node_reference)
        {
            var actual_return_type = return_type.get_actual_type(sender_type, null, node_reference);

            var generated_delegate = new ValaDelegate(null, actual_return_type);

            generated_delegate.access = SymbolAccessibility.PUBLIC;
            generated_delegate.owner  = scope;

            // sender parameter is never null and doesn't own its value
            var sender_param_type = sender_type.copy();

            sender_param_type.value_owned = false;
            sender_param_type.nullable    = false;

            generated_delegate.sender_type = sender_param_type;

            bool is_generic = false;

            foreach (Parameter param in parameters)
            {
                var actual_param = param.copy();
                actual_param.variable_type = actual_param.variable_type.get_actual_type(sender_type, null, node_reference);
                generated_delegate.add_parameter(actual_param);

                if (actual_param.variable_type is GenericType)
                {
                    is_generic = true;
                }
            }

            if (is_generic)
            {
                var cl = (ObjectTypeSymbol)parent_symbol;
                foreach (var type_param in cl.get_type_parameters())
                {
                    generated_delegate.add_type_parameter(new TypeParameter(type_param.name, type_param.source_reference));
                }

                // parameter types must refer to the delegate type parameters
                // instead of to the class type parameters
                foreach (var param in generated_delegate.get_parameters())
                {
                    if (param.variable_type is GenericType)
                    {
                        param.variable_type.type_parameter = generated_delegate.get_type_parameters()[generated_delegate.get_type_parameter_index(param.variable_type.type_parameter.name)];
                    }
                }
            }

            scope.add(null, generated_delegate);

            return(generated_delegate);
        }
        public override void visit_delegate(ValaDelegate d)
        {
            d.accept_children(this);

            generate_delegate_declaration(d, cfile);

            if (!d.is_internal_symbol())
            {
                generate_delegate_declaration(d, header_file);
            }
            if (!d.is_private_symbol())
            {
                generate_delegate_declaration(d, internal_header_file);
            }
        }
Exemple #4
0
        /// <summary>
        /// Adds the specified delegate to this namespace.
        ///
        /// <param name="d">a delegate</param>
        /// </summary>
        public override void add_delegate(ValaDelegate d)
        {
            // namespaces do not support private memebers
            if (d.access == SymbolAccessibility.PRIVATE)
            {
                d.access = SymbolAccessibility.INTERNAL;
            }

            if (d.owner == null)
            {
                d.source_reference.file.add_node(d);
            }

            delegates.Add(d);
            scope.add(d.name, d);
        }
Exemple #5
0
 public DelegateType(ValaDelegate delegate_symbol)
 {
     this.delegate_symbol = delegate_symbol;
     this.is_called_once  = (delegate_symbol.get_attribute_string("CCode", "scope") == "async");
 }
        public override void generate_delegate_declaration(ValaDelegate d, CCodeFile decl_space)
        {
            if (add_symbol_declaration(decl_space, d, get_ccode_name(d)))
            {
                return;
            }

            string return_type_cname = get_ccode_name(d.return_type);

            if (d.return_type.is_real_non_null_struct_type())
            {
                // structs are returned via out parameter
                return_type_cname = "void";
            }

            if (return_type_cname == get_ccode_name(d))
            {
                // recursive delegate
                return_type_cname = "GCallback";
            }
            else
            {
                generate_type_declaration(d.return_type, decl_space);
            }

            var cfundecl = new CCodeFunctionDeclarator(get_ccode_name(d));

            foreach (Parameter param in d.get_parameters())
            {
                var cparam = generate_parameter(param, decl_space, new Dictionary <int, CCodeParameter>(), null);

                cfundecl.add_parameter(cparam);

                // handle array parameters
                if (get_ccode_array_length(param) && param.variable_type is ArrayType)
                {
                    var array_type = (ArrayType)param.variable_type;

                    var length_ctype = "int";
                    if (param.direction != ParameterDirection.IN)
                    {
                        length_ctype = "int*";
                    }

                    for (int dim = 1; dim <= array_type.rank; dim++)
                    {
                        cparam = new CCodeParameter(get_parameter_array_length_cname(param, dim), length_ctype);
                        cfundecl.add_parameter(cparam);
                    }
                }
                // handle delegate parameters
                if (param.variable_type is DelegateType)
                {
                    var deleg_type = (DelegateType)param.variable_type;
                    var param_d    = deleg_type.delegate_symbol;
                    if (param_d.has_target)
                    {
                        cparam = new CCodeParameter(get_delegate_target_cname(get_variable_cname(param.name)), "void*");
                        cfundecl.add_parameter(cparam);
                        if (deleg_type.is_disposable())
                        {
                            cparam = new CCodeParameter(get_delegate_target_destroy_notify_cname(get_variable_cname(param.name)), "GDestroyNotify*");
                            cfundecl.add_parameter(cparam);
                        }
                    }
                }
            }
            if (get_ccode_array_length(d) && d.return_type is ArrayType)
            {
                // return array length if appropriate
                var array_type        = (ArrayType)d.return_type;
                var array_length_type = get_ccode_array_length_type(d) != null?get_ccode_array_length_type(d) : "int";

                array_length_type += "*";

                for (int dim = 1; dim <= array_type.rank; dim++)
                {
                    var cparam = new CCodeParameter(get_array_length_cname("result", dim), array_length_type);
                    cfundecl.add_parameter(cparam);
                }
            }
            else if (d.return_type is DelegateType)
            {
                // return delegate target if appropriate
                var deleg_type = (DelegateType)d.return_type;
                var result_d   = deleg_type.delegate_symbol;
                if (result_d.has_target)
                {
                    var cparam = new CCodeParameter(get_delegate_target_cname("result"), "void**");
                    cfundecl.add_parameter(cparam);
                    if (deleg_type.is_disposable())
                    {
                        cparam = new CCodeParameter(get_delegate_target_destroy_notify_cname("result"), "GDestroyNotify*");
                        cfundecl.add_parameter(cparam);
                    }
                }
            }
            else if (d.return_type.is_real_non_null_struct_type())
            {
                var cparam = new CCodeParameter("result", "%s*".printf(get_ccode_name(d.return_type)));
                cfundecl.add_parameter(cparam);
            }
            if (d.has_target)
            {
                var cparam = new CCodeParameter("user_data", "void*");
                cfundecl.add_parameter(cparam);
            }
            if (d.get_error_types().Count > 0)
            {
                var cparam = new CCodeParameter("error", "GError**");
                cfundecl.add_parameter(cparam);
            }

            var ctypedef = new CCodeTypeDefinition(return_type_cname, cfundecl);

            ctypedef.modifiers |= (d.version.deprecated ? CCodeModifiers.DEPRECATED : 0);

            decl_space.add_type_definition(ctypedef);
        }
 public override void visit_delegate(ValaDelegate d)
 {
     d.accept_children(this);
 }
Exemple #8
0
 public virtual void add_delegate(ValaDelegate d)
 {
     Report.error(d.source_reference, "unexpected declaration");
 }
Exemple #9
0
 public override void visit_delegate(ValaDelegate cb)
 {
     check_unused_attr(cb);
     cb.accept_children(this);
 }
Exemple #10
0
 /// <summary>
 /// Visit operation called for delegates.
 ///
 /// <param name="d">a delegate</param>
 /// </summary>
 public virtual void visit_delegate(ValaDelegate d)
 {
 }