public virtual async Task GenerateCodes(Solution solution, IList <Project> projects)
        {
            if (solution == null)
            {
                throw new ArgumentNullException(nameof(solution));
            }

            if (projects == null)
            {
                throw new ArgumentNullException(nameof(projects));
            }

            foreach (BitCodeGeneratorMapping proxyGeneratorMapping in _bitCodeGeneratorMappingsProvider.GetBitCodeGeneratorMappings(solution, projects))
            {
                string generatedContextName = proxyGeneratorMapping.DestinationFileName;

                StringBuilder generatedJs = new StringBuilder();
                StringBuilder generatedTs = new StringBuilder();

                string generatedJsContextExtension = ".js";
                string generatedTsContextExtension = ".d.ts";

                Project destProject = solution.Projects
                                      .Last(p => p.Name == proxyGeneratorMapping.DestinationProject.Name);

                IList <Project> involveableProjects = _solutionProjectsSelector.GetInvolveableProjects(solution, solution.Projects.ToList(), proxyGeneratorMapping);

                List <Dto> dtos = new List <Dto>();

                foreach (Project p in involveableProjects)
                {
                    dtos.AddRange(await _dtosProvider.GetProjectDtos(p, involveableProjects));
                }

                List <EnumType> enumTypes = new List <EnumType>();

                foreach (Project p in involveableProjects)
                {
                    enumTypes.AddRange(await _projectEnumTypesProvider.GetProjectEnumTypes(p, involveableProjects));
                }

                List <DtoController> dtoControllers = new List <DtoController>();

                foreach (Project p in involveableProjects)
                {
                    dtoControllers.AddRange(await _dtoControllersProvider.GetProjectDtoControllersWithTheirOperations(p));
                }

                generatedJs.AppendLine(_dtoGenerator.GenerateJavaScriptDtos(dtos, enumTypes));
                generatedJs.AppendLine(_contextGenerator.GenerateJavaScriptContext(dtoControllers, proxyGeneratorMapping));
                generatedTs.AppendLine(_dtoGenerator.GenerateTypeScriptDtos(dtos, enumTypes, proxyGeneratorMapping.TypingsPath));
                generatedTs.AppendLine(_contextGenerator.GenerateTypeScriptContext(dtoControllers, proxyGeneratorMapping));

                WriteResults(solution, generatedJs.ToString(), generatedContextName, generatedJsContextExtension, destProject);

                WriteResults(solution, generatedTs.ToString(), generatedContextName, generatedTsContextExtension, destProject);
            }
        }
        public virtual async Task GenerateCodes(Workspace workspace, IList <string> projectNames)
        {
            if (workspace == null)
            {
                throw new ArgumentNullException(nameof(workspace));
            }

            if (projectNames == null)
            {
                throw new ArgumentNullException(nameof(projectNames));
            }

            foreach (BitCodeGeneratorMapping proxyGeneratorMapping in _bitCodeGeneratorMappingsProvider.GetBitCodeGeneratorMappings(workspace, projectNames))
            {
                string generatedContextName = proxyGeneratorMapping.DestinationFileName;

                StringBuilder generatedJs = new StringBuilder();
                StringBuilder generatedTs = new StringBuilder();

                string generatedJsContextExtension = ".js";
                string generatedTsContextExtension = ".d.ts";

                Project destProject = workspace.CurrentSolution.Projects.Where(p => p.Language == LanguageNames.CSharp)
                                      .ExtendedSingle($"Trying to find project with name: {proxyGeneratorMapping.DestinationProject.Name}", p => p.Name == proxyGeneratorMapping.DestinationProject.Name);

                IList <Project> involveableProjects = _solutionProjectsSelector.GetInvolveableProjects(workspace, workspace.CurrentSolution.Projects.Where(p => p.Language == LanguageNames.CSharp).ToList(), proxyGeneratorMapping);

                List <Dto> dtos = new List <Dto>();

                foreach (Project p in involveableProjects)
                {
                    dtos.AddRange(await _dtosProvider.GetProjectDtos(p, involveableProjects));
                }

                List <EnumType> enumTypes = new List <EnumType>();

                foreach (Project p in involveableProjects)
                {
                    enumTypes.AddRange(await _projectEnumTypesProvider.GetProjectEnumTypes(p, involveableProjects));
                }

                List <DtoController> dtoControllers = new List <DtoController>();

                foreach (Project p in involveableProjects)
                {
                    dtoControllers.AddRange(await _dtoControllersProvider.GetProjectDtoControllersWithTheirOperations(p));
                }

                generatedJs.AppendLine(_dtoGenerator.GenerateJavaScriptDtos(dtos, enumTypes));
                generatedJs.AppendLine(_contextGenerator.GenerateJavaScriptContext(dtoControllers, proxyGeneratorMapping));
                generatedTs.AppendLine(_dtoGenerator.GenerateTypeScriptDtos(dtos, enumTypes, proxyGeneratorMapping.TypingsPath));
                generatedTs.AppendLine(_contextGenerator.GenerateTypeScriptContext(dtoControllers, proxyGeneratorMapping));

                WriteFiles(workspace.CurrentSolution, generatedJs.ToString(), generatedContextName, generatedJsContextExtension, destProject);

                WriteFiles(workspace.CurrentSolution, generatedTs.ToString(), generatedContextName, generatedTsContextExtension, destProject);
            }
        }
        public async Task <IList <EnumType> > GetProjectEnumTypes(Project project, IList <Project>?allSourceProjects = null)
        {
            if (project == null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            if (allSourceProjects == null)
            {
                allSourceProjects = new List <Project> {
                    project
                }
            }
            ;

            IList <EnumType> enumTypes = new List <EnumType>();

            List <DtoController> dtoControllers = (await _projectDtoControllersProvider
                                                   .GetProjectDtoControllersWithTheirOperations(project)).ToList();

            IList <Dto> dtos = await _dtosProvider.GetProjectDtos(project, allSourceProjects);

            List <Compilation> sourceProjectsCompilations = new List <Compilation> {
            };

            foreach (var p in allSourceProjects)
            {
                sourceProjectsCompilations.Add(await p.GetCompilationAsync());
            }

            dtos.SelectMany(d => d.Properties)
            .Where(p => p.Type.IsEnum())
            .Select(p => p.Type.GetUnderlyingTypeSymbol())
            .Union(dtoControllers.SelectMany(dtoController => dtoController.Operations.SelectMany(operation => operation.Parameters.Select(p => p.Type).Union(new[] { operation.ReturnType }))).Where(t => t.IsEnum()).Select(t => t.GetUnderlyingComplexType()))
            .Where(enumType => sourceProjectsCompilations.Any(c => c.Assembly.TypeNames.Any(tName => tName == enumType.Name)))
            .Distinct()
            .ToList()
            .ForEach(enumType =>
            {
                enumTypes.Add(new EnumType
                {
                    EnumTypeSymbol = enumType,
                    Members        = enumType.GetMembers().OfType <IFieldSymbol>().Select((m, i) => new EnumMember
                    {
                        Name   = m.Name,
                        Symbol = m,
                        Index  = i,
                        Value  = Convert.ToInt32(m.ConstantValue, CultureInfo.InvariantCulture)
                    }).ToList()
                });
            });

            return(enumTypes);
        }
    }
