From: Jürg Billeter Date: Sat, 9 Jan 2010 11:12:22 +0000 (+0100) Subject: Support to_string for enums X-Git-Tag: 0.7.10~116 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1fbdecd6d5bc61c6347fc1718368a0fbbafec0c9;p=thirdparty%2Fvala.git Support to_string for enums --- diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala index a7c69ae24..6efc13a4f 100644 --- a/codegen/valagtypemodule.vala +++ b/codegen/valagtypemodule.vala @@ -1924,4 +1924,23 @@ internal class Vala.GTypeModule : GErrorModule { source_type_member_definition.append (type_fun.get_definition ()); } } + + public override void visit_method_call (MethodCall expr) { + var ma = expr.call as MemberAccess; + var mtype = expr.call.value_type as MethodType; + if (mtype == null || mtype.method_symbol.get_full_name () != "GLib.Enum.to_string" || + ma == null || ma.inner.value_type.get_type_id () == null) { + base.visit_method_call (expr); + return; + } + + var class_ref = new CCodeFunctionCall (new CCodeIdentifier ("g_type_class_ref")); + class_ref.add_argument (new CCodeIdentifier (ma.inner.value_type.get_type_id ())); + + var get_value = new CCodeFunctionCall (new CCodeIdentifier ("g_enum_get_value")); + get_value.add_argument (class_ref); + get_value.add_argument ((CCodeExpression) get_ccodenode (((MemberAccess) expr.call).inner)); + var value_nick = new CCodeMemberAccess.pointer (get_value, "value_nick"); + expr.ccodenode = value_nick; + } } diff --git a/vala/valaenumvaluetype.vala b/vala/valaenumvaluetype.vala index bf138b00f..979bfe22e 100644 --- a/vala/valaenumvaluetype.vala +++ b/vala/valaenumvaluetype.vala @@ -38,4 +38,12 @@ public class Vala.EnumValueType : ValueType { return result; } + + public override Symbol? get_member (string member_name) { + var result = base.get_member (member_name); + if (result == null) { + result = CodeContext.get ().root.scope.lookup ("GLib").scope.lookup ("Enum").scope.lookup (member_name); + } + return result; + } } diff --git a/vapi/gobject-2.0.vapi b/vapi/gobject-2.0.vapi index 1fa00882b..37c09eb0d 100644 --- a/vapi/gobject-2.0.vapi +++ b/vapi/gobject-2.0.vapi @@ -242,6 +242,11 @@ namespace GLib { public class InitiallyUnowned : Object { } + [CCode (cname = "int")] + public struct Enum : int { + public unowned string to_string (); + } + [CCode (lower_case_csuffix = "enum")] public class EnumClass : TypeClass { public weak EnumValue? get_value (int value);