private void OnNewAnalysis(object sender, EventArgs e) {
            if (!_alwaysCreateSquiggle) {
                var service = _serviceProvider.GetPythonToolsService();
                if (service == null || !service.GeneralOptions.UnresolvedImportWarning) {
                    return;
                }
            }

            var entry = sender as IPythonProjectEntry;
            if (entry == null ||
                string.IsNullOrEmpty(entry.ModuleName) ||
                string.IsNullOrEmpty(entry.FilePath)
            ) {
                return;
            }

            var analysis = entry.Analysis;
            var analyzer = analysis != null ? analysis.ProjectState : null;
            if (analyzer == null) {
                return;
            }

            PythonAst ast;
            IAnalysisCookie cookie;
            entry.GetTreeAndCookie(out ast, out cookie);
            var snapshotCookie = cookie as SnapshotCookie;
            var snapshot = snapshotCookie != null ? snapshotCookie.Snapshot : null;
            if (ast == null || snapshot == null) {
                return;
            }

            var walker = new ImportStatementWalker(entry, analyzer);
            ast.Walk(walker);

            if (walker.Imports.Any()) {
                var f = new TaskProviderItemFactory(snapshot);

                _taskProvider.ReplaceItems(
                    entry,
                    VsProjectAnalyzer.UnresolvedImportMoniker,
                    walker.Imports.Select(t => f.FromUnresolvedImport(
                        _serviceProvider,
                        analyzer.InterpreterFactory as IPythonInterpreterFactoryWithDatabase,
                        t.Item1,
                        t.Item2.GetSpan(ast)
                    )).ToList()
                );
            } else {
                _taskProvider.Clear(entry, VsProjectAnalyzer.UnresolvedImportMoniker);
            }
        }
Exemplo n.º 2
0
        public void UpdateAnalysisDiagnostics(IProjectEntry projectEntry, int version)
        {
            lock (_lock) {
                var diags    = _server.Analyzer.GetDiagnostics(projectEntry);
                var settings = _server.Settings;

                for (var i = 0; i < diags.Count; i++)
                {
                    diags[i].severity = settings.analysis.GetEffectiveSeverity(diags[i].code, diags[i].severity);
                }

                var severity           = settings.analysis.GetEffectiveSeverity(ErrorMessages.UnresolvedImportCode, DiagnosticSeverity.Warning);
                var pythonProjectEntry = projectEntry as IPythonProjectEntry;
                var parse = pythonProjectEntry?.GetCurrentParse();

                // TODO: move this to the normal analysis process
                if (parse != null && severity != DiagnosticSeverity.Unspecified)
                {
                    var walker = new ImportStatementWalker(parse.Tree, pythonProjectEntry, _server.Analyzer, severity);
                    parse.Tree.Walk(walker);
                    diags = diags.Concat(walker.Diagnostics).ToArray();
                }

                if (!diags.Any() && version >= 0)
                {
                    return;
                }

                if (pythonProjectEntry is IDocument doc)
                {
                    if (_lastReportedParseDiagnostics != null)
                    {
                        diags = diags.Concat(_lastReportedParseDiagnostics.SelectMany(d => d.diagnostics)).ToArray();
                    }
                }

                var lastPublishedVersion = _lastReportedAnalysisDiagnostics?.FirstOrDefault()?._version;
                version = version >= 0 ? version : (lastPublishedVersion.HasValue ? lastPublishedVersion.Value : 0);

                _lastReportedAnalysisDiagnostics = new[] { new PublishDiagnosticsEventArgs {
                                                               uri         = pythonProjectEntry.DocumentUri,
                                                               diagnostics = diags,
                                                               _version    = version
                                                           } };

                PublishDiagnostics(_lastReportedAnalysisDiagnostics);
            }
        }
Exemplo n.º 3
0
        private Response GetUnresolvedImports(AP.UnresolvedImportsRequest request) {
            var bufferVersion = GetBufferVersion(request.fileId, request.bufferId);

            AP.UnresolvedImport[] unresolved = Array.Empty<AP.UnresolvedImport>();
            if (bufferVersion != null && bufferVersion.Ast != null) {
                var entry = _projectFiles[request.fileId] as IPythonProjectEntry;

                var walker = new ImportStatementWalker(
                    bufferVersion.Ast,
                    entry,
                    _pyAnalyzer
                );

                bufferVersion.Ast.Walk(walker);
                unresolved = walker.Imports.ToArray();
            }

            return new AP.UnresolvedImportsResponse() {
                unresolved = unresolved,
                version = bufferVersion?.Version ?? -1
            };
        }
Exemplo n.º 4
0
        private void OnNewAnalysis(object sender, EventArgs e)
        {
            if (!_alwaysCreateSquiggle &&
                !_serviceProvider.GetPythonToolsService().GeneralOptions.UnresolvedImportWarning
                )
            {
                return;
            }

            var entry = sender as IPythonProjectEntry;

            if (entry == null ||
                string.IsNullOrEmpty(entry.ModuleName) ||
                string.IsNullOrEmpty(entry.FilePath)
                )
            {
                return;
            }

            var analysis = entry.Analysis;
            var analyzer = analysis != null ? analysis.ProjectState : null;

            if (analyzer == null)
            {
                return;
            }

            PythonAst       ast;
            IAnalysisCookie cookie;

            entry.GetTreeAndCookie(out ast, out cookie);
            var snapshotCookie = cookie as SnapshotCookie;
            var snapshot       = snapshotCookie != null ? snapshotCookie.Snapshot : null;

            if (ast == null || snapshot == null)
            {
                return;
            }

            var walker = new ImportStatementWalker(entry, analyzer);

            ast.Walk(walker);

            if (walker.Imports.Any())
            {
                var f = new TaskProviderItemFactory(snapshot);

                _taskProvider.ReplaceItems(
                    entry,
                    VsProjectAnalyzer.UnresolvedImportMoniker,
                    walker.Imports.Select(t => f.FromUnresolvedImport(
                                              _serviceProvider,
                                              analyzer.InterpreterFactory as IPythonInterpreterFactoryWithDatabase,
                                              t.Item1,
                                              t.Item2.GetSpan(ast)
                                              )).ToList()
                    );
            }
            else
            {
                _taskProvider.Clear(entry, VsProjectAnalyzer.UnresolvedImportMoniker);
            }
        }