示例#4
0
        public virtual async Task GenerateCodes(Workspace workspace)
        {
            if (workspace == null)
            {
                throw new ArgumentNullException(nameof(workspace));
            }

            BitConfig bitConfig = _bitConfigProvider.GetConfiguration();

            foreach (BitCodeGeneratorMapping proxyGeneratorMapping in bitConfig.BitCodeGeneratorConfigs.BitCodeGeneratorMappings.Where(m => m.GenerationType == GenerationType.CSharp))
            {
                string generatedContextName = proxyGeneratorMapping.DestinationFileName;

                StringBuilder generatedCs = new StringBuilder();

                string generatedCSContextExtension = ".cs";

                Project destProject = workspace.CurrentSolution.Projects.Where(p => p.Language == LanguageNames.CSharp)
                                      .ExtendedSingle($"Trying to find project with name: {proxyGeneratorMapping.DestinationProject.Name}", p => proxyGeneratorMapping.DestinationProject == p);

                IList <Project> involveableProjects = _bitCodeGeneratorOrderedProjectsProvider.GetInvolveableProjects(workspace, workspace.CurrentSolution.Projects.Where(p => p.Language == LanguageNames.CSharp).ToList(), proxyGeneratorMapping);

                List <DtoController> dtoControllers = new List <DtoController>();

                foreach (Project p in involveableProjects)
                {
                    dtoControllers.AddRange(await _dtoControllersProvider.GetProjectDtoControllersWithTheirOperations(p));
                }

                List <Dto> dtos = new List <Dto>();

                foreach (Project p in involveableProjects)
                {
                    dtos.AddRange(await _dtosProvider.GetProjectDtos(p, involveableProjects));
                }

                List <EnumType> enumTypes = new List <EnumType>();

                foreach (Project p in involveableProjects)
                {
                    enumTypes.AddRange(await _enumsProvider.GetProjectEnumTypes(p, involveableProjects));
                }

                generatedCs.AppendLine(_contextGenerator.GenerateCSharpContext(dtoControllers, proxyGeneratorMapping));

                generatedCs.AppendLine(_metadataGenerator.GenerateMetadata(dtos, enumTypes, dtoControllers, proxyGeneratorMapping));

                WriteFiles(generatedCs.ToString(), generatedContextName, generatedCSContextExtension, destProject);
            }
        }
        public async Task <IList <EnumType> > GetProjectEnumTypes(Project project, IList <Project>?allSourceProjects = null)
        {
            if (project == null)
            {
                throw new ArgumentNullException(nameof(project));
            }

            if (allSourceProjects == null)
            {
                allSourceProjects = new List <Project> {
                    project
                }
            }
            ;

            List <DtoController> dtoControllers = (await _projectDtoControllersProvider
                                                   .GetProjectDtoControllersWithTheirOperations(project).ConfigureAwait(false)).ToList();

            IList <Dto> dtos = await _dtosProvider.GetProjectDtos(project, allSourceProjects).ConfigureAwait(false);

            HashSet <EnumType> enums = new HashSet <EnumType>();

            foreach (var enumType in dtoControllers.SelectMany(dtoController => dtoController.Operations.SelectMany(operation => operation.Parameters.Select(p => p.Type).Union(new[] { operation.ReturnType })))
                     .Union(dtos.SelectMany(d => d.Properties.Select(p => p.Type)))
                     .Select(x => x.GetUnderlyingTypeSymbol())
                     .Select(x => x.IsCollectionType() || x.IsQueryableType() ? x.GetElementType() : x)
                     .Where(t => t.IsEnum()))
            {
                if (enums.Any(e => SymbolEqualityComparer.Default.Equals(e.EnumTypeSymbol, enumType)))
                {
                    continue;
                }

                enums.Add(new EnumType
                {
                    EnumTypeSymbol = enumType,
                    Members        = enumType.GetMembers().OfType <IFieldSymbol>().Select((m, i) => new EnumMember
                    {
                        Name   = m.Name,
                        Symbol = m,
                        Index  = i,
                        Value  = Convert.ToInt32(m.ConstantValue, CultureInfo.InvariantCulture)
                    }).ToList()
                });
            }

            return(enums
                   .ToList());
        }
    }