/// <summary> /// Parses the specified file on disk. /// </summary> /// <param name="filename"></param> private void EnqueueFile(IProjectEntry projEntry, string filename) { // get the current snapshot from the UI thread EnqueWorker(() => { for (int i = 0; i < 10; i++) { try { if (!File.Exists(filename)) { break; } var cookie = new FileCookie(filename); var reader = new StreamReader( new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete) ); using (reader) { ParseFile(projEntry, filename, reader, cookie); } return; } catch (IOException) { // file being copied, try again... Thread.Sleep(100); } catch (UnauthorizedAccessException) { // file is inaccessible, try again... Thread.Sleep(100); } } IJsProjectEntry pyEntry = projEntry as IJsProjectEntry; if (pyEntry != null) { // failed to parse, keep the UpdateTree calls balanced pyEntry.UpdateTree(null, null); } }); }
internal void ParseFile(IProjectEntry entry, string filename, Stream content, Severity indentationSeverity) { IPythonProjectEntry pyEntry; IExternalProjectEntry externalEntry; TextReader reader = null; ITextSnapshot snapshot = GetOpenSnapshot(entry); string zipFileName = GetZipFileName(entry); string pathInZipFile = GetPathInZipFile(entry); IAnalysisCookie cookie; if (snapshot != null) { cookie = new SnapshotCookie(snapshot); reader = new SnapshotSpanSourceCodeReader(new SnapshotSpan(snapshot, 0, snapshot.Length)); } else if (zipFileName != null) { cookie = new ZipFileCookie(zipFileName, pathInZipFile); } else { cookie = new FileCookie(filename); } if ((pyEntry = entry as IPythonProjectEntry) != null) { PythonAst ast; CollectingErrorSink errorSink; List<TaskProviderItem> commentTasks; if (reader != null) { ParsePythonCode(snapshot, reader, indentationSeverity, out ast, out errorSink, out commentTasks); } else { ParsePythonCode(snapshot, content, indentationSeverity, out ast, out errorSink, out commentTasks); } if (ast != null) { pyEntry.UpdateTree(ast, cookie); } else { // notify that we failed to update the existing analysis pyEntry.UpdateTree(null, null); } // update squiggles for the buffer. snapshot may be null if we // are analyzing a file that is not open UpdateErrorsAndWarnings(entry, snapshot, errorSink, commentTasks); // enqueue analysis of the file if (ast != null) { _analysisQueue.Enqueue(pyEntry, AnalysisPriority.Normal); } } else if ((externalEntry = entry as IExternalProjectEntry) != null) { externalEntry.ParseContent(reader ?? new StreamReader(content), cookie); _analysisQueue.Enqueue(entry, AnalysisPriority.Normal); } }