Files
sbox-public/engine/Tools/InteropGen/Arguments/ArgFlagsWrapper.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

236 lines
3.8 KiB
C#

using System.Linq;
namespace Facepunch.InteropGen;
public class ArgFlagsWrapper : ArgWrapper
{
public ArgFlagsWrapper( Arg val )
{
Base = val;
Name = val.Name;
Flags = val.Flags;
}
public override string NativeType
{
get
{
string t = Base.NativeType;
if ( HasFlag( "out" ) || HasFlag( "ref" ) || HasFlag( "asref" ) )
{
t += "*";
}
// if ( HasFlag( "ref" ) )
// t += "***";
// $"{base.NativeType}*";
return t;
}
}
public override string NativeDelegateType
{
get
{
string t = Base.NativeDelegateType;
if ( HasFlag( "out" ) || HasFlag( "ref" ) || HasFlag( "asref" ) )
{
t += "*";
}
return t;
}
}
public override string GetNativeDelegateType( bool incoming )
{
string t = Base.GetNativeDelegateType( incoming );
if ( HasFlag( "out" ) || HasFlag( "ref" ) || HasFlag( "asref" ) )
{
t += "*";
}
return t;
}
public override string ManagedType
{
get
{
string t = Base.ManagedType;
if ( HasFlag( "out" ) )
{
t = "out " + t;
}
if ( HasFlag( "ref" ) )
{
t = "ref " + t;
}
//$"{base.NativeType}*"; ref
return t;
}
}
public override string ManagedDelegateType
{
get
{
string t = Base.ManagedDelegateType;
if ( HasFlag( "out" ) )
{
t = "out " + t;
}
if ( HasFlag( "ref" ) )
{
t = "ref " + t;
}
if ( HasFlag( "asref" ) )
{
t = "IntPtr";
}
return t;
}
}
public override string GetManagedDelegateType( bool incoming )
{
string t = Base.GetManagedDelegateType( incoming );
if ( HasFlag( "out" ) )
{
t = "out " + t;
}
if ( HasFlag( "ref" ) )
{
t = "ref " + t;
}
if ( HasFlag( "mptr" ) || HasFlag( "asref" ) )
{
t = "IntPtr";
}
return t;
}
public override string FromInterop( bool native, string code = null )
{
if ( Flags == null )
{
return Base.FromInterop( native, code );
}
string name = code ?? Name;
if ( !native )
{
if ( HasFlag( "asref" ) )
{
return $"ref Unsafe.AsRef<{Base.ManagedType}>( (void*) {name} )";
}
}
if ( native )
{
if ( HasFlag( "cref" ) )
{
return $"*{name}";
}
string cast = Flags.FirstOrDefault( x => x.StartsWith( "CastTo[" ) && x.EndsWith( "]" ) );
if ( cast != null )
{
cast = cast.Substring( 7, cast.Length - 7 - 1 );
return $"/*CastTo*/ ({cast}) {name}";
}
}
return HasFlag( "ref" ) ? $"{name}" : Base.FromInterop( native, code );
}
public override string ToInterop( bool native, string code = null )
{
if ( Flags == null )
{
return Base.ToInterop( native, code );
}
string name = code ?? Name;
if ( !native && HasFlag( "out" ) && Base is ArgString )
{
return $"out _outptr_{name}";
}
if ( !native && HasFlag( "out" ) )
{
return $"out {name}";
}
if ( !native && HasFlag( "ref" ) )
{
return $"ref {name}";
}
if ( native && HasFlag( "cref" ) )
{
return $"&{name}";
}
//
// Returning a class, we want to cast it from one thing to this type
//
if ( native && HasFlag( "cast" ) )
{
return $"({NativeType}) {name}";
}
// code ??= Name;
return native && HasFlag( "boxed" ) ? $"{code}.GetRaw()" : Base.ToInterop( native, code );
}
public override string ReturnWrapCall( string functionCall, bool native )
{
if ( native )
{
string cast = Flags?.FirstOrDefault( x => x.StartsWith( "CastTo[" ) && x.EndsWith( "]" ) ) ?? null;
if ( cast != null )
{
cast = cast.Substring( 7, cast.Length - 7 - 1 );
functionCall = $"/*CastTo*/ {cast} {functionCall}";
}
}
return Base.ReturnWrapCall( functionCall, native );
}
public override string WrapFunctionCall( string functionCall, bool native )
{
return Base.WrapFunctionCall( functionCall, native );
}
public override string DefaultValue => Base.DefaultValue;
}