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.
This commit is contained in:
Fraser Waters 2017-07-17 10:39:21 +01:00
parent ac05b22b11
commit 34d7655274
7 changed files with 115 additions and 9 deletions

View file

@ -695,13 +695,45 @@ namespace Bind
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
List<string> attributes = new List<string>();
if (p.Flow == FlowDirection.Out) if (p.Flow == FlowDirection.Out)
{ {
sb.Append("[OutAttribute] "); attributes.Add("OutAttribute");
} }
else if (p.Flow == FlowDirection.Undefined) 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) if (p.Reference)

View file

@ -319,13 +319,6 @@ namespace Bind
} }
p.ComputeSize = param.GetAttribute("count", String.Empty).Trim(); 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()); p.Flow = Parameter.GetFlowDirection(param.GetAttribute("flow", String.Empty).Trim());
d.Parameters.Add(p); d.Parameters.Add(p);

View file

@ -256,6 +256,19 @@ namespace OpenTK.Rewrite
i--; 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--;
}
}
}
} }
} }

View file

@ -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()
{
}
}
}

View file

@ -56,6 +56,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AutoGeneratedAttribute.cs" /> <Compile Include="AutoGeneratedAttribute.cs" />
<Compile Include="CountAttribute.cs" />
<Compile Include="BindingsBase.cs" /> <Compile Include="BindingsBase.cs" />
<Compile Include="BlittableValueType.cs" /> <Compile Include="BlittableValueType.cs" />
<Compile Include="Configuration.cs" /> <Compile Include="Configuration.cs" />

View file

@ -167,6 +167,9 @@
<Compile Include="AutoGeneratedAttribute.cs"> <Compile Include="AutoGeneratedAttribute.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="CountAttribute.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="NativeWindow.cs"> <Compile Include="NativeWindow.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>

View file

@ -47,6 +47,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="AutoGeneratedAttribute.cs" /> <Compile Include="AutoGeneratedAttribute.cs" />
<Compile Include="CountAttribute.cs" />
<Compile Include="BindingsBase.cs" /> <Compile Include="BindingsBase.cs" />
<Compile Include="BlittableValueType.cs" /> <Compile Include="BlittableValueType.cs" />
<Compile Include="Configuration.cs" /> <Compile Include="Configuration.cs" />