Skip to content

Analyzer plugins is run several times for the same thing #61490

@jensjoha

Description

@jensjoha

Having instrumented the analyzer for #61489 I noticed that we do the same thing several times.

For my particular case I instrumented _isInLibDir and logged to file whenever it was asked from a specific file (with a single await in it a warning on awaits).

When having my plugin registering a single things as a warning I get this behavior:

Via VSCode, editing a file (adding a dot in a comment) I get 4 visits:

(notice that the line numbers are probably a little off because of the instrumentation I've done):

The first one - which returns true, see #61489 - is called like this:

#0      _isInLibDir (package:analyzer/src/analysis_rule/rule_context.dart:36:33)
#1      RuleContextWithResolvedResults.isInLibDir (package:analyzer/src/analysis_rule/rule_context.dart:136:7)
#2      _Visitor.visitAwaitExpression (package:_model_analysis_plugin/main.dart:59:17)
#3      AwaitExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:1608:50)
#4      AnalysisRuleVisitor._runSubscriptions (package:analyzer/src/lint/linter_visitor.g.dart:1120:14)
#5      AnalysisRuleVisitor.visitAwaitExpression (package:analyzer/src/lint/linter_visitor.g.dart:75:5)
#6      AwaitExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:1608:50)
#7      IfStatementImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12772:16)
#8      AnalysisRuleVisitor.visitIfStatement (package:analyzer/src/lint/linter_visitor.g.dart:498:10)
#9      IfStatementImpl.accept (package:analyzer/src/dart/ast/ast.dart:12767:50)
#10     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:17281:20)
#11     BlockImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1938:16)
#12     AnalysisRuleVisitor.visitBlock (package:analyzer/src/lint/linter_visitor.g.dart:88:10)
#13     BlockImpl.accept (package:analyzer/src/dart/ast/ast.dart:1933:50)
#14     BlockFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1868:11)
#15     AnalysisRuleVisitor.visitBlockFunctionBody (package:analyzer/src/lint/linter_visitor.g.dart:94:10)
#16     BlockFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:1859:50)
#17     FunctionExpressionImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:11122:10)
#18     AnalysisRuleVisitor.visitFunctionExpression (package:analyzer/src/lint/linter_visitor.g.dart:438:10)
#19     FunctionExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:11109:50)
#20     FunctionDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:10895:24)
#21     AnalysisRuleVisitor.visitFunctionDeclaration (package:analyzer/src/lint/linter_visitor.g.dart:426:10)
#22     FunctionDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:10888:50)
#23     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:17281:20)
#24     CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:4024:21)
#25     AnalysisRuleVisitor.visitCompilationUnit (package:analyzer/src/lint/linter_visitor.g.dart:166:10)
#26     CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:4001:50)
#27     LibraryAnalyzer._computeLints (package:analyzer/src/dart/analysis/library_analyzer.dart:441:12)
#28     LibraryAnalyzer._computeDiagnostics (package:analyzer/src/dart/analysis/library_analyzer.dart:358:7)
#29     LibraryAnalyzer.analyze.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:125:7)
#30     OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:150:23)
#31     LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:124:17)
#32     AnalysisDriver._analyzeFileImpl.<anonymous closure>.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1379:13)
#33     OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:150:23)
#34     AnalysisDriver._analyzeFileImpl.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1368:35)
#35     PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:38:15)
#36     AnalysisDriver._analyzeFileImpl (package:analyzer/src/dart/analysis/driver.dart:1325:20)
#37     AnalysisDriver._analyzeFile.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1306:7)
#38     OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:150:23)
#39     AnalysisDriver._analyzeFile (package:analyzer/src/dart/analysis/driver.dart:1305:38)
#40     AnalysisDriver._getResolvedLibrary (package:analyzer/src/dart/analysis/driver.dart:1960:5)
#41     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1208:7)
#42     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2628:24)

where RuleContextWithResolvedResults is created here:

#0      new RuleContextWithResolvedResults (package:analyzer/src/analysis_rule/rule_context.dart:122:30)
#1      LibraryAnalyzer._computeLints (package:analyzer/src/dart/analysis/library_analyzer.dart:409:19)
#2      LibraryAnalyzer._computeDiagnostics (package:analyzer/src/dart/analysis/library_analyzer.dart:358:7)
#3      LibraryAnalyzer.analyze.<anonymous closure> (package:analyzer/src/dart/analysis/library_analyzer.dart:125:7)
#4      OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:150:23)
#5      LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:124:17)
#6      AnalysisDriver._analyzeFileImpl.<anonymous closure>.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1379:13)
#7      OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:150:23)
#8      AnalysisDriver._analyzeFileImpl.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1368:35)
#9      PerformanceLog.run (package:analyzer/src/dart/analysis/performance_logger.dart:38:15)
#10     AnalysisDriver._analyzeFileImpl (package:analyzer/src/dart/analysis/driver.dart:1325:20)
#11     AnalysisDriver._analyzeFile.<anonymous closure> (package:analyzer/src/dart/analysis/driver.dart:1306:7)
#12     OperationPerformanceImpl.run (package:analyzer/src/util/performance/operation_performance.dart:150:23)
#13     AnalysisDriver._analyzeFile (package:analyzer/src/dart/analysis/driver.dart:1305:38)
#14     AnalysisDriver._getResolvedLibrary (package:analyzer/src/dart/analysis/driver.dart:1960:5)
#15     AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1208:7)
#16     AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2628:24)

The second one - which returns false - is called like this:

#0      _isInLibDir (package:analyzer/src/analysis_rule/rule_context.dart:36:33)
#1      RuleContextWithResolvedResults.isInLibDir (package:analyzer/src/analysis_rule/rule_context.dart:136:7)
#2      _Visitor.visitAwaitExpression (package:_model_analysis_plugin/main.dart:59:17)
#3      AwaitExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:1608:50)
#4      AnalysisRuleVisitor._runSubscriptions (package:analyzer/src/lint/linter_visitor.g.dart:1120:14)
#5      AnalysisRuleVisitor.visitAwaitExpression (package:analyzer/src/lint/linter_visitor.g.dart:75:5)
#6      AwaitExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:1608:50)
#7      IfStatementImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12772:16)
#8      AnalysisRuleVisitor.visitIfStatement (package:analyzer/src/lint/linter_visitor.g.dart:498:10)
#9      IfStatementImpl.accept (package:analyzer/src/dart/ast/ast.dart:12767:50)
#10     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:17281:20)
#11     BlockImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1938:16)
#12     AnalysisRuleVisitor.visitBlock (package:analyzer/src/lint/linter_visitor.g.dart:88:10)
#13     BlockImpl.accept (package:analyzer/src/dart/ast/ast.dart:1933:50)
#14     BlockFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1868:11)
#15     AnalysisRuleVisitor.visitBlockFunctionBody (package:analyzer/src/lint/linter_visitor.g.dart:94:10)
#16     BlockFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:1859:50)
#17     FunctionExpressionImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:11122:10)
#18     AnalysisRuleVisitor.visitFunctionExpression (package:analyzer/src/lint/linter_visitor.g.dart:438:10)
#19     FunctionExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:11109:50)
#20     FunctionDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:10895:24)
#21     AnalysisRuleVisitor.visitFunctionDeclaration (package:analyzer/src/lint/linter_visitor.g.dart:426:10)
#22     FunctionDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:10888:50)
#23     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:17281:20)
#24     CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:4024:21)
#25     AnalysisRuleVisitor.visitCompilationUnit (package:analyzer/src/lint/linter_visitor.g.dart:166:10)
#26     CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:4001:50)
#27     PluginServer._computeAnalysisErrors (package:analysis_server_plugin/src/plugin_server.dart:433:26)
<asynchronous suspension>
#28     PluginServer._analyzeLibrary (package:analysis_server_plugin/src/plugin_server.dart:304:32)
<asynchronous suspension>
#29     PluginServer._analyzeLibraries (package:analysis_server_plugin/src/plugin_server.dart:334:7)
<asynchronous suspension>
#30     PluginServer._handleAffectedFiles (package:analysis_server_plugin/src/plugin_server.dart:636:5)
<asynchronous suspension>
#31     PluginServer._handleContentChanged.<anonymous closure> (package:analysis_server_plugin/src/plugin_server.dart:777:9)
<asynchronous suspension>
#32     PluginServer._forAnalysisContexts (package:analysis_server_plugin/src/plugin_server.dart:537:7)
<asynchronous suspension>
#33     PluginServer._handleContentChanged (package:analysis_server_plugin/src/plugin_server.dart:766:7)
<asynchronous suspension>
#34     PluginServer._handleAnalysisUpdateContent (package:analysis_server_plugin/src/plugin_server.dart:724:5)
<asynchronous suspension>
#35     PluginServer._getResponse (package:analysis_server_plugin/src/plugin_server.dart:563:18)
<asynchronous suspension>
#36     PluginServer._handleRequest (package:analysis_server_plugin/src/plugin_server.dart:795:18)
<asynchronous suspension>
#37     PluginServer._handleRequestZoned (package:analysis_server_plugin/src/plugin_server.dart:815:5)
<asynchronous suspension>

where RuleContextWithResolvedResults is created here:

#0      new RuleContextWithResolvedResults (package:analyzer/src/analysis_rule/rule_context.dart:122:30)
#1      PluginServer._computeAnalysisErrors (package:analysis_server_plugin/src/plugin_server.dart:390:19)
<asynchronous suspension>
#2      PluginServer._analyzeLibrary (package:analysis_server_plugin/src/plugin_server.dart:304:32)
<asynchronous suspension>
#3      PluginServer._analyzeLibraries (package:analysis_server_plugin/src/plugin_server.dart:334:7)
<asynchronous suspension>
#4      PluginServer._handleAffectedFiles (package:analysis_server_plugin/src/plugin_server.dart:636:5)
<asynchronous suspension>
#5      PluginServer._handleContentChanged.<anonymous closure> (package:analysis_server_plugin/src/plugin_server.dart:777:9)
<asynchronous suspension>
#6      PluginServer._forAnalysisContexts (package:analysis_server_plugin/src/plugin_server.dart:537:7)
<asynchronous suspension>
#7      PluginServer._handleContentChanged (package:analysis_server_plugin/src/plugin_server.dart:766:7)
<asynchronous suspension>
#8      PluginServer._handleAnalysisUpdateContent (package:analysis_server_plugin/src/plugin_server.dart:724:5)
<asynchronous suspension>
#9      PluginServer._getResponse (package:analysis_server_plugin/src/plugin_server.dart:563:18)
<asynchronous suspension>
#10     PluginServer._handleRequest (package:analysis_server_plugin/src/plugin_server.dart:795:18)
<asynchronous suspension>
#11     PluginServer._handleRequestZoned (package:analysis_server_plugin/src/plugin_server.dart:815:5)
<asynchronous suspension>

The third and forth calls are exactly like the first call.

If moving the cursor in the IDE (VSCode) (say if pressing left on the keyboard) I get 2 such calls (both returning true but no error is reported).

I think it is caused by priority files not being set in the plugin.

(If I instead register it as a lint (and enable the lint) it seems to be only called once on edit (and not at all when moving the cursor around). Package is not set (and isInLibDir returns false because of that).

If it is registered as a lint but not enabled it's not run at all so that's good.)

/cc @srawlins

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3A lower priority bug or feature requestarea-devexpFor issues related to the analysis server, IDE support, linter, `dart fix`, and diagnostic messages.devexp-linterIssues with the analyzer's support for the linter packagetype-enhancementA request for a change that isn't a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions