Exemple #1
0
        private void CallGenerateCodes()
        {
            Stopwatch sw = null;

            try
            {
                sw = Stopwatch.StartNew();

                IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider           dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);

                DefaultHtmlClientProxyGenerator generator = new DefaultHtmlClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(),
                                                                                                new DefaultBitCodeGeneratorMappingsProvider(new DefaultBitConfigProvider()), dtosProvider
                                                                                                , new DefaultHtmlClientProxyDtoGenerator(), new DefaultHtmlClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider));

                System.Threading.Tasks.Task.Run(async() => await generator.GenerateCodes(_visualStudioWorkspace, _shouldGeneratedProjectNames)).GetAwaiter().GetResult();

                Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms.");
            }
            catch (Exception ex)
            {
                LogException($"Code Generation failed.", ex);
            }
            finally
            {
                sw?.Stop();
            }
        }
        private async void CallGenerateCodes(Workspace workspace, string solutionFullName)
        {
            Stopwatch sw = null;

            try
            {
                sw = Stopwatch.StartNew();

                IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider           dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);

                DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(),
                                                                                                            new BitSourceGeneratorBitConfigProvider(solutionFullName), dtosProvider
                                                                                                            , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider));

                await generator.GenerateCodes(workspace);

                Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms using {workspace.GetType().Name}");
            }
            catch (Exception ex)
            {
                LogException("Code Generation failed.", ex);
                throw;
            }
            finally
            {
                sw?.Stop();
            }
        }
        public void IPropertySymbolExtensionsShouldDeterminateConcurrencyCheckPropertiesAsDesired()
        {
            string dtoCode = @"

public interface IDto {
}

public class SampleDto : IDto {
    [ConcurrencyCheckAttribute]
    public virtual int Concurrency{get;set;}
    public virtual int NonConcurrency{get;set;}

}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode)).Single();

            Assert.IsTrue(dto.Properties.ElementAt(0).HasConcurrencyCheck());
            Assert.AreEqual(1, dto.Properties.Count(p => p.HasConcurrencyCheck()));
        }
        public void ITypeSymbolExtensionsShouldDetectUnderlyingTypeSymbolAsDesired()
        {
            string dtoCode = @"
public interface IDto {
}

public class SampleDto : IDto {
    public virtual int Id {get;set;}
    public virtual int? Id2 {get;set;}
    public virtual Task<int> Id3 {get;set;}
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode)).Single();

            Assert.AreEqual("Int32", dto.Properties.ElementAt(0).Type.GetUnderlyingTypeSymbol().Name);
            Assert.AreEqual("Int32", dto.Properties.ElementAt(1).Type.GetUnderlyingTypeSymbol().Name);
            Assert.AreEqual("Int32", dto.Properties.ElementAt(2).Type.GetUnderlyingTypeSymbol().Name);
        }
