public static NamespaceDeclarationSyntax CreateTonModuleClass(string unitName, Module module)
        {
            var moduleName = $"{unitName}Module";

            StatementSyntax statementSyntax = ParseStatement("_tonClientAdapter = tonClientAdapter;");

            VariableDeclarationSyntax variableDeclaration = VariableDeclaration(ParseTypeName("ITonClientAdapter"))
                                                            .AddVariables(VariableDeclarator("_tonClientAdapter"));
            FieldDeclarationSyntax fieldDeclaration = FieldDeclaration(variableDeclaration)
                                                      .AddModifiers(Token(SyntaxKind.PrivateKeyword), Token(SyntaxKind.ReadOnlyKeyword));

            ConstructorDeclarationSyntax constructorDeclaration = ConstructorDeclaration(moduleName)
                                                                  .AddParameterListParameters(
                Parameter(Identifier("tonClientAdapter")).WithType(IdentifierName("ITonClientAdapter")))
                                                                  .WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword)))
                                                                  .WithBody(Block(statementSyntax));

            var methods = module
                          .Functions
                          .Select(f => GetMethodDeclaration(module, f, true))
                          .ToArray();

            ClassDeclarationSyntax item = ClassDeclaration(moduleName)
                                          .AddModifiers(Token(SyntaxKind.PublicKeyword))
                                          .AddBaseListTypes(SimpleBaseType(IdentifierName(NamingConventions.ToInterfaceName(moduleName))))
                                          .AddMembers(fieldDeclaration)
                                          .AddMembers(constructorDeclaration)
                                          .AddMembers(methods);

            return(NamespaceDeclaration(IdentifierName(ClientGenerator.NamespaceModules))
                   .AddMembers(item));
        }
Ejemplo n.º 2
0
        public static NamespaceDeclarationSyntax CreateTonClientClass(string unitName, TonApi tonApi)
        {
            var propertyDeclarationSyntaxes = GetProperties(tonApi);
            var moduleNames = tonApi.Modules.Select(m => m.Name).ToArray();

            VariableDeclarationSyntax variableDeclaration = VariableDeclaration(ParseTypeName("ServiceProvider"))
                                                            .AddVariables(VariableDeclarator("_serviceProvider"));
            FieldDeclarationSyntax fieldDeclaration = FieldDeclaration(variableDeclaration)
                                                      .AddModifiers(Token(SyntaxKind.PrivateKeyword), Token(SyntaxKind.ReadOnlyKeyword));

            var statementSyntax =
                new[]
            {
                ParseStatement("_serviceProvider = TonClientServiceProviderBuilder.BuildTonClientServiceProvider(serviceProvider);")
            }
            .Union(moduleNames
                   .Select(m => ParseStatement(
                               $"{NamingConventions.Normalize(m)} = _serviceProvider.GetRequiredService<{NamingConventions.ToInterfaceName(m)}Module>();")))
            .ToArray();

            MethodDeclarationSyntax disposeMethod = MethodDeclaration(ParseTypeName("void"), "Dispose")
                                                    .AddModifiers(Token(SyntaxKind.PublicKeyword))
                                                    .AddBodyStatements(ParseStatement("_serviceProvider?.Dispose();"));

            ConstructorDeclarationSyntax constructorDeclaration = ConstructorDeclaration(unitName)
                                                                  .AddParameterListParameters(Parameter(Identifier("serviceProvider = null")).WithType(IdentifierName("IServiceProvider")))
                                                                  .WithModifiers(TokenList(Token(SyntaxKind.PublicKeyword)))
                                                                  .WithBody(Block(statementSyntax));

            ClassDeclarationSyntax item = ClassDeclaration(unitName)
                                          .AddModifiers(Token(SyntaxKind.PublicKeyword))
                                          .AddBaseListTypes(SimpleBaseType(IdentifierName("ITonClient")), SimpleBaseType(IdentifierName("IDisposable")))
                                          .AddMembers(fieldDeclaration)
                                          .AddMembers(constructorDeclaration)
                                          .AddMembers(propertyDeclarationSyntaxes)
                                          .AddMembers(disposeMethod);

            return(NamespaceDeclaration(IdentifierName(ClientGenerator.Namespace))
                   .AddMembers(item));
        }