} 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);
}
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));
// Add cast for narrowed type access of variables if needed
if (expr.symbol_reference is Variable) {
unowned GLibValue cvalue = (GLibValue) expr.target_value;
- if (cvalue.value_type.type_symbol != null && cvalue.value_type.type_symbol != expr.value_type.type_symbol) {
+ if (!(cvalue.value_type is GenericType) && cvalue.value_type.type_symbol != null
+ && cvalue.value_type.type_symbol != expr.value_type.type_symbol) {
cvalue.cvalue = new CCodeCastExpression (cvalue.cvalue, get_ccode_name (expr.value_type));
}
}
} 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 ();
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 ());
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;
}
/**
* 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, SourceReference? source_reference = null) {
- this.type_parameter = type_parameter;
- this.source_reference = source_reference;
+ base.with_symbol (type_parameter, source_reference);
// type parameters are always considered nullable
this.nullable = true;
}
*/
public TypeParameter (string name, SourceReference? source_reference = null) {
base (name, source_reference);
+ access = SymbolAccessibility.PUBLIC;
}
public override void accept (CodeVisitor visitor) {