Beispiel #1
0
        public static IEnumerable <MemberDeclarationSyntax> Transpile(this Syntax.FileSyntax fileNode, bool apiOnly = false)
        {
            _ = fileNode ?? throw new ArgumentNullException(nameof(fileNode));

            foreach (var declaration in fileNode.DeclarationList.Transpile())
            {
                yield return(declaration);
            }

            foreach (var function in fileNode.FunctionList)
            {
                if (apiOnly)
                {
                    // Transform function into native function to remove function body.
                    yield return(function.AsNativeFunction().Transpile());
                }
                else
                {
                    yield return(function.Transpile());
                }
            }

            foreach (var enumDeclaration in TranspileToEnumHandler.GetEnums())
            {
                yield return(enumDeclaration);
            }

            TranspileToEnumHandler.Reset();
        }
        public static IEnumerable <MemberDeclarationSyntax> Transpile(this Syntax.TypeDefinitionSyntax typeDefinitionNode)
        {
            _ = typeDefinitionNode ?? throw new ArgumentNullException(nameof(typeDefinitionNode));

            var identifier = SyntaxFactory.Identifier(
                SyntaxTriviaList.Empty,
                SyntaxKind.IdentifierToken,
                typeDefinitionNode.NewTypeNameNode.TranspileIdentifier(),
                typeDefinitionNode.NewTypeNameNode.ValueText,
                SyntaxTriviaList.Empty); // todo: comment?

            if (TranspileToEnumHandler.IsTypeEnum(typeDefinitionNode.NewTypeNameNode.ValueText, out _))
            {
                var enumDeclr = SyntaxFactory.EnumDeclaration(
                    new SyntaxList <AttributeListSyntax>(SyntaxFactory.AttributeList()),
                    new SyntaxTokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword)),
                    identifier,
                    null,
                    default);

                TranspileToEnumHandler.AddEnum(enumDeclr);
                yield break;
            }

            var declr = SyntaxFactory.ClassDeclaration(
                default(SyntaxList <AttributeListSyntax>),
                new SyntaxTokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword)),
                identifier,
                null,
                null,
                default(SyntaxList <TypeParameterConstraintClauseSyntax>),
                default(SyntaxList <MemberDeclarationSyntax>))
                        .AddMembers(SyntaxFactory.ConstructorDeclaration(
        public static MemberDeclarationSyntax Transpile(this Syntax.GlobalConstantDeclarationSyntax globalConstantDeclarationNode)
        {
            _ = globalConstantDeclarationNode ?? throw new ArgumentNullException(nameof(globalConstantDeclarationNode));

            var identifier = SyntaxFactory.Identifier(
                SyntaxTriviaList.Empty,
                SyntaxKind.IdentifierToken,
                globalConstantDeclarationNode.IdentifierNameNode.TranspileIdentifier(),
                globalConstantDeclarationNode.IdentifierNameNode.ValueText,
                SyntaxTriviaList.Empty);

            var globalConstantDeclaration = SyntaxFactory.FieldDeclaration(
                SyntaxFactory.VariableDeclaration(globalConstantDeclarationNode.TypeNameNode.Transpile())
                .AddVariables(
                    SyntaxFactory.VariableDeclarator(
                        identifier,
                        null,
                        globalConstantDeclarationNode.EqualsValueClause.Transpile(out var isConstantExpression))));

            var isAddedToEnum = false;
            var expr          = globalConstantDeclarationNode.EqualsValueClause.ValueNode.Expression;

            if (expr.FunctionCall != null)
            {
                var convertFunctionName = expr.FunctionCall.IdentifierNameNode.ValueText;
                if (TranspileToEnumHandler.IsFunctionEnumConverter(convertFunctionName, out var enumTypeName))
                {
                    var enumMember = SyntaxFactory.EnumMemberDeclaration(
                        new SyntaxList <AttributeListSyntax>(
                            SyntaxFactory.AttributeList(
                                default(SeparatedSyntaxList <AttributeSyntax>).Add(SyntaxFactory.Attribute(
                                                                                       SyntaxFactory.ParseName(nameof(EnumMemberConstantDeclarationAttribute)),
                                                                                       SyntaxFactory.ParseAttributeArgumentList($"(nameof({identifier.Text}))"))))),
                        identifier,
                        SyntaxFactory.EqualsValueClause(expr.FunctionCall.ArgumentListNode.FirstArgument.Transpile()));

                    TranspileToEnumHandler.AddEnumMember(enumMember, convertFunctionName);
                    isAddedToEnum = true;
                }
            }

            return(isConstantExpression
                ? globalConstantDeclaration.WithModifiers(
                       new SyntaxTokenList(
                           SyntaxFactory.Token(SyntaxKind.PublicKeyword),
                           SyntaxFactory.Token(SyntaxKind.ConstKeyword)))
                : globalConstantDeclaration.WithModifiers(
                       new SyntaxTokenList(
                           SyntaxFactory.Token(isAddedToEnum
                            ? TranspileToEnumHandler.EnumMemberDeclarationAccessModifier
                            : SyntaxKind.PublicKeyword),
                           SyntaxFactory.Token(SyntaxKind.StaticKeyword),
                           SyntaxFactory.Token(SyntaxKind.ReadOnlyKeyword))));
        }
        public static MemberDeclarationSyntax Transpile(this Syntax.NativeFunctionDeclarationSyntax nativeFunctionDeclarationNode)
        {
            _ = nativeFunctionDeclarationNode ?? throw new ArgumentNullException(nameof(nativeFunctionDeclarationNode));

            return(nativeFunctionDeclarationNode.FunctionDeclarationNode.Transpile()
                   .WithModifiers(
                       new SyntaxTokenList(
                           SyntaxFactory.Token(TranspileToEnumHandler.IsFunctionEnumConverter(nativeFunctionDeclarationNode.FunctionDeclarationNode.IdentifierNode.ValueText, out _)
                            ? TranspileToEnumHandler.EnumCastFunctionAccessModifier
                            : SyntaxKind.PublicKeyword),
                           SyntaxFactory.Token(SyntaxKind.StaticKeyword),
                           SyntaxFactory.Token(SyntaxKind.ExternKeyword)))
                   .WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)));
        }
Beispiel #5
0
        public static IEnumerable <MemberDeclarationSyntax> Transpile(this Syntax.FileSyntax fileNode)
        {
            _ = fileNode ?? throw new ArgumentNullException(nameof(fileNode));

            foreach (var declaration in fileNode.DeclarationList.Transpile())
            {
                yield return(declaration);
            }

            foreach (var function in fileNode.FunctionList)
            {
                yield return(function.Transpile());
            }

            foreach (var enumDeclaration in TranspileToEnumHandler.GetEnums())
            {
                yield return(enumDeclaration);
            }

            TranspileToEnumHandler.Reset();
        }