Ejemplo n.º 1
0
        public static void FindReferences(Func <MSBuildReferenceCollector> createCollector, MSBuildRootDocument doc)
        {
            var monitor = IdeApp.Workbench.ProgressMonitors.GetSearchProgressMonitor(true, true);

            var tasks = new List <Task> ();

            foreach (var import in doc.GetDescendentImports())
            {
                if (!import.IsResolved || !File.Exists(import.Filename))
                {
                    continue;
                }
                tasks.Add(Task.Run(() => {
                    try {
                        var xmlParser = new XmlParser(new XmlRootState(), true);
                        var textDoc   = TextEditorFactory.CreateNewDocument(import.Filename, MSBuildTextEditorExtension.MSBuildMimeType);
                        xmlParser.Parse(textDoc.CreateReader());
                        var xdoc = xmlParser.Nodes.GetRoot();
                        FindReferences(createCollector(), monitor, import.Filename, xdoc, textDoc, doc);
                    } catch (Exception ex) {
                        monitor.ReportError($"Error searching file {Path.GetFileName (import.Filename)}", ex);
                        LoggingService.LogError($"Error searching MSBuild file {import.Filename}", ex);
                    }
                }));
            }

            tasks.Add(Task.Run(() => {
                try {
                    var textDoc = TextEditorFactory.CreateNewDocument(doc.Text, doc.Filename, MSBuildTextEditorExtension.MSBuildMimeType);
                    FindReferences(createCollector(), monitor, doc.Filename, doc.XDocument, textDoc, doc);
                } catch (Exception ex) {
                    monitor.ReportError($"Error searching file {Path.GetFileName (doc.Filename)}", ex);
                    LoggingService.LogError($"Error searching MSBuild file {doc.Filename}", ex);
                }
            }));

            Task.WhenAll(tasks).ContinueWith(t => monitor?.Dispose());
        }