示例#1
0
        private SyntaxNode CreateProxyClassSyntax(INamedTypeSymbol currentInterface, string className, IEnumerable <string> folders)
        {
            var targetNamespace = _project.DefaultNamespace;

            if (folders.Any())
            {
                targetNamespace = $"{targetNamespace}.{string.Join(".", folders.Select(x => $"{x.Substring(0, 1).ToUpper()}{x.Substring(1)}"))}";
            }

            var constructors = GenerateConstructors(currentInterface, className);
            var methods      = GenerateMethods(currentInterface);

            var classDeclaration = SyntaxFactory.ClassDeclaration(className)
                                   .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
                                   .AddBaseListTypes(
                SyntaxFactory.SimpleBaseType(SyntaxFactory.ParseTypeName($"Codeworx.Rest.Client.RestClient<{currentInterface.AssemblyQualifiedName()}>")),
                SyntaxFactory.SimpleBaseType(SyntaxFactory.ParseTypeName(currentInterface.AssemblyQualifiedName())))
                                   .AddMembers(constructors)
                                   .AddMembers(methods);

            var namespaceSyntax = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(targetNamespace))
                                  .AddMembers(classDeclaration)
                                  .NormalizeWhitespace();

            var result = SyntaxFactory.CompilationUnit()
                         .AddAttributeLists(
                SyntaxFactory.AttributeList()
                .WithTarget(SyntaxFactory.AttributeTargetSpecifier(SyntaxFactory.Identifier("assembly")))
                .AddAttributes(
                    SyntaxFactory.Attribute(SyntaxFactory.ParseName("Codeworx.Rest.RestProxy"))
                    .AddArgumentListArguments(
                        SyntaxFactory.AttributeArgument(
                            SyntaxFactory.TypeOfExpression(SyntaxFactory.ParseTypeName(currentInterface.AssemblyQualifiedName()))),
                        SyntaxFactory.AttributeArgument(
                            SyntaxFactory.TypeOfExpression(SyntaxFactory.ParseTypeName($"{targetNamespace}.{classDeclaration.Identifier.Text}"))))))
                         .WithLeadingTrivia(
                SyntaxFactory.SyntaxTrivia(SyntaxKind.SingleLineCommentTrivia, "// <auto-generated />"))
                         .AddMembers(namespaceSyntax);

            return(result.NormalizeWhitespace());
        }
示例#2
0
        private MemberDeclarationSyntax[] GenerateConstructors(INamedTypeSymbol currentInterface, string className)
        {
            var memberDeclarations = new List <MemberDeclarationSyntax>();

            var typedConstructor = SyntaxFactory.ConstructorDeclaration(className)
                                   .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
                                   .AddParameterListParameters(
                SyntaxFactory.Parameter(SyntaxFactory.Identifier("options")).WithType(SyntaxFactory.ParseTypeName($"Codeworx.Rest.Client.RestOptions<{currentInterface.AssemblyQualifiedName()}>")))
                                   .WithInitializer(
                SyntaxFactory.ConstructorInitializer(SyntaxKind.BaseConstructorInitializer)
                .AddArgumentListArguments(SyntaxFactory.Argument(SyntaxFactory.IdentifierName("options"))))
                                   .WithBody(SyntaxFactory.Block())
                                   .NormalizeWhitespace();

            memberDeclarations.Add(typedConstructor);

            var test = 1;

            // TODO add config switch.
            if (test > 2)
            {
                var untypedConstructor = SyntaxFactory.ConstructorDeclaration(className)
                                         .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
                                         .AddParameterListParameters(
                    SyntaxFactory.Parameter(SyntaxFactory.Identifier("options")).WithType(SyntaxFactory.ParseTypeName($"RestOptions")))
                                         .WithInitializer(
                    SyntaxFactory.ConstructorInitializer(SyntaxKind.BaseConstructorInitializer)
                    .AddArgumentListArguments(SyntaxFactory.Argument(SyntaxFactory.IdentifierName("options"))))
                                         .WithBody(SyntaxFactory.Block())
                                         .NormalizeWhitespace();
                memberDeclarations.Add(untypedConstructor);
            }

            return(memberDeclarations.ToArray());
        }