void QueueInference()
        {
            var doc = this.CU as XmlParsedDocument;

            if (doc == null || doc.XDocument == null || inferenceQueued)
            {
                return;
            }
            if (inferredCompletionData != null)
            {
                if ((doc.LastWriteTimeUtc - inferredCompletionData.TimeStampUtc).TotalSeconds < 5)
                {
                    return;
                }
            }
            inferenceQueued = true;
            ThreadPool.QueueUserWorkItem(delegate {
                try {
                    inferredCompletionData = MSBuildResolveContext.Create(doc, inferredCompletionData);
                    inferenceQueued        = false;
                } catch (Exception ex) {
                    LoggingService.LogInternalError("Unhandled error in XML inference", ex);
                }
            });
        }
		public static MSBuildResolveContext Create (XmlParsedDocument doc, MSBuildResolveContext previous)
		{
			var ctx = new MSBuildResolveContext ();
			ctx.Populate (doc.XDocument);
			if (doc.Errors.Count > 0)
				ctx.Merge (previous);
			return ctx;
		}
        public static MSBuildResolveContext Create(XmlParsedDocument doc, MSBuildResolveContext previous)
        {
            var ctx = new MSBuildResolveContext();

            ctx.Populate(doc.XDocument);
            if (doc.GetErrorsAsync().Result.Count > 0)
            {
                ctx.Merge(previous);
            }
            return(ctx);
        }
 void Merge(MSBuildResolveContext other)
 {
     foreach (var otherItem in other.items)
     {
         HashSet <string> item;
         if (items.TryGetValue(otherItem.Key, out item))
         {
             foreach (var att in otherItem.Value)
             {
                 item.Add(att);
             }
         }
         else
         {
             items [otherItem.Key] = otherItem.Value;
         }
     }
     foreach (var otherTask in other.tasks)
     {
         HashSet <string> task;
         if (tasks.TryGetValue(otherTask.Key, out task))
         {
             foreach (var att in otherTask.Value)
             {
                 task.Add(att);
             }
         }
         else
         {
             tasks [otherTask.Key] = otherTask.Value;
         }
     }
     foreach (var prop in other.properties)
     {
         properties.Add(prop);
     }
     foreach (var imp in other.imports)
     {
         imports.Add(imp);
     }
 }
		void QueueInference ()
		{
			var doc = this.CU as XmlParsedDocument;
			if (doc == null || doc.XDocument == null || inferenceQueued)
				return;
			if (inferredCompletionData != null) {
				if ((doc.LastWriteTimeUtc - inferredCompletionData.TimeStampUtc).TotalSeconds < 5)
					return;
			}
			inferenceQueued = true;
			ThreadPool.QueueUserWorkItem (delegate {
				try {
					inferredCompletionData = MSBuildResolveContext.Create (doc, inferredCompletionData);
					inferenceQueued = false;
				} catch (Exception ex) {
					LoggingService.LogInternalError ("Unhandled error in XML inference", ex);
				}
			});
		}
		void Merge (MSBuildResolveContext other)
		{
			foreach (var otherItem in other.items) {
				HashSet<string> item;
				if (items.TryGetValue (otherItem.Key, out item)) {
					foreach (var att in otherItem.Value)
						item.Add (att);
				} else {
					items [otherItem.Key] = otherItem.Value;
				}
			}
			foreach (var otherTask in other.tasks) {
				HashSet<string> task;
				if (tasks.TryGetValue (otherTask.Key, out task)) {
					foreach (var att in otherTask.Value)
						task.Add (att);
				} else {
					tasks [otherTask.Key] = otherTask.Value;
				}
			}
			foreach (var prop in other.properties) {
				properties.Add (prop);
			}
			foreach (var imp in other.imports) {
				imports.Add (imp);
			}
		}