[vala] Support to_string for enums



commit 1fbdecd6d5bc61c6347fc1718368a0fbbafec0c9
Author: Jürg Billeter <j bitron ch>
Date:   Sat Jan 9 12:12:22 2010 +0100

    Support to_string for enums

 codegen/valagtypemodule.vala |   19 +++++++++++++++++++
 vala/valaenumvaluetype.vala  |    8 ++++++++
 vapi/gobject-2.0.vapi        |    5 +++++
 3 files changed, 32 insertions(+), 0 deletions(-)
---
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index a7c69ae..6efc13a 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 bf138b0..979bfe2 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 1fa0088..37c09eb 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]