/// <summary> /// 安装入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否安装成功</returns> public bool Run(ProjectParameter parameter) { if (parameter != null) { foreach (Type type in parameter.Types) { if (typeof(CombinationTemplateConfig).IsAssignableFrom(type) && type != typeof(CombinationTemplateConfig)) { CombinationTemplateConfig config = (CombinationTemplateConfig)Activator.CreateInstance(type); DirectoryInfo directory = new DirectoryInfo(parameter.ProjectPath + config.TemplatePath); if (directory.Exists) { LeftArray <string>[] codes = Directory.GetFiles(directory.FullName, "*.cs").getArray(name => code(name)); if (!codes.any(code => code.Length == 0)) { string fileName = parameter.ProjectPath + @"{" + parameter.DefaultNamespace + "}.CombinationTemplate.cs"; if (Coder.WriteFile(fileName, Coder.WarningCode + string.Concat(codes.getArray(code => code.ToArray()).getArray()) + Coder.FileEndCode)) { Messages.Message(fileName + " 被修改"); } return(true); } } else { Messages.Message("没有找到自定义模板相对项目路径" + config.TemplatePath); } } } return(true); } return(false); }
/// <summary> /// 安装入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否安装成功</returns> public bool Run(ProjectParameter parameter) { if (parameter != null) { if (parameter.IsAutoCSerCodeGenerator || parameter.IsCustomCodeGenerator) { LeftArray <Definition> definitions = (parameter.IsCustomCodeGenerator ? parameter.Assembly : ProjectParameter.CurrentAssembly).GetTypes().getArray(type => new Definition { Type = type, Auto = type.customAttribute <GeneratorAttribute>(), Parameter = parameter }) .getFind(type => type.Auto != null && type.Auto.IsTemplate)// && type.Auto.DependType == typeof(cSharper) .Sort((left, right) => string.CompareOrdinal(left.Type.FullName, right.Type.FullName)); LeftArray <string> codes = new LeftArray <string>(definitions.Length); foreach (Definition definition in definitions) { codes.Add(definition.ToString()); if (Messages.IsError) { return(false); } } string fileName = parameter.ProjectPath + @"{AutoCSer}.CSharper.cs"; if (Coder.WriteFile(fileName, Coder.WarningCode + string.Concat(codes.ToArray()) + Coder.FileEndCode)) { Messages.Add(fileName + " 被修改"); throw new Exception(); } } return(true); } return(false); }
/// <summary> /// 安装入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否安装成功</returns> public bool Run(ProjectParameter parameter) { if (parameter != null) { HashSet <string> codeFileNames = new HashSet <string>(); foreach (Type type in parameter.Types ?? EmptyArray <Type> .Array) { if (!type.IsAbstract && typeof(CombinationTemplateConfig).IsAssignableFrom(type) && type != typeof(CombinationTemplateConfig)) { CombinationTemplateConfig config = (CombinationTemplateConfig)Activator.CreateInstance(type); string codeFileName = config.GetCodeFileName(parameter.DefaultNamespace); if (!codeFileNames.Add(codeFileName)) { Messages.Error("自定义简单组合模板目标文件名称冲突 " + codeFileName); return(false); } LeftArray <string> codes = new LeftArray <string>(0); foreach (string templatePath in config.TemplatePath) { DirectoryInfo directory = new DirectoryInfo(Path.Combine(parameter.ProjectPath, templatePath)); if (directory.Exists) { foreach (FileInfo file in directory.GetFiles("*.cs")) { LeftArray <string> newCodes = getCode(file.FullName); if (newCodes.Length == 0) { return(false); } codes.Add(ref newCodes); } } else { Messages.Error("没有找到自定义模板相对项目路径" + config.TemplatePath); return(false); } } string fileName = Path.Combine(parameter.ProjectPath, @"{" + codeFileName + "}.CombinationTemplate.cs"); if (Coder.WriteFile(fileName, Coder.WarningCode + string.Concat(codes.ToArray()) + Coder.FileEndCode)) { Messages.Message(fileName + " 被修改"); } } } return(true); } return(false); }
/// <summary> /// CSharp代码生成器 /// </summary> /// <param name="parameter">安装参数</param> /// <param name="type">模板数据视图</param> /// <param name="language">语言</param> public Coder(ProjectParameter parameter, Type type, CodeLanguage language) : base(type, Messages.Add, Messages.Message) { this.parameter = parameter; extensionName = "." + EnumAttribute <CodeLanguage, CodeLanguageAttribute> .Array((int)(byte)language).ExtensionName; creators[Command.NOTE.ToString()] = note; creators[Command.LOOP.ToString()] = creators[Command.FOR.ToString()] = loop; creators[Command.AT.ToString()] = at; creators[Command.PUSH.ToString()] = push; creators[Command.IF.ToString()] = ifThen; creators[Command.NOT.ToString()] = not; creators[Command.NAME.ToString()] = name; creators[Command.FROMNAME.ToString()] = fromName; creators[Command.PART.ToString()] = part; }
/// <summary> /// 代码生成入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否生成成功</returns> public bool Run(ProjectParameter parameter) { if ((WebConfig = parameter.WebConfig) != null && WebConfig.IsWebView) { this.Parameter = parameter; Type exportPathType = WebConfig.ExportPathType; if (exportPathType != null) { DirectoryInfo viewDirectory = new DirectoryInfo(parameter.ProjectPath + WebConfig.ViewJsDirectory + Path.DirectorySeparatorChar); if (viewDirectory.Exists) { string webPathFileName = viewDirectory.fullName() + "WebPath"; if (!(WebConfig.IsExportPathTypeScript ? TemplateGenerator.WebPath.TypeScript.Default.Run(exportPathType, webPathFileName) : TemplateGenerator.WebPath.JavaScript.Default.Run(exportPathType, webPathFileName))) { Messages.Message("WEB Path 生成失败"); } } else { Messages.Message("没有找到 WEB 视图扩展默认目录 " + viewDirectory.FullName); } } if (WebConfig.IsCopyScript) { if (AutoCSerScriptPath == null) { Messages.Message("没有找到 js 文件路径"); } else { copyScript(); } } Htmls = DictionaryCreator.CreateHashString <HtmlJs>(); if (!HtmlJs.Create(this)) { return(false); } css(); File.WriteAllText(parameter.ProjectPath + AutoCSer.Net.Http.Header.VersionFileName, HtmlJs.Version, System.Text.Encoding.ASCII); } return(true); }
/// <summary> /// 安装入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否安装成功</returns> public bool Run(ProjectParameter parameter) { if (parameter != null) { //if (!parameter.IsAutoCSerCodeGenerator) return true; string path = parameter.ProjectPath + DefaultTemplatePath; if (Directory.Exists(path)) { LeftArray <string>[] codes = Directory.GetFiles(path, "*.cs").getArray(name => code(name)); if (!codes.any(code => code.Length == 0)) { string fileName = parameter.ProjectPath + @"..\Sort\{AutoCSer}.CombinationTemplate.cs"; if (Coder.WriteFile(fileName, Coder.WarningCode + string.Concat(codes.getArray(code => code.ToArray()).getArray()) + Coder.FileEndCode)) { Messages.Message(fileName + " 被修改"); } return(true); } } } return(false); }
/// <summary> /// 安装入口 /// </summary> /// <param name="parameter">安装参数</param> /// <returns>是否安装成功</returns> public bool Run(ProjectParameter parameter) { if (parameter != null) { if (parameter.IsAutoCSerCodeGenerator || parameter.IsCustomCodeGenerator) { LeftArray <Definition> definitions = (parameter.IsCustomCodeGenerator ? parameter.Assembly : ProjectParameter.CurrentAssembly).GetTypes().getArray(type => new Definition { Type = type, Auto = type.customAttribute <GeneratorAttribute>(), Parameter = parameter }) .getFind(type => type.Auto != null && type.Auto.IsTemplate)// && type.Auto.DependType == typeof(cSharper) .Sort((left, right) => string.CompareOrdinal(left.Type.FullName, right.Type.FullName)); LeftArray <string> codes = new LeftArray <string>(definitions.Length); foreach (Definition definition in definitions) { codes.Add(definition.ToString()); if (Messages.IsError) { return(false); } } #if DotNetStandard string path = new System.IO.FileInfo(parameter.AssemblyPath).Directory.fullName(); copyDotNetCoreJson(path, "AutoCSer.CodeGenerator.deps.json"); copyDotNetCoreJson(path, "AutoCSer.CodeGenerator.runtimeconfig.dev.json"); copyDotNetCoreJson(path, "AutoCSer.CodeGenerator.runtimeconfig.json"); #endif string fileName = parameter.ProjectPath + @"{AutoCSer}.CSharper.cs"; if (Coder.WriteFile(fileName, Coder.WarningCode + string.Concat(codes.ToArray()) + Coder.FileEndCode)) { Messages.Error(fileName + " 被修改"); return(false); } } return(true); } return(false); }
///// <summary> ///// 添加没有依赖的记忆代码 ///// </summary> ///// <param name="code">没有依赖的记忆代码</param> //[MethodImpl(AutoCSer.MethodImpl.AggressiveInlining)] //public static void AddRemember(string code) //{ // rememberCodes.Add(code); //} /// <summary> /// 输出代码 /// </summary> public static void Output(ProjectParameter parameter) { StringArray[] builders = new StringArray[codes.Length]; for (int index = codes.Length; index != 0;) { StringArray builder = codes[--index]; if (builder.Length != 0) { builders[index] = builder; codes[index] = new StringArray(); } CodeLanguage language = (CodeLanguage)(byte)index; switch (language) { case CodeLanguage.JavaScript: case CodeLanguage.TypeScript: if (builders[index] != null) { Messages.Add("生成了未知的 " + language + " 代码。"); } break; } } //StringArray rememberCodeBuilder = null; //if (rememberCodes.Length != 0) //{ // rememberCodeBuilder = rememberCodes; // rememberCodes = new StringArray(); //} codeTypes.Clear(); if (Messages.IsError) { return; } //string message = string.Empty; for (int index = builders.Length; index != 0;) { StringArray builder = builders[--index]; if (builder != null) { switch (index) { case (int)CodeLanguage.CSharp: string code = builder.ToString(), AutoCSerFileName = null; #if !DotNetStandard bool isAutoCSer = false; #endif if (!string.IsNullOrEmpty(code)) { string fileName = parameter.ProjectPath + (AutoCSerFileName = "{" + parameter.DefaultNamespace + "}.AutoCSer.cs"); if (WriteFile(fileName, WarningCode + code + FileEndCode)) { #if !DotNetStandard isAutoCSer = true; #endif Messages.Message(fileName + " 被修改"); //message = fileName + " 被修改"; } } #if !DotNetStandard if (parameter.IsProjectFile && isAutoCSer) { string projectFile = parameter.AssemblyPath + parameter.ProjectName + ".csproj"; if (File.Exists(projectFile)) { string projectXml = File.ReadAllText(projectFile, System.Text.Encoding.UTF8); if (isAutoCSer) { AutoCSerFileName = @"<Compile Include=""" + AutoCSerFileName + @""" />"; } int fileIndex; if (isAutoCSer && (fileIndex = projectXml.IndexOf(AutoCSerFileName)) != -1) { break; } string csFileName = @".cs"" /> "; if ((fileIndex = projectXml.IndexOf(csFileName)) != -1) { if (isAutoCSer) { AutoCSerFileName += @" "; } projectXml = projectXml.Insert(fileIndex + csFileName.Length, AutoCSerFileName); MoveFile(projectFile, projectXml); } } } #endif break; } } } //if (message.Length != 0) AutoCSer.Log.Pub.Log.waitThrow(AutoCSer.Log.LogType.All, message); }