Exemple #5
0
        private void _buildEvents_OnBuildDone_Internal(vsBuildScope scope, vsBuildAction action)
        {
            Solution solution = _workspace.CurrentSolution;

            if (action == vsBuildAction.vsBuildActionClean)
            {
                DefaultHtmlClientProxyCleaner cleaner = new DefaultHtmlClientProxyCleaner(new DefaultBitCodeGeneratorMappingsProvider(new DefaultBitConfigProvider()));
                cleaner.GetType().GetTypeInfo().GetMethod(nameof(DefaultHtmlClientProxyCleaner.DeleteCodes))
                .Invoke(cleaner, new object[] { _workspace, solution, _isBeingBuiltProjects });

                Log("Generated codes were deleted");
            }
            else
            {
                Stopwatch watch = Stopwatch.StartNew();

                IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider           dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);

                DefaultHtmlClientProxyGenerator generator = new DefaultHtmlClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(),
                                                                                                new DefaultBitCodeGeneratorMappingsProvider(new DefaultBitConfigProvider()), dtosProvider
                                                                                                , new DefaultHtmlClientProxyDtoGenerator(), new DefaultHtmlClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider));

                generator.GetType().GetTypeInfo().GetMethod(nameof(DefaultHtmlClientProxyGenerator.GenerateCodes))
                .Invoke(generator, new object[] { _workspace, solution, _isBeingBuiltProjects });

                watch.Stop();

                Log($"Code Generation Completed in {watch.ElapsedMilliseconds} milli seconds");
            }
        }
        public async Task ITypeSymbolExtensionsShouldDetectNullableTypeSymbolAsDesired()
        {
            string dtoCode = @"
public interface IDto {
}

public class SampleDto : IDto {
    public virtual int Id {get;set;}
    public virtual int? Id2 {get;set;}
    public virtual string Id3 {get;set;}
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = (await dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode))).Single();

            Assert.IsFalse(dto.Properties.ElementAt(0).Type.IsNullable());
            Assert.IsTrue(dto.Properties.ElementAt(1).Type.IsNullable());
            Assert.IsTrue(dto.Properties.ElementAt(2).Type.IsNullable());
        }
        public async Task ITypeSymbolExtensionsShouldReturnTypeScriptElementTypeNameAsDesired()
        {
            string dtoCode = @"

public interface IDto {
}

public class SampleDto : IDto {
    public virtual System.Linq.IQueryable<int> Id {get;set;}
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = (await dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode))).Single();

            Assert.AreEqual("number", (dto.Properties.ElementAt(0).Type as INamedTypeSymbol).GetTypeScriptElementTypeName());
        }
        public virtual async Task ISyncableDtoShouldHaveISVProperty()
        {
            const string sourceCodeOfDtoControllerWithActionAndParameter = @"

public interface IDto {
}

public interface ISyncableDto : IDto {
}

public class TestDto : ISyncableDto {
    public bool ISV { get; set; }
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class TestController : DtoController<TestDto>
{

}
";

            IProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Assert.AreEqual(1, projectDtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(sourceCodeOfDtoControllerWithActionAndParameter)).Single().Properties.Count);
        }
Exemple #9
0
        public virtual async Task IDtoShouldNotHaveIsSyncedPropertyWhenItIsNotISyncable()
        {
            const string sourceCodeOfDtoControllerWithActionAndParameter = @"

public interface IDto {
}

public interface ISyncableDto : IDto {
}

public class TestDto : IDto {
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class TestController : DtoController<TestDto>
{

}
";

            IProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Assert.AreEqual(0, (await projectDtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(sourceCodeOfDtoControllerWithActionAndParameter))).Single().Properties.Count);
        }
        public virtual async Task DefaultDtosProviderShouldReturnDtosInOrdered()
        {
            const string sourceCodes = @"

public interface IDto {
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class XDto : CityDto
{
    public CustomerDto Customer { get; set; }
}

public class PersonDto : IDto
{
    public int Id { get; set; }
}

public class CustomerDto : PersonDto
{
    public CityDto City { get; set; }
}

public class CityDto : IDto
{
    public int Id { get; set; }
}

public class PeopleController : DtoController<PersonDto>
{
}

public class CustomersController : DtoController<CustomerDto>
{
}

public class CitiesController : DtoController<CityDto>
{
}

public class XController : DtoController<XDto>
{
}

";

            IProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            IList <Dto> result = projectDtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(sourceCodes));

            Assert.IsTrue(result.Select(dto => dto.DtoSymbol.Name).SequenceEqual(new[] { "CityDto", "XDto", "PersonDto", "CustomerDto" }));
        }
        private async Task CallGenerateCodes(MSBuildWorkspace workspace, Project beingCompiledProject, string solutionFullName)
        {
            Stopwatch sw = null;

            try
            {
                sw = Stopwatch.StartNew();

                workspace.WorkspaceFailed         += MSBuildWorkspace_WorkspaceFailed;
                workspace.SkipUnrecognizedProjects = workspace.LoadMetadataForReferencedProjects = true;

                IReadOnlyList <ProjectInSolution> allProjects = SolutionFile.Parse(solutionFullName).ProjectsInOrder;

                BitSourceGeneratorBitConfigProvider bitConfigProvider = new BitSourceGeneratorBitConfigProvider(solutionFullName);

                foreach (BitCodeGeneratorMapping mapping in bitConfigProvider.GetConfiguration(workspace).BitCodeGeneratorConfigs.BitCodeGeneratorMappings.Where(config => config.SourceProjects.Any(sp => sp.Name == beingCompiledProject.Name)))
                {
                    foreach (BitTools.Core.Model.ProjectInfo proj in mapping.SourceProjects)
                    {
                        if (workspace.CurrentSolution.Projects.Any(p => p.Name == proj.Name))
                        {
                            continue; /*It's already loaded*/
                        }
                        await workspace.OpenProjectAsync(allProjects.ExtendedSingle($"Trying to find source project {proj.Name}", p => p.ProjectName == proj.Name).AbsolutePath);
                    }

                    if (!workspace.CurrentSolution.Projects.Any(p => p.Name == mapping.DestinationProject.Name))
                    {
                        await workspace.OpenProjectAsync(allProjects.ExtendedSingle($"Trying to find destination project {mapping.DestinationProject.Name}", p => p.ProjectName == mapping.DestinationProject.Name).AbsolutePath);
                    }
                }

                IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider           dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);

                DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(),
                                                                                                            bitConfigProvider, dtosProvider
                                                                                                            , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider));

                await generator.GenerateCodes(workspace);

                Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms using {workspace.GetType().Name}.");
            }
            catch (Exception ex)
            {
                LogException("Code Generation failed.", ex);
                throw;
            }
            finally
            {
                sw?.Stop();
                workspace.WorkspaceFailed -= MSBuildWorkspace_WorkspaceFailed;
            }
        }
        public virtual async Task ITypeSymbolExtensionsShouldFindDtosAsDesired()
        {
            string dtoCode = @"
public interface IDto {

}

public interface ISyncableDto : IDto {
}

public class Person : IDto {
    
}

public class Person2 : ISyncableDto {

}

public class Person3 : IDto , ISyncableDto {

}

public class Person4 {

}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class PeopleController : DtoController<Person>
{

}

public class People2Controller : DtoController<Person2>
{

}

public class People3Controller : DtoController<Person3>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto[] dtos = (await dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode))).ToArray();

            Assert.IsTrue(new[] { "Person3", "Person2", "Person" }.SequenceEqual(dtos.Select(d => d.DtoSymbol.Name).ToArray()));
        }
