From 93345d08194d804eee41a1e8f6c6dd995ad4d434 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 9 May 2019 14:54:55 +0300 Subject: [PATCH] Refactor CLI --- .../AbpModuleClassFinder.cs | 64 +++++++++++++++++ .../ProjectModification/AbpModuleFinder.cs | 71 ------------------- ...OnAdder.cs => ModuleClassDependcyAdder.cs} | 9 +-- .../ProjectNugetPackageAdder.cs | 13 +++- .../SolutionModuleAdder.cs | 6 +- 5 files changed, 84 insertions(+), 79 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleClassFinder.cs delete mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleFinder.cs rename framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/{DependsOnAdder.cs => ModuleClassDependcyAdder.cs} (76%) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleClassFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleClassFinder.cs new file mode 100644 index 0000000000..c4e0868659 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleClassFinder.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.ProjectModification +{ + public class AbpModuleClassFinder : ITransientDependency + { + public virtual List Find(string csprojFilePath) + { + var modules = new List(); + + var csFiles = GetAllCsFilesUnderDirectory(Path.GetDirectoryName(csprojFilePath), new List()); + + foreach (var csFile in csFiles) + { + var root = CSharpSyntaxTree.ParseText(File.ReadAllText(csFile)).GetRoot(); + + var namespaceSyntaxs = root.DescendantNodes().OfType(); + + foreach (var namespaceSyntax in namespaceSyntaxs) + { + var classDeclarationSyntaxs = namespaceSyntax.DescendantNodes().OfType(); + var syntaxsArray = classDeclarationSyntaxs as ClassDeclarationSyntax[] ?? classDeclarationSyntaxs.ToArray(); + + foreach (var classDeclaration in syntaxsArray) + { + var classDerivedFromAbpModule = classDeclaration.BaseList?.Types.FirstOrDefault(t => t.ToString().Contains("AbpModule")); + + if (classDerivedFromAbpModule != null) + { + modules.Add(csFile); + } + } + } + } + + return modules; + } + + protected virtual List GetAllCsFilesUnderDirectory(string path, List allCsFileList) + { + var directory = new DirectoryInfo(path); + var files = directory.GetFiles("*.cs").Select(f => f.DirectoryName + "\\" + f.Name).ToList(); + + foreach (var s in files) + { + allCsFileList.Add(s); + } + + var directories = directory.GetDirectories().Select(d => path + "\\" + d.Name).ToList(); + + foreach (var subDirectory in directories) + { + allCsFileList = GetAllCsFilesUnderDirectory(subDirectory, allCsFileList); + } + + return allCsFileList; + } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleFinder.cs deleted file mode 100644 index ca02137154..0000000000 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/AbpModuleFinder.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; - -namespace Volo.Abp.ProjectModification -{ - public class AbpModuleFinder - { - public List Find(string csprojFilePath) - { - var modules = new List(); - - var csFiles = GetAllCsFilesUnderDirectory(Path.GetDirectoryName(csprojFilePath), new List()); - - foreach (var csFile in csFiles) - { - try - { - var root = CSharpSyntaxTree.ParseText(File.ReadAllText(csFile)).GetRoot(); - - var namespaceSyntaxs = root.DescendantNodes().OfType(); - - foreach (var namespaceSyntax in namespaceSyntaxs) - { - var classDeclarationSyntaxs = namespaceSyntax.DescendantNodes().OfType(); - var syntaxsArray = classDeclarationSyntaxs as ClassDeclarationSyntax[] ?? classDeclarationSyntaxs.ToArray(); - - foreach (var classDeclaration in syntaxsArray) - { - var classDerivedFromAbpModule = classDeclaration.BaseList?.Types.FirstOrDefault(t => t.ToString().Contains("AbpModule")); - - if (classDerivedFromAbpModule != null) - { - modules.Add(csFile); - } - } - } - } - catch (Exception) - { - //ignored! - } - } - - return modules; - } - - private static List GetAllCsFilesUnderDirectory(string path, List allCsFileList) - { - var directory = new DirectoryInfo(path); - var files = directory.GetFiles("*.cs").Select(f => f.DirectoryName + "\\" + f.Name).ToList(); - - foreach (var s in files) - { - allCsFileList.Add(s); - } - - var directories = directory.GetDirectories().Select(d => path + "\\" + d.Name).ToList(); - - foreach (var subDirectory in directories) - { - allCsFileList = GetAllCsFilesUnderDirectory(subDirectory, allCsFileList); - } - - return allCsFileList; - } - } -} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/DependsOnAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/ModuleClassDependcyAdder.cs similarity index 76% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/DependsOnAdder.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/ModuleClassDependcyAdder.cs index d1dfd86d0a..f9835d239a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/DependsOnAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/ModuleClassDependcyAdder.cs @@ -1,12 +1,13 @@ using System; using System.IO; using System.Linq; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.ProjectModification { - public class DependsOnAdder + public class ModuleClassDependcyAdder : ITransientDependency { - public void Add(string path, string module) + public virtual void Add(string path, string module) { ParseModuleNameAndNameSpace(module, out var nameSpace, out var moduleName); @@ -22,7 +23,7 @@ namespace Volo.Abp.ProjectModification File.WriteAllText(path, file); } - private void ParseModuleNameAndNameSpace(string module, out string nameSpace, out string moduleName) + protected virtual void ParseModuleNameAndNameSpace(string module, out string nameSpace, out string moduleName) { var words = module?.Split('.'); @@ -37,7 +38,7 @@ namespace Volo.Abp.ProjectModification nameSpace = string.Join(".", words.Take(words.Length - 1)); } - private string GetUsingStatement(string nameSpace) + protected virtual string GetUsingStatement(string nameSpace) { return "using " + nameSpace + ";"; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/ProjectNugetPackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/ProjectNugetPackageAdder.cs index bf9c0f25f5..b6b7355f6d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/ProjectNugetPackageAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/ProjectNugetPackageAdder.cs @@ -18,13 +18,19 @@ namespace Volo.Abp.ProjectModification protected IJsonSerializer JsonSerializer { get; } protected ProjectNpmPackageAdder NpmPackageAdder { get; } + protected AbpModuleClassFinder ModuleClassFinder { get; } + protected ModuleClassDependcyAdder ModuleClassDependcyAdder { get; } public ProjectNugetPackageAdder( IJsonSerializer jsonSerializer, - ProjectNpmPackageAdder npmPackageAdder) + ProjectNpmPackageAdder npmPackageAdder, + AbpModuleClassFinder moduleClassFinder, + ModuleClassDependcyAdder moduleClassDependcyAdder) { JsonSerializer = jsonSerializer; NpmPackageAdder = npmPackageAdder; + ModuleClassFinder = moduleClassFinder; + ModuleClassDependcyAdder = moduleClassDependcyAdder; Logger = NullLogger.Instance; } @@ -40,8 +46,9 @@ namespace Volo.Abp.ProjectModification var procStartInfo = new ProcessStartInfo("dotnet", "add package " + packageName); Process.Start(procStartInfo).WaitForExit(); - var moduleFile = new AbpModuleFinder().Find(projectFile).First(); - new DependsOnAdder().Add(moduleFile, packageInfo.ModuleClass); + var moduleFile = ModuleClassFinder.Find(projectFile).First(); + //TODO: Handle multiple module classes! + ModuleClassDependcyAdder.Add(moduleFile, packageInfo.ModuleClass); if (packageInfo.DependedNpmPackage != null) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/SolutionModuleAdder.cs index c78099210c..75f957fecf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/ProjectModification/SolutionModuleAdder.cs @@ -1,12 +1,16 @@ using System.Threading.Tasks; +using JetBrains.Annotations; using Volo.Abp.DependencyInjection; namespace Volo.Abp.ProjectModification { public class SolutionModuleAdder : ITransientDependency { - public async Task AddAsync(string solutionFile, string moduleName) + public virtual async Task AddAsync([NotNull] string solutionFile, [NotNull] string moduleName) { + Check.NotNull(solutionFile, nameof(solutionFile)); + Check.NotNull(moduleName, nameof(moduleName)); + } }