/// <summary> /// Command execute handler. /// </summary> /// <returns>0 success, otherwise failure.</returns> private int OnCommandExecute() { ExecuteArgument arg = ExecuteArgument.Create(this._appCmd.Options); if (arg == null) { return(1); } if (arg.Files.Count == 0 && arg.Config.Samples.Count == 0) { this.Log("No files to convert."); return(0); } List <Document> documents = this.BuildAst(arg.AllFiles); List <Document> includedDocuments = (arg.Files == arg.AllFiles ? documents : documents.FindAll(doc => arg.Files.Contains(doc.Path))); if (this.ConfirmConvert(includedDocuments)) { Project project = new Project(arg.BasePath, documents, includedDocuments); ConverterContext context = this.CreateConverterContext(project, arg.Config); this.ClearOutput(arg); this.Convert(context, arg); } return(0); }
/// <summary> /// Convert typescript to csharp code. /// </summary> /// <param name="context">The convert context.</param> /// <param name="arg">Execute argument.</param> private void Convert(ConverterContext context, ExecuteArgument arg) { List <Document> avaiableDocs = this.FilterDocuments(context.Project.IncludeDocuments, context.Config.ExcludeTypes); // analyze DateTime startTime = DateTime.Now; this.Log(string.Format("Starting analyze files({0})", avaiableDocs.Count)); List <Node> nodes = new List <Node>(); foreach (Document doc in avaiableDocs) { nodes.Add(doc.Root); } context.Analyze(nodes); this.Log(string.Format("Finished after {0}s", (DateTime.Now - startTime).TotalSeconds.ToString("0.00"))); // convert startTime = DateTime.Now; this.Log(string.Format("Starting convert files({0})", avaiableDocs.Count)); foreach (Document doc in avaiableDocs) { DateTime beginTime = DateTime.Now; this.Log(string.Format("Starting convert file '{0}'", Path.GetFileNameWithoutExtension(doc.Path))); Output output = arg.GetOutput(doc.Path); ConverterConfig config = context.Config; //convert config.Namespace = output.Namespace; config.Usings = output.Usings; config.PreferTypeScriptType = output.PreferTypeScriptType; string savePath = arg.GetSavePath(doc.Path, output); string code = CodeHeaderText + doc.Root.ToCSharp(); File.WriteAllText(savePath, code); // this.Log(string.Format("Finished after {0}s", (DateTime.Now - beginTime).TotalSeconds.ToString("0.00"))); } this.Log(string.Format("Finished after {0}s", (DateTime.Now - startTime).TotalSeconds.ToString("0.00"))); }
/// <summary> /// Clear output directory's files which not in input files. /// </summary> private void ClearOutput(ExecuteArgument arg) { if (!Directory.Exists(arg.Output.Path) || !Directory.Exists(arg.BasePath)) { return; } List <string> deleteFiles = new List <string>(); List <string> allInputFiles = arg.AllFiles; var inputDirectories = Directory.GetDirectories(arg.BasePath); var outputDirectories = Directory.GetDirectories(arg.Output.Path).Where(dir1 => { return(inputDirectories.Any(dir2 => Path.GetFileName(dir2) == Path.GetFileName(dir1))); }); foreach (string dir in outputDirectories) { var existFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".cs")) .Select(s => Path.GetRelativePath(dir, s)); foreach (string file in existFiles) { string file2 = file.Substring(0, file.LastIndexOf('.')) + ".ts.json"; if (!allInputFiles.Exists(f => f.EndsWith(file2))) { deleteFiles.Add(Path.Combine(dir, file)); } } } foreach (string file in deleteFiles) { File.Delete(file); } }