Exemple #13
0
        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);
            }
        }
        public virtual async Task DefaultProjectDtosProviderShouldReturnDtosOfTestProjectAsDesired()
        {
            using (Workspace workspace = GetWorkspace())
            {
                Solution solution = workspace.CurrentSolution;

                IProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

                IList <Dto> dtos = projectDtosProvider.GetProjectDtos(solution.Projects.Single(p => p.Name == "Foundation.Test")).ToList();

                Assert.AreEqual(11, dtos.Count);
            }
        }
Exemple #15
0
        public virtual async Task DefaultProjectDtosProviderShouldReturnDtosAsDesired()
        {
            using (Workspace workspace = await GetWorkspace())
            {
                Solution solution = workspace.CurrentSolution;

                IProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

                IList <Dto> dtos = (await projectDtosProvider.GetProjectDtos(solution.Projects.Single(p => p.Name == "Bit.OData"))).ToList();

                Assert.IsTrue(dtos.Select(d => d.DtoSymbol.Name).SequenceEqual(new[] { "UserSetting", "JobInfoDto", "ClientLogDto" }));
            }
        }
        public async Task ITypeSymbolExtensionsShouldReturnEdmTypeNameAsDesired()
        {
            string dtoCode = @"
public interface IDto {
}

public class Person : IDto {
    
}

public class SampleDto : IDto {
    public virtual int Id {get;set;}
    public virtual string Id2 {get;set;}
    public virtual Task<string> Id3 {get;set;}
    public virtual int? Id4 {get;set;}
    public virtual IEnumerable<int> Id5 {get;set;}
    public virtual System.Linq.IQueryable<int> Id6 {get;set;}
    public virtual System.Threading.Tasks.Task<int[]> Id7 {get;set;}
    public virtual System.Threading.Tasks.Task<System.Linq.IQueryable<int>> Id8 {get;set;}
    public virtual Person Id9 {get;set;}
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = (await dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode))).Last();

            Assert.AreEqual("Edm.Int32", (dto.Properties.ElementAt(0).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Edm.String", (dto.Properties.ElementAt(1).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Edm.String", (dto.Properties.ElementAt(2).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Edm.Int32", (dto.Properties.ElementAt(3).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Array", (dto.Properties.ElementAt(4).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Array", (dto.Properties.ElementAt(5).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Array", (dto.Properties.ElementAt(6).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Array", (dto.Properties.ElementAt(7).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
            Assert.AreEqual("Person", (dto.Properties.ElementAt(8).Type as INamedTypeSymbol).GetEdmTypeName(useArrayForIEnumerableTypes: true));
        }
        public virtual async Task DefaultDtosProviderShouldReturnDtosOfGenericDesign()
        {
            const string         sourceCodes         = @"

public interface IDto {
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class PersonDto : IDto
{
    public int Id { get; set; }
}

public class CustomerDto : PersonDto
{
    
}

public class EmployeeDto : PersonDto
{
    
}

public class PeopleController<TPersonDto> : DtoController<TPersonDto>
    where TPersonDto : PersonDto
{
}

public class CustomersController : PeopleController<CustomerDto>
{
}

public class EmployeesController : PeopleController<EmployeeDto>
{
}

";
            IProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            IList <Dto> result = projectDtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(sourceCodes));

            Assert.IsTrue(result.Select(dto => dto.DtoSymbol.Name).SequenceEqual(new[] { "PersonDto", "EmployeeDto", "CustomerDto" }));
        }
Exemple #18
0
        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 async Task ITypeSymbolExtensionsShouldDetectIsCollectionTypeAsDesired()
        {
            string dtoCode = @"

public interface IDto {
}

public class SampleDto : IDto {
    public virtual int Id {get;set;}
    public virtual string Id2 {get;set;}
    public virtual Task<string> Id3 {get;set;}
    public virtual int? Id4 {get;set;}
    public virtual IEnumerable<int> Id5 {get;set;}
    public virtual int[] Id6 {get;set;}
    public virtual System.Linq.IQueryable<int> Id7 {get;set;}
    public virtual System.Threading.Tasks.Task<int[]> Id8 {get;set;}
    public virtual System.Threading.Tasks.Task<System.Linq.IQueryable<int>> Id9 {get;set;}
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";

            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = (await dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode))).Single();

            Assert.IsFalse(dto.Properties.ElementAt(0).Type.IsCollectionType());
            Assert.IsFalse(dto.Properties.ElementAt(1).Type.IsCollectionType());
            Assert.IsFalse(dto.Properties.ElementAt(2).Type.IsCollectionType());
            Assert.IsFalse(dto.Properties.ElementAt(3).Type.IsCollectionType());
            Assert.IsTrue(dto.Properties.ElementAt(4).Type.IsCollectionType());
            Assert.IsTrue(dto.Properties.ElementAt(5).Type.IsCollectionType());
            Assert.IsTrue(dto.Properties.ElementAt(6).Type.IsCollectionType());
            Assert.IsTrue(dto.Properties.ElementAt(7).Type.IsCollectionType());
            Assert.IsTrue(dto.Properties.ElementAt(8).Type.IsCollectionType());
        }
Exemple #20
0
        private async System.Threading.Tasks.Task CallGenerateCodes()
        {
            if (bitWorkspaceIsPrepared == false)
            {
                return;
            }

            Stopwatch sw = null;

            try
            {
                sw = Stopwatch.StartNew();

                IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider           dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);

                DefaultTypeScriptClientProxyGenerator generator = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(),
                                                                                                            new DefaultBitConfigProvider(), dtosProvider
                                                                                                            , new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider));

                Workspace workspaceForCodeGeneration = await GetWorkspaceForCodeGeneration();

                try
                {
                    await generator.GenerateCodes(workspaceForCodeGeneration);

                    Log($"Code Generation Completed in {sw.ElapsedMilliseconds} ms using {workspaceForCodeGeneration.GetType().Name}");
                }
                finally
                {
                    if (!(workspaceForCodeGeneration is VisualStudioWorkspace))
                    {
                        workspaceForCodeGeneration.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                LogException("Code Generation failed.", ex);
            }
            finally
            {
                sw?.Stop();
            }
        }
Exemple #21
0
        private async Task GenerateCodes()
        {
            try
            {
                IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider();
                IProjectDtosProvider           dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);

                DefaultHtmlClientProxyGenerator generator = new DefaultHtmlClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(),
                                                                                                new DefaultBitCodeGeneratorMappingsProvider(new DefaultBitConfigProvider()), dtosProvider
                                                                                                , new DefaultHtmlClientProxyDtoGenerator(), new DefaultHtmlClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider));

                await generator.GenerateCodes(_workspace.CurrentSolution, _shouldGeneratedProjects);

                Log($"Code Generation Completed.");
            }
            catch (Exception ex)
            {
                LogException("Code Generation failed.", ex);
            }
        }
