Emit CountAttributes during binding
authorFraser Waters <frassle@gmail.com>
Mon, 17 Jul 2017 09:39:21 +0000 (10:39 +0100)
committerFraser Waters <frassle@gmail.com>
Fri, 28 Jul 2017 05:16:48 +0000 (06:16 +0100)
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
src/Generator.Bind/XmlSpecReader.cs
src/Generator.Rewrite/Program.cs
src/OpenTK/CountAttribute.cs [new file with mode: 0644]
src/OpenTK/OpenTK.Android.csproj
src/OpenTK/OpenTK.csproj
src/OpenTK/OpenTK.iOS.csproj

index 3b7a967..4e4958f 100644 (file)
@@ -695,13 +695,45 @@ namespace Bind
         {
             StringBuilder sb = new StringBuilder();
 
+            List<string> attributes = new List<string>();
             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)
index 7a5c125..67e7264 100644 (file)
@@ -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);
index ac71212..70b4162 100644 (file)
@@ -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 (file)
index 0000000..93b3a3d
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// Used to indicate how to calculate the count/length of a parameter.
+    ///
+    /// Only one of Parameter, Count, or Computed should be set.
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
+    public sealed class CountAttribute : Attribute
+    {
+        /// <summary>
+        /// Specifies another parameter to look at for the count of this parameter.
+        /// </summary>
+        public string Parameter;
+
+        /// <summary>
+        /// Specifies a fixed count.
+        /// </summary>
+        public int Count;
+
+        /// <summary>
+        /// Specifies a computed count based on other parameters.
+        /// </summary>
+        public string Computed;
+
+        /// <summary>
+        /// Constructs a new CountAttribute instance.
+        /// </summary>
+        public CountAttribute()
+        {
+        }
+    }
+}
+
index b8befb8..1b4653c 100644 (file)
@@ -56,6 +56,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AutoGeneratedAttribute.cs" />
+    <Compile Include="CountAttribute.cs" />
     <Compile Include="BindingsBase.cs" />
     <Compile Include="BlittableValueType.cs" />
     <Compile Include="Configuration.cs" />
index 04a5a8a..fcb7108 100644 (file)
     <Compile Include="AutoGeneratedAttribute.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="CountAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="NativeWindow.cs">
       <SubType>Code</SubType>
     </Compile>
index 9054b11..7bd14b7 100644 (file)
@@ -47,6 +47,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AutoGeneratedAttribute.cs" />
+    <Compile Include="CountAttribute.cs" />
     <Compile Include="BindingsBase.cs" />
     <Compile Include="BlittableValueType.cs" />
     <Compile Include="Configuration.cs" />