-
Notifications
You must be signed in to change notification settings - Fork 27
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1067 from gircore/improve-long-handling-2
Improve long handling 2
- Loading branch information
Showing
34 changed files
with
782 additions
and
147 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
44 changes: 44 additions & 0 deletions
44
src/Generation/Generator/Renderer/Internal/Parameter/Converter/Long.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
using System; | ||
|
||
namespace Generator.Renderer.Internal.Parameter; | ||
|
||
internal class Long : ParameterConverter | ||
{ | ||
public bool Supports(GirModel.AnyType anyType) | ||
{ | ||
return anyType.Is<GirModel.Long>(); | ||
} | ||
|
||
public RenderableParameter Convert(GirModel.Parameter parameter) | ||
{ | ||
// If the parameter is both nullable and optional this implies a parameter type like 'int **' and possibly | ||
// ownership transfer (this combination does not currently occur for any functions). | ||
if (parameter is { Nullable: true, Optional: true }) | ||
throw new System.NotImplementedException($"{parameter.AnyTypeOrVarArgs} - Long value type with nullable=true and optional=true not yet supported"); | ||
|
||
// Nullable-only parameters likely have incorrect annotations and should be marked optional instead. | ||
if (parameter.Nullable) | ||
Log.Information($"Long value type '{parameter.Name}' with nullable=true is likely an incorrect annotation"); | ||
|
||
// The caller-allocates flag is not meaningful for primitive types (https://gitlab.gnome.org/GNOME/gobject-introspection/-/issues/446) | ||
if (parameter.CallerAllocates) | ||
Log.Information($"Long value type '{parameter.Name}' with caller-allocates=true is an incorrect annotation"); | ||
|
||
return new RenderableParameter( | ||
Attribute: string.Empty, | ||
Direction: GetDirection(parameter), | ||
NullableTypeName: "CLong", | ||
Name: Model.Parameter.GetName(parameter) | ||
); | ||
} | ||
|
||
private static string GetDirection(GirModel.Parameter parameter) => parameter switch | ||
{ | ||
// - Optional inout and out types are just exposed as non-nullable ref / out parameters which the user can ignore if desired. | ||
{ Direction: GirModel.Direction.In, IsPointer: true } => ParameterDirection.Ref(), | ||
{ Direction: GirModel.Direction.InOut } => ParameterDirection.Ref(), | ||
{ Direction: GirModel.Direction.Out } => ParameterDirection.Out(), | ||
{ Direction: GirModel.Direction.In } => ParameterDirection.In(), | ||
_ => throw new Exception($"Can't figure out direction for internal long value type parameter {parameter}.") | ||
}; | ||
} |
44 changes: 44 additions & 0 deletions
44
src/Generation/Generator/Renderer/Internal/Parameter/Converter/UnsignedLong.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
using System; | ||
|
||
namespace Generator.Renderer.Internal.Parameter; | ||
|
||
internal class UnsignedLong : ParameterConverter | ||
{ | ||
public bool Supports(GirModel.AnyType anyType) | ||
{ | ||
return anyType.Is<GirModel.UnsignedLong>(); | ||
} | ||
|
||
public RenderableParameter Convert(GirModel.Parameter parameter) | ||
{ | ||
// If the parameter is both nullable and optional this implies a parameter type like 'int **' and possibly | ||
// ownership transfer (this combination does not currently occur for any functions). | ||
if (parameter is { Nullable: true, Optional: true }) | ||
throw new System.NotImplementedException($"{parameter.AnyTypeOrVarArgs} - Unsigned long value type with nullable=true and optional=true not yet supported"); | ||
|
||
// Nullable-only parameters likely have incorrect annotations and should be marked optional instead. | ||
if (parameter.Nullable) | ||
Log.Information($"Unsigned long value type '{parameter.Name}' with nullable=true is likely an incorrect annotation"); | ||
|
||
// The caller-allocates flag is not meaningful for primitive types (https://gitlab.gnome.org/GNOME/gobject-introspection/-/issues/446) | ||
if (parameter.CallerAllocates) | ||
Log.Information($"Unsigned long value type '{parameter.Name}' with caller-allocates=true is an incorrect annotation"); | ||
|
||
return new RenderableParameter( | ||
Attribute: string.Empty, | ||
Direction: GetDirection(parameter), | ||
NullableTypeName: "CULong", | ||
Name: Model.Parameter.GetName(parameter) | ||
); | ||
} | ||
|
||
private static string GetDirection(GirModel.Parameter parameter) => parameter switch | ||
{ | ||
// - Optional inout and out types are just exposed as non-nullable ref / out parameters which the user can ignore if desired. | ||
{ Direction: GirModel.Direction.In, IsPointer: true } => ParameterDirection.Ref(), | ||
{ Direction: GirModel.Direction.InOut } => ParameterDirection.Ref(), | ||
{ Direction: GirModel.Direction.Out } => ParameterDirection.Out(), | ||
{ Direction: GirModel.Direction.In } => ParameterDirection.In(), | ||
_ => throw new Exception($"Can't figure out direction for internal unsigned long value type parameter {parameter}.") | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
30 changes: 30 additions & 0 deletions
30
src/Generation/Generator/Renderer/Internal/ParameterToManagedExpression/Converter/Long.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
|
||
namespace Generator.Renderer.Internal.ParameterToManagedExpressions; | ||
|
||
internal class Long : ToManagedParameterConverter | ||
{ | ||
public bool Supports(GirModel.AnyType type) | ||
=> type.Is<GirModel.Long>(); | ||
|
||
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters) | ||
{ | ||
switch (parameterData.Parameter) | ||
{ | ||
case { Direction: GirModel.Direction.In, IsPointer: false }: | ||
Direct(parameterData); | ||
break; | ||
default: | ||
throw new NotImplementedException($"This kind of internal long value type (pointed: {parameterData.Parameter.IsPointer}, direction: {parameterData.Parameter.Direction} can't be converted to managed currently."); | ||
} | ||
} | ||
|
||
private static void Direct(ParameterToManagedData parameterData) | ||
{ | ||
var variableName = Model.Parameter.GetName(parameterData.Parameter); | ||
|
||
parameterData.SetSignatureName(() => variableName); | ||
parameterData.SetCallName(() => $"{variableName}.Value"); | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
...ration/Generator/Renderer/Internal/ParameterToManagedExpression/Converter/UnsignedLong.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
|
||
namespace Generator.Renderer.Internal.ParameterToManagedExpressions; | ||
|
||
internal class UnsignedLong : ToManagedParameterConverter | ||
{ | ||
public bool Supports(GirModel.AnyType type) | ||
=> type.Is<GirModel.UnsignedLong>(); | ||
|
||
public void Initialize(ParameterToManagedData parameterData, IEnumerable<ParameterToManagedData> parameters) | ||
{ | ||
switch (parameterData.Parameter) | ||
{ | ||
case { Direction: GirModel.Direction.In, IsPointer: false }: | ||
Direct(parameterData); | ||
break; | ||
default: | ||
throw new NotImplementedException($"This kind of internal unsigned long value type (pointed: {parameterData.Parameter.IsPointer}, direction: {parameterData.Parameter.Direction} can't be converted to managed currently."); | ||
} | ||
} | ||
|
||
private static void Direct(ParameterToManagedData parameterData) | ||
{ | ||
var variableName = Model.Parameter.GetName(parameterData.Parameter); | ||
|
||
parameterData.SetSignatureName(() => variableName); | ||
parameterData.SetCallName(() => $"{variableName}.Value"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
18 changes: 18 additions & 0 deletions
18
src/Generation/Generator/Renderer/Internal/ReturnType/Converter/Long.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
namespace Generator.Renderer.Internal.ReturnType; | ||
|
||
internal class Long : ReturnTypeConverter | ||
{ | ||
public bool Supports(GirModel.ReturnType returnType) | ||
{ | ||
return returnType.AnyType.Is<GirModel.Long>(); | ||
} | ||
|
||
public RenderableReturnType Convert(GirModel.ReturnType returnType) | ||
{ | ||
var nullableTypeName = returnType.IsPointer | ||
? Model.Type.Pointer | ||
: "CLong"; | ||
|
||
return new RenderableReturnType(nullableTypeName); | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
src/Generation/Generator/Renderer/Internal/ReturnType/Converter/UnsignedLong.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
namespace Generator.Renderer.Internal.ReturnType; | ||
|
||
internal class UnsignedLong : ReturnTypeConverter | ||
{ | ||
public bool Supports(GirModel.ReturnType returnType) | ||
{ | ||
return returnType.AnyType.Is<GirModel.UnsignedLong>(); | ||
} | ||
|
||
public RenderableReturnType Convert(GirModel.ReturnType returnType) | ||
{ | ||
var nullableTypeName = returnType.IsPointer | ||
? Model.Type.Pointer | ||
: "CULong"; | ||
|
||
return new RenderableReturnType(nullableTypeName); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10 changes: 10 additions & 0 deletions
10
src/Generation/Generator/Renderer/Internal/ReturnTypeToNativeExpression/Converter/Long.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
namespace Generator.Renderer.Internal.ReturnTypeToNativeExpressions; | ||
|
||
internal class Long : ReturnTypeConverter | ||
{ | ||
public bool Supports(GirModel.AnyType type) | ||
=> type.Is<GirModel.Long>(); | ||
|
||
public string GetString(GirModel.ReturnType returnType, string fromVariableName) | ||
=> $"new CLong(checked((nint){fromVariableName}))"; | ||
} |
10 changes: 10 additions & 0 deletions
10
...ration/Generator/Renderer/Internal/ReturnTypeToNativeExpression/Converter/UnsignedLong.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
namespace Generator.Renderer.Internal.ReturnTypeToNativeExpressions; | ||
|
||
internal class UnsigendLong : ReturnTypeConverter | ||
{ | ||
public bool Supports(GirModel.AnyType type) | ||
=> type.Is<GirModel.UnsignedLong>(); | ||
|
||
public string GetString(GirModel.ReturnType returnType, string fromVariableName) | ||
=> $"new CULong(checked((nuint){fromVariableName}))"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
src/Generation/Generator/Renderer/Public/ParameterToNativeExpression/Converter/Long.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
|
||
namespace Generator.Renderer.Public.ParameterToNativeExpressions; | ||
|
||
internal class Long : ToNativeParameterConverter | ||
{ | ||
public bool Supports(GirModel.AnyType type) | ||
=> type.Is<GirModel.Long>(); | ||
|
||
public void Initialize(ParameterToNativeData parameter, IEnumerable<ParameterToNativeData> _) | ||
{ | ||
//Array length parameters are handled as part of the corresponding array converters | ||
if (parameter.IsArrayLengthParameter) | ||
return; | ||
|
||
switch (parameter.Parameter) | ||
{ | ||
case { IsPointer: false, Direction: GirModel.Direction.In }: | ||
Direct(parameter); | ||
break; | ||
default: | ||
throw new NotImplementedException($"{parameter.Parameter.AnyTypeOrVarArgs}: This long value type can not yet be converted to native"); | ||
} | ||
} | ||
|
||
private static void Direct(ParameterToNativeData parameter) | ||
{ | ||
var parameterName = Model.Parameter.GetName(parameter.Parameter); | ||
parameter.SetSignatureName(() => parameterName); | ||
parameter.SetCallName(() => $"new CLong(checked((nint) {parameterName}))"); | ||
} | ||
} |
33 changes: 33 additions & 0 deletions
33
...eneration/Generator/Renderer/Public/ParameterToNativeExpression/Converter/UnsignedLong.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
|
||
namespace Generator.Renderer.Public.ParameterToNativeExpressions; | ||
|
||
internal class UnsignedLong : ToNativeParameterConverter | ||
{ | ||
public bool Supports(GirModel.AnyType type) | ||
=> type.Is<GirModel.UnsignedLong>(); | ||
|
||
public void Initialize(ParameterToNativeData parameter, IEnumerable<ParameterToNativeData> _) | ||
{ | ||
//Array length parameters are handled as part of the corresponding array converters | ||
if (parameter.IsArrayLengthParameter) | ||
return; | ||
|
||
switch (parameter.Parameter) | ||
{ | ||
case { IsPointer: false, Direction: GirModel.Direction.In }: | ||
Direct(parameter); | ||
break; | ||
default: | ||
throw new NotImplementedException($"{parameter.Parameter.AnyTypeOrVarArgs}: This unsigned long value type can not yet be converted to native"); | ||
} | ||
} | ||
|
||
private static void Direct(ParameterToNativeData parameter) | ||
{ | ||
var parameterName = Model.Parameter.GetName(parameter.Parameter); | ||
parameter.SetSignatureName(() => parameterName); | ||
parameter.SetCallName(() => $"new CULong(checked((nuint) {parameterName}))"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
src/Generation/Generator/Renderer/Public/ReturnTypeToManagedExpression/Converter/Long.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
using GirModel; | ||
|
||
namespace Generator.Renderer.Public.ReturnTypeToManagedExpressions; | ||
|
||
internal class Long : ReturnTypeConverter | ||
{ | ||
public bool Supports(AnyType type) | ||
=> type.Is<GirModel.Long>(); | ||
|
||
public string GetString(GirModel.ReturnType returnType, string fromVariableName) | ||
=> returnType.IsPointer | ||
? fromVariableName | ||
: $"{fromVariableName}.Value"; | ||
} |
14 changes: 14 additions & 0 deletions
14
...eration/Generator/Renderer/Public/ReturnTypeToManagedExpression/Converter/UnsignedLong.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
using GirModel; | ||
|
||
namespace Generator.Renderer.Public.ReturnTypeToManagedExpressions; | ||
|
||
internal class UnsignedLong : ReturnTypeConverter | ||
{ | ||
public bool Supports(AnyType type) | ||
=> type.Is<GirModel.UnsignedLong>(); | ||
|
||
public string GetString(GirModel.ReturnType returnType, string fromVariableName) | ||
=> returnType.IsPointer | ||
? fromVariableName | ||
: $"{fromVariableName}.Value"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.