mirror of https://github.com/mono/CppSharp.git
2 changed files with 106 additions and 51 deletions
@ -0,0 +1,99 @@ |
|||||||
|
using CppSharp.AST; |
||||||
|
using System.Collections.Generic; |
||||||
|
using CppSharp.AST.Extensions; |
||||||
|
|
||||||
|
namespace CppSharp.Generators.CSharp |
||||||
|
{ |
||||||
|
internal class CSharpStaticVariableWithInitializerGenerator : TextGenerator |
||||||
|
{ |
||||||
|
private readonly BindingContext context; |
||||||
|
private readonly Variable variable; |
||||||
|
private readonly CSharpTypePrinter typePrinter; |
||||||
|
|
||||||
|
public CSharpStaticVariableWithInitializerGenerator(BindingContext context, Variable variable, CSharpTypePrinter typePrinter) |
||||||
|
{ |
||||||
|
this.context = context; |
||||||
|
this.variable = variable; |
||||||
|
this.typePrinter = typePrinter; |
||||||
|
} |
||||||
|
|
||||||
|
public static bool CanGenerate(Variable variable) |
||||||
|
{ |
||||||
|
if (variable.Initializer == null || string.IsNullOrWhiteSpace(variable.Initializer.String)) |
||||||
|
return false; |
||||||
|
|
||||||
|
var arrayType = variable.Type.Desugar() as ArrayType; |
||||||
|
var type = (arrayType?.Type ?? variable.Type).Desugar(); |
||||||
|
var isTypeSupported = |
||||||
|
type.IsPrimitiveType() || |
||||||
|
type.IsPointerToPrimitiveType(PrimitiveType.Char) || |
||||||
|
type.IsPointerToPrimitiveType(PrimitiveType.WideChar) || |
||||||
|
(type.TryGetClass(out Class c) && c.IsValueType); |
||||||
|
|
||||||
|
return isTypeSupported; |
||||||
|
} |
||||||
|
|
||||||
|
public string Generate() |
||||||
|
{ |
||||||
|
typePrinter.PushMarshalKind(MarshalKind.ReturnVariableArray); |
||||||
|
var variableType = variable.Type.Visit(typePrinter); |
||||||
|
typePrinter.PopMarshalKind(); |
||||||
|
|
||||||
|
Write($"public static {variableType} {variable.Name} {{ get; }} = "); |
||||||
|
|
||||||
|
if (variable.Type.Desugar() as ArrayType != null) |
||||||
|
GenerateArrayInitializerExpression(); |
||||||
|
else |
||||||
|
GenerateSimpleInitializerExpression(); |
||||||
|
|
||||||
|
WriteLine(";"); |
||||||
|
return ToString(); |
||||||
|
} |
||||||
|
|
||||||
|
private void GenerateSimpleInitializerExpression() |
||||||
|
{ |
||||||
|
var systemType = Internal.ExpressionHelper.GetSystemType(context, variable.Type.Desugar()); |
||||||
|
var initializerString = variable.Initializer.String; |
||||||
|
|
||||||
|
if (Internal.ExpressionHelper.TryParseExactLiteralExpression(ref initializerString, systemType)) |
||||||
|
{ |
||||||
|
Write(initializerString); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
Write($"unchecked(({variable.Type}){initializerString})"); |
||||||
|
} |
||||||
|
|
||||||
|
private void GenerateArrayInitializerExpression() |
||||||
|
{ |
||||||
|
var arrayType = variable.Type.Desugar() as ArrayType; |
||||||
|
var systemType = Internal.ExpressionHelper.GetSystemType(context, arrayType.Type.Desugar()); |
||||||
|
Write($"new {arrayType.Type}[{arrayType.Size}] {{"); |
||||||
|
|
||||||
|
List<string> elements = Internal.ExpressionHelper.SplitInitListExpr(variable.Initializer.String); |
||||||
|
|
||||||
|
while (elements.Count < arrayType.Size) |
||||||
|
elements.Add(systemType == typeof(string) ? "\"\"" : null); |
||||||
|
|
||||||
|
for (int i = 0; i < elements.Count; ++i) |
||||||
|
{ |
||||||
|
var e = elements[i]; |
||||||
|
|
||||||
|
if (e == null) |
||||||
|
Write("default"); |
||||||
|
else |
||||||
|
{ |
||||||
|
if (!Internal.ExpressionHelper.TryParseExactLiteralExpression(ref e, systemType)) |
||||||
|
Write($"unchecked(({arrayType.Type}){e})"); |
||||||
|
else |
||||||
|
Write(e); |
||||||
|
} |
||||||
|
|
||||||
|
if (i + 1 != elements.Count) |
||||||
|
Write(", "); |
||||||
|
} |
||||||
|
|
||||||
|
Write(" }"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue