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); } }
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); } }
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 }; }
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); } }