]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support to_string for enums
authorJürg Billeter <j@bitron.ch>
Sat, 9 Jan 2010 11:12:22 +0000 (12:12 +0100)
committerJürg Billeter <j@bitron.ch>
Sat, 9 Jan 2010 11:12:22 +0000 (12:12 +0100)
codegen/valagtypemodule.vala
vala/valaenumvaluetype.vala
vapi/gobject-2.0.vapi

index a7c69ae24057818e81f1d381c4dbb25af37d5a20..6efc13a4fac7726c20dcd59ec31cd6a6ea78ea65 100644 (file)
@@ -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;
+       }
 }
index bf138b00f41f5770669812bb44e6429858486a64..979bfe22ecc7f159fd95615bb4c562a6b9d653ac 100644 (file)
@@ -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;
+       }
 }
index 1fa00882b99fb069a55624a12cd3fac972cb74d5..37c09eb0d4b25372ce8c0cbc792b7075f66462f9 100644 (file)
@@ -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);