private static SyntaxToken LengthVariableName()

in SharpGen/Generator/Marshallers/StringMarshaller.cs [224:291]


        private static SyntaxToken LengthVariableName(CsMarshalBase marshallable) =>
            Identifier($"{marshallable.Name}_length");

        private StatementSyntax GenerateAnsiStringToArray(CsMarshalBase marshallable)
        {
            var lengthIdentifier = LengthVariableName(marshallable);

            return Block(
                    LocalDeclarationStatement(
                        VariableDeclaration(
                            TypeInt32,
                            SingletonSeparatedList(
                                VariableDeclarator(lengthIdentifier)
                                .WithInitializer(EqualsValueClause(
                                    InvocationExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                        GlobalNamespace.GetTypeNameSyntax(BuiltinType.Math),
                                        IdentifierName(nameof(Math.Min))),
                                        ArgumentList(
                                            SeparatedList(
                                                new[]
                                                {
                                                    Argument(
                                                        GeneratorHelpers.OptionalLengthExpression(IdentifierName(marshallable.Name))
                                                    ),
                                                    Argument(
                                                        LiteralExpression(SyntaxKind.NumericLiteralExpression,
                                                        Literal(marshallable.ArrayDimensionValue - 1))
                                                    )
                                                }
                                            )
                                    ))))))),
                    LocalDeclarationStatement(
                        VariableDeclaration(
                            IntPtrType,
                            SingletonSeparatedList(
                                VariableDeclarator(Identifier(FromIdentifier))
                                    .WithInitializer(EqualsValueClause(
                                        InvocationExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                            GlobalNamespace.GetTypeNameSyntax(BuiltinType.Marshal),
                                            IdentifierName(nameof(Marshal.StringToHGlobalAnsi))))
                                        .WithArgumentList(
                                            ArgumentList(SingletonSeparatedList(Argument(IdentifierName(marshallable.Name)))))))))),
                    FixedStatement(
                        VariableDeclaration(
                            PointerType(PredefinedType(Token(SyntaxKind.ByteKeyword))),
                            SingletonSeparatedList(
                                VariableDeclarator(ToIdentifier)
                                        .WithInitializer(EqualsValueClause(
                                            PrefixUnaryExpression(SyntaxKind.AddressOfExpression,
                                            GetMarshalStorageLocation(marshallable)))))
                            ),
                        Block(
                            GenerateCopyMemoryInvocation(IdentifierName(lengthIdentifier), castFrom: false),
                            ExpressionStatement(
                                AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
                                    ElementAccessExpression(IdentifierName(ToIdentifier),
                                        BracketedArgumentList(
                                            SingletonSeparatedList(
                                                Argument(IdentifierName(lengthIdentifier))))),
                                    ZeroLiteral)))),
                    ExpressionStatement(InvocationExpression(
                        MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                            GlobalNamespace.GetTypeNameSyntax(BuiltinType.Marshal),
                            IdentifierName(nameof(Marshal.FreeHGlobal))),
                                ArgumentList(SingletonSeparatedList(
                                    Argument(IdentifierName(FromIdentifier))))))
                );
        }