public void Translate(IDictionary<CarbonFileResult, CarbonFile> files) { this.targetDirectory = this.config.Current.ProjectRoot.ToDirectory(this.config.Current.TargetDirectory ?? new CarbonDirectory(string.Empty)); this.targetDirectory.Create(); var project = new TempProject { Name = this.config.Current.ProjectName, TemplateFile = this.config.Current.ProjectTemplate, FileSourceRoot = this.config.Current.IntermediateSubDirectory.GetPath(), FileTargetRoot = this.config.Current.TargetSubDirectory.GetPath(), RootNameSpace = this.config.Current.RootNameSpace }; IList<Task> tasks = new List<Task>(); foreach (CarbonFileResult sourceFile in files.Keys) { CarbonFile targetFile = files[sourceFile]; if (this.config.Current.ProcessParrallel) { CarbonFile closure = sourceFile.Absolute; tasks.Add(Task.Factory.StartNew(() => this.TranslateFile(project, closure, targetFile))); } else { this.TranslateFile(project, sourceFile.Absolute, targetFile); } } Task.WaitAll(tasks.ToArray()); this.targetDirectory.Create(); CarbonFile outFile = this.targetDirectory.ToFile(project.Name + this.config.Current.IntermediateProjectExtension); JsonExtensions.SaveToFile(outFile, project, false, Formatting.Indented); }
private CompilationJob CreateJob(TempProject project, TempProjectFileEntry entry) { var job = new CompilationJob { IsCompressed = entry.IsCompressed, NameSpace = this.compilerState.BaseNameSpace }; if (entry.RelativePath != null && !entry.RelativePath.IsNull) { string fileNameSpace = this.compiler.GetNameSpace(entry.RelativePath); job.NameSpace = string.Join(Compiler.NameSpaceSeparator.ToString(CultureInfo.InvariantCulture), job.NameSpace, fileNameSpace); } job.NameSpace = this.GetNameSpace(project.RootNameSpace, entry); CarbonDirectory fileTargetDirectory = this.targetDirectory.ToDirectory(SourceTargetDir); if (entry.RelativePath != null) { fileTargetDirectory = fileTargetDirectory.ToDirectory(entry.RelativePath); } job.SourceFile = this.targetDirectory.ToFile(entry.File); job.TargetFile = fileTargetDirectory.ToFile(entry.RelativeFile); if (entry.Classes != null) { foreach (string @class in entry.Classes) { var classNameSpace = string.Concat(job.NameSpace, Compiler.NameSpaceSeparator, @class); if (this.includeJobDictionary.ContainsKey(classNameSpace)) { System.Diagnostics.Trace.TraceWarning("Multiple class definitions for " + classNameSpace); continue; } this.includeJobDictionary.Add(classNameSpace, job); } } return job; }
// ------------------------------------------------------------------- // Private // ------------------------------------------------------------------- private void TranslateFile(TempProject project, CarbonFile sourceFile, CarbonFile targetFile) { Diagnostic.RegisterThread("Translate." + sourceFile.FileName); CarbonDirectory targetRelativeSubDir = targetFile.GetDirectory() ?? new CarbonDirectory(string.Empty); CarbonDirectory fullTargetPath = this.targetDirectory.ToDirectory(this.config.Current.IntermediateSubDirectory, targetRelativeSubDir); CarbonFile fullTargetFile = fullTargetPath.ToFile(targetFile.FileName + TempExtension); CarbonFile relativeTargetFile = this.config.Current.IntermediateSubDirectory.ToDirectory(targetRelativeSubDir).ToFile(targetFile.FileName + TempExtension); if (this.config.Current.Verbose) { System.Diagnostics.Trace.TraceInformation("Translating {0} -> {1}", sourceFile, fullTargetFile); } IList<Token> tokens = this.TokenizeFile(sourceFile); if (tokens == null) { throw new InvalidDataException(); } project.AddStat(TempProjectStat.Files); project.AddStat(TempProjectStat.Tokens, tokens.Count); var fileEntry = new TempProjectFileEntry { IsCompressed = this.config.Current.CompressIntermediate, RelativeFile = new CarbonFile(targetFile.FileName), RelativePath = targetFile.GetDirectory(), File = relativeTargetFile, }; var data = new TranslationData(tokens) { ProjectData = project, SourceFile = sourceFile, TargetFile = fullTargetFile, FileEntry = fileEntry }; // Register the file entry into the project project.AddFile(fileEntry); try { TempFileFull file = this.TranslateToTempFile(data); this.SaveTempFile(data, file); } catch (Exception e) { System.Diagnostics.Trace.TraceError("Failed to translate {0}: {1}", fileEntry.File, e); this.SaveTempFile(data, new TempFileFull() { Name = data.TargetFile.FileName }); } Diagnostic.UnregisterThread(); }