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()); }
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()); }