/// <summary> /// Creates a new ITaskItem with the contents of the old one. /// </summary> private ITaskItem CreateNewTaskItemFrom(ITaskItem copyFrom) { ITaskItem2 copyFromAsITaskItem2 = copyFrom as ITaskItem2; string escapedItemSpec = null; string escapedDefiningProject = null; Dictionary <string, string> escapedMetadata = null; if (copyFromAsITaskItem2 != null) { escapedItemSpec = copyFromAsITaskItem2.EvaluatedIncludeEscaped; escapedDefiningProject = copyFromAsITaskItem2.GetMetadataValueEscaped(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath); IDictionary nonGenericEscapedMetadata = copyFromAsITaskItem2.CloneCustomMetadataEscaped(); if (nonGenericEscapedMetadata is Dictionary <string, string> ) { escapedMetadata = (Dictionary <string, string>)nonGenericEscapedMetadata; } else { escapedMetadata = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); foreach (object key in nonGenericEscapedMetadata.Keys) { escapedMetadata[(string)key] = (string)nonGenericEscapedMetadata[key] ?? String.Empty; } } } else { // If we don't have ITaskItem2 to fall back on, we have to make do with the fact that // CloneCustomMetadata, GetMetadata, & ItemSpec returns unescaped values, and // TaskParameterTaskItem's constructor expects escaped values, so escaping them all // is the closest approximation to correct we can get. escapedItemSpec = EscapingUtilities.Escape(copyFrom.ItemSpec); escapedDefiningProject = EscapingUtilities.EscapeWithCaching(copyFrom.GetMetadata(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath)); IDictionary customMetadata = copyFrom.CloneCustomMetadata(); escapedMetadata = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); if (customMetadata != null && customMetadata.Count > 0) { foreach (string key in customMetadata.Keys) { escapedMetadata.Add(key, EscapingUtilities.Escape((string)customMetadata[key] ?? String.Empty)); } } } TaskParameterTaskItem taskItem = new TaskParameterTaskItem(escapedItemSpec, escapedDefiningProject, escapedMetadata); return(taskItem); }
/// <summary> /// Write the given ITaskItem, using the given write translator /// </summary> private void WriteITaskItem(ITranslator translator, ITaskItem wrappedItem) { ErrorUtilities.VerifyThrow(translator.Mode == TranslationDirection.WriteToStream, "Cannot call this method when reading!"); if (!TranslateNullable(translator, wrappedItem)) { return; } string escapedItemSpec; string escapedDefiningProject; IDictionary wrappedMetadata; bool wrappedMetadataIsEscaped; ITaskItem2 wrappedItemAsITaskItem2 = wrappedItem as ITaskItem2; if (wrappedItemAsITaskItem2 != null) { escapedItemSpec = wrappedItemAsITaskItem2.EvaluatedIncludeEscaped; escapedDefiningProject = wrappedItemAsITaskItem2.GetMetadataValueEscaped(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath); wrappedMetadata = wrappedItemAsITaskItem2.CloneCustomMetadataEscaped(); wrappedMetadataIsEscaped = true; } else { // We know that the ITaskItem constructor expects an escaped string, and that ITaskItem.ItemSpec // is expected to be unescaped, so make sure we give the constructor what it wants. escapedItemSpec = EscapingUtilities.Escape(wrappedItem.ItemSpec); escapedDefiningProject = EscapingUtilities.EscapeWithCaching(wrappedItem.GetMetadata(FileUtilities.ItemSpecModifiers.DefiningProjectFullPath)); wrappedMetadata = wrappedItem.CloneCustomMetadata(); wrappedMetadataIsEscaped = false; } Dictionary <string, string> escapedGenericWrappedMetadata = wrappedMetadata as Dictionary <string, string>; if (escapedGenericWrappedMetadata == null) { escapedGenericWrappedMetadata = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); foreach (object key in wrappedMetadata.Keys) { string value = (string)wrappedMetadata[key]; if (!wrappedMetadataIsEscaped) { value = (value == null) ? value : EscapingUtilities.Escape(value); } escapedGenericWrappedMetadata.Add((string)key, value); } } else if (!wrappedMetadataIsEscaped) { foreach (KeyValuePair <string, string> entry in escapedGenericWrappedMetadata) { escapedGenericWrappedMetadata[entry.Key] = entry.Value == null ? entry.Value : EscapingUtilities.Escape(entry.Value); } } translator.Translate(ref escapedItemSpec); translator.Translate(ref escapedDefiningProject); translator.TranslateDictionary(ref escapedGenericWrappedMetadata, StringComparer.OrdinalIgnoreCase); }