From 388a2fe65993311d4b4d4ba1903cfc26468b588a Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Wed, 9 Oct 2013 15:31:10 +0200 Subject: [PATCH] generator: added handling of optional parameters --- generator/Method.cs | 11 +++++++++++ generator/Parameter.cs | 6 ++++++ generator/Parameters.cs | 8 ++++++++ generator/Signature.cs | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/generator/Method.cs b/generator/Method.cs index 59711bfe6..14cb56a6f 100644 --- a/generator/Method.cs +++ b/generator/Method.cs @@ -207,6 +207,14 @@ namespace GtkSharp.Generation { } } + public void GenerateOverloads (StreamWriter sw) + { + sw.WriteLine (); + sw.WriteLine ("\t\t" + retval.CSType + " " + Name + "(" + (Signature != null ? Signature.WithoutOptional () : "") + ") {"); + sw.WriteLine ("\t\t\t{0}{1} ({2});", !retval.IsVoid ? "return " : String.Empty, Name, Signature.CallWithoutOptionals ()); + sw.WriteLine ("\t\t}"); + } + public void Generate (GenerationInfo gen_info, ClassBase implementor) { Method comp = null; @@ -266,6 +274,9 @@ namespace GtkSharp.Generation { } else gen_info.Writer.WriteLine(); + + if (Parameters.HasOptional && !(is_get || is_set)) + GenerateOverloads (gen_info.Writer); gen_info.Writer.WriteLine(); diff --git a/generator/Parameter.cs b/generator/Parameter.cs index 1344ea102..31d2063f0 100644 --- a/generator/Parameter.cs +++ b/generator/Parameter.cs @@ -90,6 +90,12 @@ namespace GtkSharp.Generation { } } + internal bool IsOptional { + get { + return elem.GetAttributeAsBoolean ("allow-none"); + } + } + bool is_count; bool is_count_set; public bool IsCount { diff --git a/generator/Parameters.cs b/generator/Parameters.cs index ae953ab7e..067fd8801 100644 --- a/generator/Parameters.cs +++ b/generator/Parameters.cs @@ -142,6 +142,11 @@ namespace GtkSharp.Generation { set { is_static = value; } } + bool has_optional; + internal bool HasOptional { + get { return has_optional;} + } + public Parameter GetCountParameter (string param_name) { foreach (Parameter p in this) @@ -198,6 +203,9 @@ namespace GtkSharp.Generation { return false; } + if (p.IsOptional && p.PassAs == String.Empty) + has_optional = true; + IGeneratable gen = p.Generatable; if (p.IsArray) { diff --git a/generator/Signature.cs b/generator/Signature.cs index 80808ddd3..9c2683ce7 100644 --- a/generator/Signature.cs +++ b/generator/Signature.cs @@ -118,6 +118,44 @@ namespace GtkSharp.Generation { return String.Join (", ", result); } } + + public string WithoutOptional () + { + if (parms.Count == 0) + return String.Empty; + + var result = new string [parms.Count]; + int i = 0; + + foreach (Parameter p in parms) { + if (p.IsOptional && p.PassAs == String.Empty) + continue; + result [i] = p.PassAs != String.Empty ? p.PassAs + " " : String.Empty; + result [i++] += p.CSType + " " + p.Name; + } + + return String.Join (", ", result, 0, i); + } + + public string CallWithoutOptionals () + { + if (parms.Count == 0) + return String.Empty; + + var result = new string [parms.Count]; + int i = 0; + + foreach (Parameter p in parms) { + + result [i] = p.PassAs != "" ? p.PassAs + " " : ""; + if (p.IsOptional && p.PassAs == String.Empty) + result [i++] += (p.Generatable is StructGen || p.Generatable is BoxedGen) ? (p.CSType + ".Zero") : "null"; + else + result [i++] += p.Name; + } + + return String.Join (", ", result); + } } }