Exemple #22
0
        public async Task ISymbolExtensionsShouldReturnCommentsAsDesired()
        {
            string dtoCode = @"

public interface IDto {
}

public class SampleDto : IDto {
    /// <summary>
    /// Test
    /// </summary>
    public virtual int Id {get;set;}
    public virtual string Test {get;set;}
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = (await dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode))).Single();

            Assert.AreEqual(@"/**
    Test
    */", dto.Properties.ElementAt(0).GetDocumentationSummary());

            Assert.AreEqual("", dto.Properties.ElementAt(1).GetDocumentationSummary());
        }
Exemple #23
0
        private void _buildEvents_OnBuildDone(vsBuildScope scope, vsBuildAction action)
        {
            try
            {
                Solution solution = _workspace.CurrentSolution;

                if (action == vsBuildAction.vsBuildActionClean)
                {
                    new DefaultHtmlClientProxyCleaner(new DefaultBitCodeGeneratorMappingsProvider(new DefaultBitConfigProvider()))
                    .DeleteCodes(_workspace, solution, _isBeingBuiltProjects);

                    Log("Generated codes were deleted");
                }
                else
                {
                    Stopwatch watch = Stopwatch.StartNew();

                    IProjectDtoControllersProvider controllersProvider = new DefaultProjectDtoControllersProvider();
                    IProjectDtosProvider           dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);

                    new DefaultHtmlClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(),
                                                        new DefaultBitCodeGeneratorMappingsProvider(new DefaultBitConfigProvider()), dtosProvider
                                                        , new DefaultHtmlClientProxyDtoGenerator(), new DefaultHtmlClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider))
                    .GenerateCodes(_workspace, solution, _isBeingBuiltProjects);

                    watch.Stop();

                    Log($"Code Generation Completed in {watch.ElapsedMilliseconds} milli seconds");
                }
            }
            catch (Exception ex)
            {
                Log(ex.ToString());
                throw;
            }
        }
        public void IPropertySymbolExtensionsShouldDeterminateKeyPropertiesAsDesired()
        {
            string dtoCode = @"

public interface IDto {
}

public class SampleDto : IDto {
    public virtual int Id {get;set;}
    public virtual int SampleDtoId {get;set;}
    [KeyAttribute]
    public virtual int SomeKye{get;set;}
    public virtual string NotAKey{get;set;}
}

public class DtoController<TDto>
    where TDto : IDto
{

}

public class SamplesController : DtoController<SampleDto>
{

}

";
            DefaultProjectDtosProvider dtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto dto = dtosProvider.GetProjectDtos(CreateProjectFromSourceCodes(dtoCode)).Single();

            Assert.IsFalse(dto.Properties.ElementAt(0).IsKey());
            Assert.IsFalse(dto.Properties.ElementAt(1).IsKey());
            Assert.IsTrue(dto.Properties.ElementAt(2).IsKey());
            Assert.IsFalse(dto.Properties.ElementAt(3).IsKey());
        }
