static async Task GenerateCodes() { BitSourceGeneratorBitConfigProvider bitConfigProvider = new BitSourceGeneratorBitConfigProvider(_bitConfigFilePath !, BeingCompiledProjectName); BitConfig bitConfig = bitConfigProvider.GetConfiguration(); using (MSBuildWorkspace workspace = MSBuildWorkspace.Create(new Dictionary <string, string> { { "TargetFramework", bitConfig.TargetFramework ?? "net5.0" } })) { workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true; workspace.WorkspaceFailed += MSBuildWorkspace_WorkspaceFailed; foreach (BitCodeGeneratorMapping mapping in bitConfigProvider.GetConfiguration().BitCodeGeneratorConfigs.BitCodeGeneratorMappings) { foreach (Bit.Tooling.Core.Model.ProjectInfo proj in mapping.SourceProjects) { if (workspace.CurrentSolution.Projects.Any(p => proj.IsThisProject(p))) { continue; /*It's already loaded*/ } string sourceProjetctPath = proj.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {proj.Name}")).ExtendedSingle($"Trying to find source project {proj.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == proj.Name); await workspace.OpenProjectAsync(sourceProjetctPath); } if (!workspace.CurrentSolution.Projects.Any(p => mapping.DestinationProject.IsThisProject(p))) { string DestProjetctPath = mapping.DestinationProject.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {mapping.DestinationProject.Name}")).ExtendedSingle($"Trying to find destination project {mapping.DestinationProject.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == mapping.DestinationProject.Name); await workspace.OpenProjectAsync(DestProjetctPath); } } IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); IBitCodeGeneratorOrderedProjectsProvider bitCodeGeneratorOrderedProjectsProvider = new DefaultBitCodeGeneratorOrderedProjectsProvider(); IProjectEnumTypesProvider projectEnumTypesProvider = new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider); DefaultTypeScriptClientProxyGenerator tsGenerator = new DefaultTypeScriptClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider, bitConfigProvider, dtosProvider , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, projectEnumTypesProvider); await tsGenerator.GenerateCodes(workspace); DefaultCSharpClientProxyGenerator csGenerator = new DefaultCSharpClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider, bitConfigProvider, controllersProvider, new DefaultCSharpClientContextGenerator()); await csGenerator.GenerateCodes(workspace); } }
static async Task GenerateCodes(BitConfig bitConfig, BitSourceGeneratorBitConfigProvider bitConfigProvider) { using (MSBuildWorkspace workspace = MSBuildWorkspace.Create(new Dictionary <string, string> { { "TargetFramework", bitConfig.TargetFramework ?? "net6.0" } })) { workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true; workspace.WorkspaceFailed += MSBuildWorkspace_WorkspaceFailed; foreach (BitCodeGeneratorMapping mapping in bitConfig.BitCodeGeneratorConfigs.BitCodeGeneratorMappings) { foreach (Bit.Tooling.Core.Model.ProjectInfo proj in mapping.SourceProjects.Union(new[] { mapping.DestinationProject })) { if (workspace.CurrentSolution.Projects.Any(p => proj == p)) { continue; /*It's already loaded*/ } string sourceProjetctPath = proj.Name == BeingCompiledProjectName ? ProjectPath : (AllProjectsPaths ?? throw new InvalidOperationException($"There is no solution project and we're unable to find {proj.Name}")).ExtendedSingle($"Trying to find project {proj.Name}", projPath => Path.GetFileNameWithoutExtension(projPath) == proj.Name); await workspace.OpenProjectAsync(sourceProjetctPath).ConfigureAwait(false); } } IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider(); IProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(controllersProvider); IBitCodeGeneratorOrderedProjectsProvider bitCodeGeneratorOrderedProjectsProvider = new DefaultBitCodeGeneratorOrderedProjectsProvider(); IProjectEnumTypesProvider projectEnumTypesProvider = new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider); TypeScriptJayDataClientProxyGenerator typeScriptJayDataGeneratedCode = new TypeScriptJayDataClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider, bitConfigProvider, dtosProvider , new TypeScriptJayDataClientProxyDtoGenerator(), new TypeScriptJayDataClientContextGenerator(), controllersProvider, projectEnumTypesProvider); await typeScriptJayDataGeneratedCode.GenerateCodes(workspace).ConfigureAwait(false); CSharpSimpleODataClientProxyGenerator csharpSimpleODataClientGeneratedCode = new CSharpSimpleODataClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider, bitConfigProvider, controllersProvider, new CSharpSimpleODataClientContextGenerator(), new CSharpSimpleODataClientMetadataGenerator(), dtosProvider, projectEnumTypesProvider); await csharpSimpleODataClientGeneratedCode.GenerateCodes(workspace).ConfigureAwait(false); CSharpHttpClientProxyGenerator csharpHttpClientProxyGenerator = new CSharpHttpClientProxyGenerator(bitCodeGeneratorOrderedProjectsProvider, bitConfigProvider, controllersProvider, new CSharpHttpClientContextGenerator(), dtosProvider, projectEnumTypesProvider); await csharpHttpClientProxyGenerator.GenerateCodes(workspace).ConfigureAwait(false); } }
public virtual async Task DefaultEnumTypesProviderShouldReturnEnumTypes() { const string sourceCodes = @" public interface IDto { } public class DtoController<TDto> where TDto : IDto { } public class DtoWithEnum : IDto { public virtual int Id { get; set; } public virtual TestGender? Gender { get; set; } public virtual string Test { get; set; } } public enum TestGender { Man = 3, Woman = 12, Other } public enum TestGender2 { Man = 3, Woman = 12, Other } public class DtoWithEnumController : DtoController<DtoWithEnum> { public class GetDtoWithEnumsByGenderParameters { public virtual TestGender gender { get; set; } } [ActionAttribute] public virtual int GetDtoWithEnumsByGender(GetDtoWithEnumsByGenderParameters parameters) { return 1; } public class GetDtoWithEnumsByGender2Parameters { public virtual TestGender2 gender { get; set; } } [ActionAttribute] public virtual int GetDtoWithEnumsByGender2(GetDtoWithEnumsByGender2Parameters parameters) { return 1; } } "; IProjectDtoControllersProvider projectDtoControllersProvider = new DefaultProjectDtoControllersProvider(); IProjectEnumTypesProvider projectEnumTypesProvider = new DefaultProjectEnumTypesProvider(projectDtoControllersProvider, new DefaultProjectDtosProvider(projectDtoControllersProvider)); Project proj = CreateProjectFromSourceCodes(sourceCodes); IList <EnumType> result = await projectEnumTypesProvider.GetProjectEnumTypes(proj, new[] { proj }); Assert.IsTrue(result.Select(enumType => enumType.EnumTypeSymbol.Name).SequenceEqual(new[] { "TestGender", "TestGender2" })); Assert.IsTrue(result.First().Members.SequenceEqual(new[] { new EnumMember { Name = "Man", Value = 3, Index = 0 }, new EnumMember { Name = "Woman", Value = 12, Index = 1 }, new EnumMember { Name = "Other", Value = 13, Index = 2 } }, new EnumMemberEqualityComparer())); }
public virtual async Task NestedObjectsTest() { string sourceProjectCodes = @" public interface IDto { } public class DtoController<TDto> where TDto : IDto { } public class TestComplexController : DtoController<TestComplexDto> { [FunctionAttribute] public System.Threading.Tasks.Task<ComplexObj3[]> GetComplexObjects() { return null; } public class SomeActionArgs { public ComplexObj5 Test5 { get; set; } public string Test { get; set; } } [ActionAttribute] public void SomeAction(SomeActionArgs args) { } } public class TestComplexDto : IDto { public virtual int EntityId { get; set; } public virtual ComplexObj ComplexObj { get; set; } public virtual ComplexObj2 ComplexObj2 { get; set; } } [System.ComponentModel.DataAnnotations.Schema.ComplexType] public class ComplexObj { public virtual string Name { get; set; } } [System.ComponentModel.DataAnnotations.Schema.ComplexType] public class ComplexObj3 { public virtual string Name { get; set; } public virtual ComplexObj4 Obj4 { get; set; } } [System.ComponentModel.DataAnnotations.Schema.ComplexType] public class ComplexObj4 { public virtual string Name { get; set; } public virtual Test Test { get; set; } } [System.ComponentModel.DataAnnotations.Schema.ComplexType] public class ComplexObj5 { public virtual string Name { get; set; } public virtual Test2 Test2 { get; set; } } public enum Test { } public enum Test2 { } "; string otherProjectCodes = @" namespace System.ComponentModel.DataAnnotations.Schema { public class ComplexTypeAttribute : Attribute { } } [System.ComponentModel.DataAnnotations.Schema.ComplexType] public class ComplexObj2 { public virtual string Name { get; set; } public virtual Test Test { get; set; } } public enum Test3 { } "; Project otherProject = CreateProjectFromSourceCodes(otherProjectCodes); Project sourceProject = CreateProjectFromSourceCodesWithExistingSolution(otherProject.Solution, sourceProjectCodes); sourceProject = sourceProject.AddProjectReference(new ProjectReference(otherProject.Id)); DefaultProjectDtoControllersProvider dtoControllersProvider = new DefaultProjectDtoControllersProvider(); DefaultProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(dtoControllersProvider); DefaultProjectEnumTypesProvider enumTypesProvider = new DefaultProjectEnumTypesProvider(dtoControllersProvider, projectDtosProvider); Dto[] dtos = (await projectDtosProvider.GetProjectDtos(sourceProject)).ToArray(); EnumType[] enums = (await enumTypesProvider.GetProjectEnumTypes(sourceProject)).ToArray(); Assert.IsTrue(dtos.Select(d => d.DtoSymbol.Name).SequenceEqual(new[] { "ComplexObj5", "ComplexObj4", "ComplexObj3", "ComplexObj2", "ComplexObj", "TestComplexDto" })); Assert.IsTrue(enums.Select(d => d.EnumTypeSymbol.Name).SequenceEqual(new[] { "Test2", "Test" })); }