private async Task Proceed(IBuildTask task, IList<ProjectItem> items) { if (!task.DependsOn.IsMatch(items)) return; var querySets = task.DependsOn.Select(_project.GetItems(), items).ToList(); foreach (var querySet in querySets) { var sources = task.Proceed(querySet.GetItems()); if (sources == null) throw new InvalidOperationException("The proceed method has to return a value."); foreach (var source in sources) { ProjectItem existing; if (_project.TryGetItemById(source.Identifier, out existing)) { var defferred = existing as DefferedProjectItem; defferred?.SetDirty(source.Content); var inMemory = existing as InMemoryProjectItem; inMemory?.SetContent((await CopyToStream(source)).GetBuffer()); _project.Touch(existing); } else { ProjectItem item2; if (task.Options == BuildOptions.BuildInBackground) { item2 = await BuildInMemoryItem(source); } else item2 = new DefferedProjectItem(source.Identifier, source.Content); _project.AddItem(item2); foreach (var linkedItem in querySet.GetItems()) _project.AddLink(linkedItem, new ProjectItemLinkDescriptionFromBuilder(task.Name, this, linkedItem), item2); } } } }