예제 #1
0
        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;
            }
        }
예제 #2
0
        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();
                }
            }
        }