private void Parse(CancellationToken cancellationToken) { CollectingErrorSink sink = null; int version; Parser parser; //Log?.Log(TraceEventType.Verbose, $"Parse begins: {Name}"); lock (AnalysisLock) { version = _buffer.Version; var options = new ParserOptions { StubFile = FilePath != null && Path.GetExtension(FilePath).Equals(".pyi", FileSystem.StringComparison) }; if (ModuleType == ModuleType.User) { sink = new CollectingErrorSink(); options.ErrorSink = sink; } parser = Parser.CreateParser(new StringReader(_buffer.Text), Interpreter.LanguageVersion, options); } var ast = parser.ParseFile(); //Log?.Log(TraceEventType.Verbose, $"Parse complete: {Name}"); lock (AnalysisLock) { cancellationToken.ThrowIfCancellationRequested(); if (version != _buffer.Version) { throw new OperationCanceledException(); } _ast = ast; _parseErrors = sink?.Diagnostics ?? Array.Empty <DiagnosticsEntry>(); // Do not report issues with libraries or stubs if (sink != null) { _diagnosticsService?.Replace(Uri, _parseErrors, DiagnosticSource.Parser); } ContentState = State.Parsed; } NewAst?.Invoke(this, EventArgs.Empty); if (ContentState < State.Analyzing) { ContentState = State.Analyzing; var analyzer = Services.GetService <IPythonAnalyzer>(); analyzer.EnqueueDocumentForAnalysis(this, ast, version, _disposeToken.CancellationToken); } lock (AnalysisLock) { _parsingTask = null; } }
private void Parse(CancellationToken cancellationToken) { CollectingErrorSink sink = null; int version; Parser parser; // Log?.Log(TraceEventType.Verbose, $"Parse begins: {Name} ({ModuleType})"); lock (_syncObj) { version = _buffer.Version; var options = new ParserOptions { StubFile = FilePath != null && Path.GetExtension(FilePath).Equals(".pyi", FileSystem.StringComparison) }; if (ModuleType == ModuleType.User) { sink = new CollectingErrorSink(); options.ErrorSink = sink; } parser = Parser.CreateParser(new StringReader(_buffer.Text), Interpreter.LanguageVersion, options); } var ast = parser.ParseFile(Uri); // Log?.Log(TraceEventType.Verbose, $"Parse complete: {Name} ({ModuleType})"); lock (_syncObj) { cancellationToken.ThrowIfCancellationRequested(); if (version != _buffer.Version) { throw new OperationCanceledException(); } // Stored nodes are no longer valid. _astMap.Clear(); _astMap[this] = ast; _parseErrors = sink?.Diagnostics ?? Array.Empty <DiagnosticsEntry>(); // Do not report issues with libraries or stubs if (sink != null) { _diagnosticsService?.Replace(Uri, _parseErrors, DiagnosticSource.Parser); } ContentState = State.Parsed; Analysis = new EmptyAnalysis(Services, this); } NewAst?.Invoke(this, EventArgs.Empty); Analyze(ast, version); lock (_syncObj) { _parsingTask = null; } }
private void Parse(CancellationToken cancellationToken) { var sink = new CollectingErrorSink(); int version; Parser parser; Log?.Log(TraceEventType.Verbose, $"Parse begins: {Name}"); lock (AnalysisLock) { version = _buffer.Version; parser = Parser.CreateParser(new StringReader(_buffer.Text), Interpreter.LanguageVersion, new ParserOptions { StubFile = FilePath != null && Path.GetExtension(FilePath).Equals(".pyi", FileSystem.StringComparison), ErrorSink = sink }); } var ast = parser.ParseFile(); Log?.Log(TraceEventType.Verbose, $"Parse complete: {Name}"); lock (AnalysisLock) { cancellationToken.ThrowIfCancellationRequested(); if (version != _buffer.Version) { throw new OperationCanceledException(); } _ast = ast; _parseErrors = sink.Diagnostics; _parsingTask = null; } NewAst?.Invoke(this, EventArgs.Empty); if ((_options & ModuleLoadOptions.Analyze) == ModuleLoadOptions.Analyze) { Log?.Log(TraceEventType.Verbose, $"Analysis queued: {Name}"); _linkedAnalysisCts?.Dispose(); _linkedAnalysisCts = CancellationTokenSource.CreateLinkedTokenSource(_allProcessingCts.Token, cancellationToken); var analyzer = Services.GetService <IPythonAnalyzer>(); if (ModuleType == ModuleType.User || ModuleType == ModuleType.Library) { analyzer.AnalyzeDocumentDependencyChainAsync(this, _linkedAnalysisCts.Token).DoNotWait(); } else { analyzer.AnalyzeDocumentAsync(this, _linkedAnalysisCts.Token).DoNotWait(); } } }