+
Skip to content

Refactor parameter to managed expressions #855

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ public static string RenderNativeCallback(GirModel.Callback callback, GirModel.S
//TODO: try / catch is a helper as long as there are errors
try
{
var parameterData = ParameterToManagedExpression.Initialize(callback.Parameters);

nativeCallback = $@"
NativeCallback = ({callback.Parameters.Select(Model.Parameter.GetName).Join(", ")}) => {{
{RenderConvertParameterStatements(callback, out IEnumerable<string> parameters)}
{RenderCallStatement(callback, parameters, out var resultVariableName)}
NativeCallback = ({parameterData.Select(x => x.GetSignatureName()).Join(", ")}) => {{
{RenderConvertParameterStatements(parameterData)}
{RenderCallStatement(callback, parameterData, out var resultVariableName)}
{RenderFreeStatement(scope)}
{RenderReturnStatement(callback, resultVariableName)}
}};";
Expand All @@ -31,26 +33,48 @@ public static string RenderNativeCallback(GirModel.Callback callback, GirModel.S

}

private static string RenderConvertParameterStatements(GirModel.Callback callback, out IEnumerable<string> parameters)
private static string RenderConvertParameterStatements(IEnumerable<ParameterToManagedData> data)
{
var call = new StringBuilder();
var names = new List<string>();

foreach (GirModel.Parameter p in callback.Parameters.Where(x => x.Closure is null or 0))
foreach (var p in data)
{
call.AppendLine(p.ToManaged(out var variableName));
names.Add(variableName);
}
if (p.IsCallbackDestroyNotify)
continue;

parameters = names;
if (p.IsCallbackUserData)
continue;

if (p.IsArrayLengthParameter)
continue;

call.AppendLine(p.GetExpression());
}

return call.ToString();
}

private static string RenderCallStatement(GirModel.Callback callback, IEnumerable<string> parameterNames, out string resultVariableName)
private static string RenderCallStatement(GirModel.Callback callback, IEnumerable<ParameterToManagedData> parameterData, out string resultVariableName)
{
resultVariableName = "managedCallbackResult";
var call = $"managedCallback({parameterNames.Join(", ")});";


var parameters = new List<string>();
foreach (var p in parameterData)
{
if (p.IsArrayLengthParameter)
continue;

if (p.IsCallbackUserData)
continue;

if (p.IsCallbackDestroyNotify)
continue;

parameters.Add(p.GetCallName());
}

var call = $"managedCallback({parameters.Join(", ")});";

if (callback.ReturnType.AnyType.Is<GirModel.Void>())
return call;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

Expand All @@ -7,13 +8,13 @@ internal class Bitfield : ToManagedParameterConverter
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.Bitfield>();

public string? GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
if (parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: Bitfield with direction != in not yet supported");
if (parameterData.Parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: Bitfield with direction != in not yet supported");

//We don't need any conversion for bitfields
variableName = Model.Parameter.GetName(parameter);
return null;
var variableName = Model.Parameter.GetName(parameterData.Parameter);
parameterData.SetSignatureName(variableName);
parameterData.SetCallName(variableName);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

Expand All @@ -7,22 +8,30 @@ internal class Class : ToManagedParameterConverter
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.Class>();

public string? GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
if (!parameter.IsPointer)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: Unpointed class parameter not yet supported");
if (!parameterData.Parameter.IsPointer)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: Unpointed class parameter not yet supported");

var cls = (GirModel.Class) parameter.AnyTypeOrVarArgs.AsT0.AsT0;
var cls = (GirModel.Class) parameterData.Parameter.AnyTypeOrVarArgs.AsT0.AsT0;

if (cls.Fundamental)
{
variableName = Model.Parameter.GetConvertedName(parameter);
return $"var {variableName} = new {Model.ComplexType.GetFullyQualified(cls)}({Model.Parameter.GetName(parameter)});";
var paramterName = Model.Parameter.GetName(parameterData.Parameter);
var variableName = Model.Parameter.GetConvertedName(parameterData.Parameter);

parameterData.SetSignatureName(paramterName);
parameterData.SetExpression($"var {variableName} = new {Model.ComplexType.GetFullyQualified(cls)}({paramterName});");
parameterData.SetCallName(variableName);
}
else
{
variableName = Model.Parameter.GetConvertedName(parameter);
return $"var {variableName} = GObject.Internal.ObjectWrapper.WrapHandle<{Model.ComplexType.GetFullyQualified(cls)}>({Model.Parameter.GetName(parameter)}, {Model.Transfer.IsOwnedRef(parameter.Transfer).ToString().ToLower()});";
var parameterName = Model.Parameter.GetName(parameterData.Parameter);
var variableName = Model.Parameter.GetConvertedName(parameterData.Parameter);

parameterData.SetSignatureName(parameterName);
parameterData.SetExpression($"var {variableName} = GObject.Internal.ObjectWrapper.WrapHandle<{Model.ComplexType.GetFullyQualified(cls)}>({parameterName}, {Model.Transfer.IsOwnedRef(parameterData.Parameter.Transfer).ToString().ToLower()});");
parameterData.SetCallName(variableName);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

Expand All @@ -7,13 +8,13 @@ internal class Enumeration : ToManagedParameterConverter
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.Enumeration>();

public string? GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
if (parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: Enumeration with direction != in not yet supported");
if (parameterData.Parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: Enumeration with direction != in not yet supported");

//We don't need any conversion for enumerations
variableName = Model.Parameter.GetName(parameter);
return null;
var variableName = Model.Parameter.GetName(parameterData.Parameter);
parameterData.SetSignatureName(variableName);
parameterData.SetCallName(variableName);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

Expand All @@ -7,14 +8,18 @@ internal class Interface : ToManagedParameterConverter
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.Interface>();

public string? GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
if (!parameter.IsPointer)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: Unpointed interface parameter not yet supported");
if (!parameterData.Parameter.IsPointer)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: Unpointed interface parameter not yet supported");

var iface = (GirModel.Interface) parameter.AnyTypeOrVarArgs.AsT0.AsT0;
var iface = (GirModel.Interface) parameterData.Parameter.AnyTypeOrVarArgs.AsT0.AsT0;

variableName = Model.Parameter.GetConvertedName(parameter);
return $"var {variableName} = GObject.Internal.ObjectWrapper.WrapInterfaceHandle<{Model.Interface.GetFullyQualifiedImplementationName(iface)}>({Model.Parameter.GetName(parameter)}, {Model.Transfer.IsOwnedRef(parameter.Transfer).ToString().ToLower()});";
var signatureName = Model.Parameter.GetName(parameterData.Parameter);
var callName = Model.Parameter.GetConvertedName(parameterData.Parameter);

parameterData.SetSignatureName(signatureName);
parameterData.SetExpression($"var {callName} = GObject.Internal.ObjectWrapper.WrapInterfaceHandle<{Model.Interface.GetFullyQualifiedImplementationName(iface)}>({signatureName}, {Model.Transfer.IsOwnedRef(parameterData.Parameter.Transfer).ToString().ToLower()});");
parameterData.SetCallName(callName);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

Expand All @@ -7,13 +8,17 @@ internal class Pointer : ToManagedParameterConverter
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.Pointer>();

public string? GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
if (parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: Pointer with direction != in not yet supported");
if (parameterData.Parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: Pointer with direction != in not yet supported");

//We don't need any conversion for bitfields
variableName = Model.Parameter.GetName(parameter);
return null;
var variableName = Model.Parameter.GetName(parameterData.Parameter);

parameterData.SetSignatureName(variableName);
parameterData.SetCallName(variableName);

if (parameterData.Parameter.Closure is not null)
parameterData.IsCallbackUserData = true;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

Expand All @@ -7,16 +8,17 @@ internal class PrimitiveValueType : ToManagedParameterConverter
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.PrimitiveValueType>();

public string? GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
if (parameter.IsPointer)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: Pointed primitive value types can not yet be converted to managed");
if (parameterData.Parameter.IsPointer)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: Pointed primitive value types can not yet be converted to managed");

if (parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: Primitive value type with direction != in not yet supported");
if (parameterData.Parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: Primitive value type with direction != in not yet supported");

//We don't need any conversion for native parameters
variableName = Model.Parameter.GetName(parameter);
return null;
var variableName = Model.Parameter.GetName(parameterData.Parameter);

parameterData.SetSignatureName(variableName);
parameterData.SetCallName(variableName);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

Expand All @@ -7,23 +8,26 @@ internal class Record : ToManagedParameterConverter
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.Record>();

public string GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
if (parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameter.AnyTypeOrVarArgs}: record with direction != in not yet supported");
if (parameterData.Parameter.Direction != GirModel.Direction.In)
throw new NotImplementedException($"{parameterData.Parameter.AnyTypeOrVarArgs}: record with direction != in not yet supported");

if (!parameter.IsPointer)
throw new NotImplementedException($"Unpointed record parameter {parameter.Name} ({parameter.AnyTypeOrVarArgs}) can not yet be converted to managed");
if (!parameterData.Parameter.IsPointer)
throw new NotImplementedException($"Unpointed record parameter {parameterData.Parameter.Name} ({parameterData.Parameter.AnyTypeOrVarArgs}) can not yet be converted to managed");

var record = (GirModel.Record) parameter.AnyTypeOrVarArgs.AsT0.AsT0;
var ownedHandle = parameter.Transfer == GirModel.Transfer.Full;

variableName = Model.Parameter.GetConvertedName(parameter);
var record = (GirModel.Record) parameterData.Parameter.AnyTypeOrVarArgs.AsT0.AsT0;
var ownedHandle = parameterData.Parameter.Transfer == GirModel.Transfer.Full;
var variableName = Model.Parameter.GetConvertedName(parameterData.Parameter);

var handleClass = ownedHandle
? Model.Record.GetFullyQualifiedInternalOwnedHandle(record)
: Model.Record.GetFullyQualifiedInternalUnownedHandle(record);

return $"var {variableName} = new {Model.Record.GetFullyQualifiedPublicClassName(record)}(new {handleClass}({Model.Parameter.GetName(parameter)}));";
var signatureName = Model.Parameter.GetName(parameterData.Parameter);

parameterData.SetSignatureName(signatureName);
parameterData.SetExpression($"var {variableName} = new {Model.Record.GetFullyQualifiedPublicClassName(record)}(new {handleClass}({signatureName}));");
parameterData.SetCallName(variableName);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
namespace Generator.Renderer.Internal.ParameterToManagedExpressions;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

internal class RecordArray : ToManagedParameterConverter
{
public bool Supports(GirModel.AnyType type)
=> type.IsArray<GirModel.Record>();

public string GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
var arrayType = parameter.AnyTypeOrVarArgs.AsT0.AsT1;
var arrayType = parameterData.Parameter.AnyTypeOrVarArgs.AsT0.AsT1;
var record = (GirModel.Record) arrayType.AnyType.AsT0;
variableName = Model.Parameter.GetConvertedName(parameter);
var callName = Model.Parameter.GetConvertedName(parameterData.Parameter);
var signatureName = Model.Parameter.GetName(parameterData.Parameter);

parameterData.SetCallName(callName);
parameterData.SetSignatureName(signatureName);

if (arrayType.IsPointer)
{
return $"var {variableName} = {Model.Parameter.GetName(parameter)}.Select(x => new {Model.Record.GetFullyQualifiedPublicClassName(record)}(x)).ToArray();";
parameterData.SetExpression($"var {callName} = {signatureName}.Select(x => new {Model.Record.GetFullyQualifiedPublicClassName(record)}(x)).ToArray();");
}
else
{
return $"var {variableName} = ({Model.Record.GetFullyQualifiedPublicClassName(record)}[]){Model.Parameter.GetName(parameter)}.Select(x => new {Model.Record.GetFullyQualifiedPublicClassName(record)}({Model.Record.GetFullyQualifiedInternalManagedHandleCreateMethod(record)}(x))).ToArray();";
parameterData.SetExpression($"var {callName} = ({Model.Record.GetFullyQualifiedPublicClassName(record)}[]){signatureName}.Select(x => new {Model.Record.GetFullyQualifiedPublicClassName(record)}({Model.Record.GetFullyQualifiedInternalManagedHandleCreateMethod(record)}(x))).ToArray();");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
namespace Generator.Renderer.Internal.ParameterToManagedExpressions;
using System.Collections.Generic;

namespace Generator.Renderer.Internal.ParameterToManagedExpressions;

internal class String : ToManagedParameterConverter
{
public bool Supports(GirModel.AnyType type)
=> type.Is<GirModel.String>();

public string GetExpression(GirModel.Parameter parameter, out string variableName)
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters)
{
variableName = Model.Parameter.GetConvertedName(parameter);
return $"var {variableName} = {Model.Parameter.GetName(parameter)}.ConvertToString();";
var signatureName = Model.Parameter.GetName(parameterData.Parameter);
var callName = Model.Parameter.GetConvertedName(parameterData.Parameter);

parameterData.SetSignatureName(signatureName);
parameterData.SetExpression($"var {callName} = {signatureName}.ConvertToString();");
parameterData.SetCallName(callName);
}
}
Loading
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载