Exemple #25
0
        private static async Task AsyncMain(string[] args)
        {
            FluentCommandLineParser <BitCLIV1Args> commandLineParser = new FluentCommandLineParser <BitCLIV1Args>();

            commandLineParser.Setup(arg => arg.Action)
            .As('a', "action")
            .SetDefault(BitCLIV1Action.Generate)
            .WithDescription($"Action to perform. {nameof(BitCLIV1Action.Clean)} || {nameof(BitCLIV1Action.Generate)} || {nameof(BitCLIV1Action.Validate)}. Required");

            commandLineParser.Setup(arg => arg.Path)
            .As('p', "path")
            .Required()
            .WithDescription("Path to solution file. Required.");

            commandLineParser.SetupHelp("?", "help")
            .Callback(helpText => WriteInfo(helpText));

            ICommandLineParserResult result = commandLineParser.Parse(args);

            if (result.HasErrors == true)
            {
                throw new Exception(result.ErrorText);
            }
            else
            {
                BitCLIV1Args typedArgs = commandLineParser.Object;

                typedArgs.Path = Path.Combine(Environment.CurrentDirectory, typedArgs.Path);

                if (!File.Exists(typedArgs.Path))
                {
                    throw new FileNotFoundException($"Solution could not be found at {typedArgs.Path}");
                }

                WriteInfo($"Solution Path: {typedArgs.Path}");
                WriteInfo($"Action: {typedArgs.Action}");

                try
                {
                    WriteMessage("DotNetBuild started...");

                    using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
                        using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
                        {
                            using (Process dotnetBuildProcess = new Process())
                            {
                                dotnetBuildProcess.StartInfo.UseShellExecute        = false;
                                dotnetBuildProcess.StartInfo.RedirectStandardOutput = dotnetBuildProcess.StartInfo.RedirectStandardError = true;
                                dotnetBuildProcess.StartInfo.FileName         = "dotnet";
                                dotnetBuildProcess.StartInfo.Arguments        = $"build {typedArgs.Path}";
                                dotnetBuildProcess.StartInfo.CreateNoWindow   = true;
                                dotnetBuildProcess.StartInfo.WorkingDirectory = Directory.GetParent(typedArgs.Path).FullName;
                                dotnetBuildProcess.OutputDataReceived        += (sender, e) =>
                                {
                                    if (e.Data != null)
                                    {
                                        WriteMessage(e.Data);
                                    }
                                    else
                                    {
                                        outputWaitHandle.Set();
                                    }
                                };
                                dotnetBuildProcess.ErrorDataReceived += (sender, e) =>
                                {
                                    if (e.Data != null)
                                    {
                                        WriteError(e.Data);
                                    }
                                    else
                                    {
                                        errorWaitHandle.Set();
                                    }
                                };
                                dotnetBuildProcess.Start();
                                dotnetBuildProcess.BeginOutputReadLine();
                                dotnetBuildProcess.BeginErrorReadLine();
                                dotnetBuildProcess.WaitForExit();
                                outputWaitHandle.WaitOne();
                                errorWaitHandle.WaitOne();
                            }
                        }

                    WriteMessage("DotNetBuild completed");
                }
                catch (Exception ex)
                {
                    WriteError($"DotNetBuild Error => {ex.ToString()}");
                }

                using (MSBuildWorkspace workspace = MSBuildWorkspace.Create())
                {
                    workspace.LoadMetadataForReferencedProjects = workspace.SkipUnrecognizedProjects = true;

                    workspace.WorkspaceFailed += Workspace_WorkspaceFailed;

                    await workspace.OpenSolutionAsync(typedArgs.Path);

                    switch (typedArgs.Action)
                    {
                    case BitCLIV1Action.Generate:
                        IProjectDtoControllersProvider        controllersProvider = new DefaultProjectDtoControllersProvider();
                        IProjectDtosProvider                  dtosProvider        = new DefaultProjectDtosProvider(controllersProvider);
                        DefaultTypeScriptClientProxyGenerator generator           = new DefaultTypeScriptClientProxyGenerator(new DefaultBitCodeGeneratorOrderedProjectsProvider(), new DefaultBitConfigProvider(), dtosProvider, new DefaultTypeScriptClientProxyDtoGenerator(), new DefaultTypeScriptClientContextGenerator(), controllersProvider, new DefaultProjectEnumTypesProvider(controllersProvider, dtosProvider));
                        await generator.GenerateCodes(workspace);

                        break;

                    case BitCLIV1Action.Validate:
                        throw new NotImplementedException("Validate");

                    case BitCLIV1Action.Clean:
                        throw new NotImplementedException("Clean");

                    default:
                        throw new NotSupportedException();
                    }
                }
            }
        }
Exemple #26
0
        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" }));
        }
        public virtual void DefaultDtosProviderShouldReturnComplexTypesOfSourceProjectsOnly()
        {
            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 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; }
}

";

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

";

            Project otherProject  = CreateProjectFromSourceCodes(otherProjectCodes);
            Project sourceProject = CreateProjectFromSourceCodesWithExistingSolution(otherProject.Solution, sourceProjectCodes);

            sourceProject = sourceProject.AddProjectReference(new ProjectReference(otherProject.Id));

            DefaultProjectDtosProvider projectDtosProvider = new DefaultProjectDtosProvider(new DefaultProjectDtoControllersProvider());

            Dto[] dtos = projectDtosProvider.GetProjectDtos(sourceProject).ToArray();

            Assert.IsTrue(dtos.Select(d => d.DtoSymbol.Name).SequenceEqual(new[] { "ComplexObj3", "ComplexObj", "TestComplexDto" }));
        }