Index: vapigen/valagidlparser.vala =================================================================== --- vapigen/valagidlparser.vala (revision 602) +++ vapigen/valagidlparser.vala (working copy) @@ -224,7 +243,7 @@ ns.add_constant (c); current_source_file.add_node (c); } else if (node.type == IdlNodeTypeId.FUNCTION) { - var m = parse_function ((IdlNodeFunction) node); + var m = parse_function ((IdlNodeFunction) node, ns.name); if (m != null) { m.instance = false; ns.add_method (m); @@ -319,7 +338,7 @@ foreach (weak IdlNode member in st_node.members) { if (member.type == IdlNodeTypeId.FUNCTION) { - var m = parse_function ((IdlNodeFunction) member); + var m = parse_function ((IdlNodeFunction) member, ns.name); if (m != null) { st.add_method (m); } @@ -354,6 +373,11 @@ ns.add_class (cl); current_source_file.add_node (cl); + if (cl.get_default_cname() != node.name) + { + stderr.printf("setting name %s to %s\n", cl.get_cname(), node.name); + cl.set_cname(node.name); + } } current_data_type = cl; @@ -365,17 +389,18 @@ foreach (weak IdlNode member in st_node.members) { if (member.type == IdlNodeTypeId.FUNCTION) { - if (member.name == "ref") { + string name = fix_function_name(member.name, node.name); + if (name == "ref") { ref_function = ((IdlNodeFunction) member).symbol; - } else if (member.name == "unref") { + } else if (name == "unref") { unref_function = ((IdlNodeFunction) member).symbol; - } else if (member.name == "free" || member.name == "destroy") { + } else if (name == "free" || name == "destroy" || name == "delete") { free_function = ((IdlNodeFunction) member).symbol; } else { - if (member.name == "copy") { + if (name == "copy") { copy_function = ((IdlNodeFunction) member).symbol; } - var m = parse_function ((IdlNodeFunction) member); + var m = parse_function ((IdlNodeFunction) member, node.name); if (m != null) { cl.add_method (m); } @@ -434,7 +459,7 @@ foreach (weak IdlNode member in boxed_node.members) { if (member.type == IdlNodeTypeId.FUNCTION) { - var m = parse_function ((IdlNodeFunction) member); + var m = parse_function ((IdlNodeFunction) member, node.name); if (m != null) { st.add_method (m); } @@ -492,7 +517,7 @@ if (member.name == "copy") { copy_function = ((IdlNodeFunction) member).symbol; } - var m = parse_function ((IdlNodeFunction) member); + var m = parse_function ((IdlNodeFunction) member, node.name); if (m != null) { cl.add_method (m); } @@ -624,7 +649,7 @@ if (member.type == IdlNodeTypeId.FUNCTION) { bool is_virtual = current_type_vfunc_map.get (member.name) != null; - var m = parse_function ((IdlNodeFunction) member, is_virtual); + var m = parse_function ((IdlNodeFunction) member, node.gtype_name, is_virtual); if (m != null) { cl.add_method (m); } @@ -711,7 +736,7 @@ if (member.type == IdlNodeTypeId.FUNCTION) { bool is_virtual = current_type_vfunc_map.get (member.name) != null; - var m = parse_function ((IdlNodeFunction) member, is_virtual, true); + var m = parse_function ((IdlNodeFunction) member, node.gtype_name, is_virtual, true); if (m != null) { iface.add_method (m); } @@ -952,8 +977,27 @@ return type; } - - private Method parse_function (IdlNodeFunction! f, bool is_virtual = false, bool is_interface = false) { + + private string fix_function_name(string! function_name, string klass) + { + if (klass != null) + { + var attributes = get_attributes (klass); + if (attributes != null) { + foreach (string attr in attributes) { + var nv = attr.split ("=", 2); + if (nv[0] == "function_prefix") { + string prefix = eval(nv[1]); + + return function_name.offset(prefix.len ()); + } + } + } + } + return function_name; + } + + private Method parse_function (IdlNodeFunction! f, string klass, bool is_virtual = false, bool is_interface = false) { weak IdlNode node = (IdlNode) f; if (f.deprecated) { @@ -966,15 +1010,16 @@ } Method m; - if (!is_interface && (f.is_constructor || node.name.has_prefix ("new"))) { - m = new CreationMethod (node.name, current_source_reference); + string name = fix_function_name(node.name, klass); + if (!is_interface && (f.is_constructor || name.has_prefix ("new"))) { + m = new CreationMethod (name, current_source_reference); if (m.name == "new") { m.name = null; } else if (m.name.has_prefix ("new_")) { m.name = m.name.offset ("new_".len ()); } } else { - m = new Method (node.name, return_type, current_source_reference); + m = new Method (name, return_type, current_source_reference); } m.access = SymbolAccessibility.PUBLIC; @@ -1040,7 +1085,7 @@ current_data_type != null && param.type.is_interface && (param_node.name == "self" || - param type interface has_suffix (current_data_type.get_cname ()))) { + fix_type_name(param type interface, current_namespace).has_suffix (fix_type_name(current_data_type.get_cname (), current_namespace)))) { // instance method if (!current_data_type.is_reference_type () &&