From 34d765527402102549d8ab1717d346c126cdaedb Mon Sep 17 00:00:00 2001 From: Fraser Waters Date: Mon, 17 Jul 2017 10:39:21 +0100 Subject: [PATCH] Emit CountAttributes during binding Adds a new parameter attribute CountAttribute that is emitted during binding. CountAttribute is based on the "len" attribute in the specifications. It describes what the expected count/length of the parameter is. During rewrite we remove these attributes. --- src/Generator.Bind/CSharpSpecWriter.cs | 36 ++++++++++++++- src/Generator.Bind/XmlSpecReader.cs | 7 --- src/Generator.Rewrite/Program.cs | 13 ++++++ src/OpenTK/CountAttribute.cs | 63 ++++++++++++++++++++++++++ src/OpenTK/OpenTK.Android.csproj | 1 + src/OpenTK/OpenTK.csproj | 3 ++ src/OpenTK/OpenTK.iOS.csproj | 1 + 7 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 src/OpenTK/CountAttribute.cs diff --git a/src/Generator.Bind/CSharpSpecWriter.cs b/src/Generator.Bind/CSharpSpecWriter.cs index 3b7a967b..4e4958ff 100644 --- a/src/Generator.Bind/CSharpSpecWriter.cs +++ b/src/Generator.Bind/CSharpSpecWriter.cs @@ -695,13 +695,45 @@ namespace Bind { StringBuilder sb = new StringBuilder(); + List attributes = new List(); if (p.Flow == FlowDirection.Out) { - sb.Append("[OutAttribute] "); + attributes.Add("OutAttribute"); } else if (p.Flow == FlowDirection.Undefined) { - sb.Append("[InAttribute, OutAttribute] "); + attributes.Add("InAttribute"); + attributes.Add("OutAttribute"); + } + + if (!String.IsNullOrEmpty(p.ComputeSize)) + { + int count; + if(Int32.TryParse(p.ComputeSize, out count)) + { + attributes.Add(String.Format("CountAttribute(Count = {0})", count)); + } + else + { + if(p.ComputeSize.StartsWith("COMPSIZE")) + { + //remove the compsize hint, just keep comma delimited param names + var len = "COMPSIZE(".Length; + var computed = p.ComputeSize.Substring(len, (p.ComputeSize.Length - len) - 1); + attributes.Add(String.Format("CountAttribute(Computed = \"{0}\")", computed)); + } + else + { + attributes.Add(String.Format("CountAttribute(Parameter = \"{0}\")", p.ComputeSize)); + } + } + } + + if(attributes.Count != 0) + { + sb.Append("["); + sb.Append(string.Join(", ", attributes)); + sb.Append("] "); } if (p.Reference) diff --git a/src/Generator.Bind/XmlSpecReader.cs b/src/Generator.Bind/XmlSpecReader.cs index 7a5c1255..67e72648 100644 --- a/src/Generator.Bind/XmlSpecReader.cs +++ b/src/Generator.Bind/XmlSpecReader.cs @@ -319,13 +319,6 @@ namespace Bind } p.ComputeSize = param.GetAttribute("count", String.Empty).Trim(); - if (p.ComputeSize.StartsWith("COMPSIZE")) - { - //remove the compsize hint, just keep comma delimited param names - var len = "COMPSIZE(".Length; - p.ComputeSize = p.ComputeSize.Substring(len, (p.ComputeSize.Length - len) - 1); - } - p.Flow = Parameter.GetFlowDirection(param.GetAttribute("flow", String.Empty).Trim()); d.Parameters.Add(p); diff --git a/src/Generator.Rewrite/Program.cs b/src/Generator.Rewrite/Program.cs index ac712126..70b41625 100644 --- a/src/Generator.Rewrite/Program.cs +++ b/src/Generator.Rewrite/Program.cs @@ -256,6 +256,19 @@ namespace OpenTK.Rewrite i--; } } + + foreach (var parameter in method.Parameters) + { + var pattr = parameter.CustomAttributes; + for (int i = 0; i < pattr.Count; i++) + { + if (pattr[i].AttributeType.Name == "CountAttribute") + { + pattr.RemoveAt(i); + i--; + } + } + } } } diff --git a/src/OpenTK/CountAttribute.cs b/src/OpenTK/CountAttribute.cs new file mode 100644 index 00000000..93b3a3d4 --- /dev/null +++ b/src/OpenTK/CountAttribute.cs @@ -0,0 +1,63 @@ +// +// The Open Toolkit Library License +// +// Copyright (c) 2017 the Open Toolkit library, except where noted. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenTK +{ + /// + /// Used to indicate how to calculate the count/length of a parameter. + /// + /// Only one of Parameter, Count, or Computed should be set. + /// + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] + public sealed class CountAttribute : Attribute + { + /// + /// Specifies another parameter to look at for the count of this parameter. + /// + public string Parameter; + + /// + /// Specifies a fixed count. + /// + public int Count; + + /// + /// Specifies a computed count based on other parameters. + /// + public string Computed; + + /// + /// Constructs a new CountAttribute instance. + /// + public CountAttribute() + { + } + } +} + diff --git a/src/OpenTK/OpenTK.Android.csproj b/src/OpenTK/OpenTK.Android.csproj index b8befb8b..1b4653c1 100644 --- a/src/OpenTK/OpenTK.Android.csproj +++ b/src/OpenTK/OpenTK.Android.csproj @@ -56,6 +56,7 @@ + diff --git a/src/OpenTK/OpenTK.csproj b/src/OpenTK/OpenTK.csproj index 04a5a8ac..fcb71087 100644 --- a/src/OpenTK/OpenTK.csproj +++ b/src/OpenTK/OpenTK.csproj @@ -167,6 +167,9 @@ Code + + Code + Code diff --git a/src/OpenTK/OpenTK.iOS.csproj b/src/OpenTK/OpenTK.iOS.csproj index 9054b11e..7bd14b76 100644 --- a/src/OpenTK/OpenTK.iOS.csproj +++ b/src/OpenTK/OpenTK.iOS.csproj @@ -47,6 +47,7 @@ +