-
Notifications
You must be signed in to change notification settings - Fork 58
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FED-194 Fully implement hooks exhaustive dependencies diagnostic, add tests #788
Merged
Merged
Changes from all commits
Commits
Show all changes
206 commits
Select commit
Hold shift + click to select a range
8f48ed2
Add test cases
greglittlefield-wf 3b3ee9d
Add test cases and tool for porting them
greglittlefield-wf 5654644
Handle a few more ccases
greglittlefield-wf 2f1a8f9
Write output
greglittlefield-wf fc344aa
Handle adjacent commas in lists
greglittlefield-wf 6ada50b
Wire up exhaustive deps tests
greglittlefield-wf 13845df
Add missing dependency
greglittlefield-wf 34b7ff6
Merge remote-tracking branch 'origin/analyzer-plugin-jam-base' into e…
greglittlefield-wf 5410c1a
Enable exhaustive deps diagnostic
greglittlefield-wf d793eca
More test case fixes
greglittlefield-wf 12ce453
Fix exhaustive deps not using correct ancestor function
greglittlefield-wf e210366
Tweak tests
greglittlefield-wf 065f762
Fix expectation
greglittlefield-wf de1f6ea
Filter over_react_debug_analyzer_plugin_helper by default
greglittlefield-wf 46ac338
Handle nested function components in porting logic
greglittlefield-wf 343df5d
Disable noisy lint
greglittlefield-wf a97c5f1
Fix some more tests
greglittlefield-wf bdf5a3f
Add null safety migration hints
greglittlefield-wf f536046
Apply null safety migration to exhaustive deps diagnostic
greglittlefield-wf ef52f99
Fix WeakMap issues after null safety migration
greglittlefield-wf 57be6ee
Fix simple warnings after migration
greglittlefield-wf 0908423
Fix link
greglittlefield-wf 6b1f3b6
Fix dead code involving null checks
greglittlefield-wf 6720714
Clean up some minor non-null assertions
greglittlefield-wf 86698d6
Consolidate some non-null assertions
greglittlefield-wf b40cc1e
Fix WeakSet nullability
greglittlefield-wf 49c18f7
Fix memoization null safety
greglittlefield-wf fe93dc1
Clean up some non-null assertions and null checks
greglittlefield-wf 5303705
Clean up more null checks and non-null assertions
greglittlefield-wf 36db93f
Fix test setup
greglittlefield-wf baa2351
Fix unnecessary import
greglittlefield-wf ff8694a
Don't assume we're always inside a function component or hook
greglittlefield-wf 9a045e5
Merge remote-tracking branch 'origin/analyzer-plugin-jam-base' into e…
greglittlefield-wf 9103da3
Format
greglittlefield-wf 0ee37dc
Manually complete port of some cases, remove some cases that can't oc…
greglittlefield-wf 6c3d69c
Fix more test cases
greglittlefield-wf 7a0b860
More fixes
greglittlefield-wf b65a23d
Fix isDeclaredInPureScope when not inside a function component or hook
greglittlefield-wf bf55e8b
Fix more cases
greglittlefield-wf ffba909
Fix most of the rest of the failures
greglittlefield-wf bf2f571
Remove hoisting case not valid in Dart
greglittlefield-wf b4e8bfa
Merge remote-tracking branch 'origin/master' into exhaustive-deps-tests
greglittlefield-wf 657c5f4
Fix stable hook tearoff check
greglittlefield-wf 5f74874
Remove test cases not applicable in Dart
greglittlefield-wf 8b439f7
Format test cases
greglittlefield-wf 9dd331e
Unindent test cases for diffing
greglittlefield-wf 3e44753
Revert "Unindent test cases for diffing"
greglittlefield-wf f82f697
Prep test cases for diffing
greglittlefield-wf 2c92f2a
Add trailing commas for better diffing
greglittlefield-wf af24a02
Bring over comments
greglittlefield-wf 43018ff
Commit utilities for re-porting code with minimal diffs to allow for …
greglittlefield-wf fd9b7df
Update consuming test
greglittlefield-wf 2f199c5
Remove JS test cases and code porting tooling
greglittlefield-wf 9d3d321
Fix test cases, simplify error ignoring logic
greglittlefield-wf cc6e00a
Format
greglittlefield-wf 7d8400c
Remove invalid test case
greglittlefield-wf e6e6f70
Fix logic around ref.current checks
greglittlefield-wf 334c562
Clean up other places where we weren't handling PrefixedIdentifier
greglittlefield-wf 02263d0
First stab at tests for expected error cases
greglittlefield-wf 59611ed
Remove some invalid cases
greglittlefield-wf 7ce1b89
Finish porting extra warning message content
greglittlefield-wf 4e1efb5
Commit forgotten test base changes
greglittlefield-wf 450a816
Clean up and finish porting logic for literal/constant dependencies
greglittlefield-wf 5a90a0c
Fix up some test cases
greglittlefield-wf 2c6c7f7
Replace usages of "array" in error messages with "list"
greglittlefield-wf 515c0d4
Reinstate missing deps tests
greglittlefield-wf 97e7863
Fix typo in message
greglittlefield-wf c9ba659
Fix some more test cases
greglittlefield-wf a47688e
Leave out preamble in test failures
greglittlefield-wf d41134f
Fix more test cases
greglittlefield-wf 30d436d
Don't let useState's generic parameter get inferred as `Null`
greglittlefield-wf e2243df
Fix raw code being wrapped
greglittlefield-wf d0600d8
Parse and wire up additional_hooks configuration for exhaustive deps …
greglittlefield-wf e4ae616
Wire up test case configs
greglittlefield-wf 2e5e665
Fix options not being picked up
greglittlefield-wf 283014a
Add note about optionsFile being null unless set up immediately
greglittlefield-wf 20dc478
Some progress on getNodeWithoutReactNamespace
greglittlefield-wf 8de4af0
Progress toward fixing issues with how state.set is treated as a stab…
greglittlefield-wf 418f5a8
Use for-in instead of forEach to enable better type promotion below
greglittlefield-wf a8975e0
Expect exact error messages to avoid false positives when containing …
greglittlefield-wf d588778
Update functional setState messages and expected messages to reflect …
greglittlefield-wf 032e70f
Fix StateHook stable method tracking and recommendation logic
greglittlefield-wf f88944f
DRY up dependencies map code
greglittlefield-wf 4b3cd26
Split out stable hook detection so it can be used in getDependency
greglittlefield-wf df1b38a
Fix message
greglittlefield-wf c1d3cf8
Ignore line numbers in messages in tests
greglittlefield-wf 8ef8909
Fix cascade only running when dependency is not in map
greglittlefield-wf f71c718
Fix some test cases
greglittlefield-wf dc06722
Fix more test cases
greglittlefield-wf 502ca53
Clean up unsupported node type try/catch logic
greglittlefield-wf 7f00348
Fix new MethodInvocation handling in analyzePropertyChain messing wit…
greglittlefield-wf fbf2533
Fix expected error messages
greglittlefield-wf 163b493
Fix local functions declared directly in component/hook not being pic…
greglittlefield-wf 4f7e87e
Fix more test cases
greglittlefield-wf 9b72b43
Fix more test cases
greglittlefield-wf a38a3e8
Fix isUsedOutsideOfHook logic
greglittlefield-wf 9cc9d52
Fix test cases, update expected messages
greglittlefield-wf 8f8a3ac
Fix more test cases and messages
greglittlefield-wf ddf4efe
Format
greglittlefield-wf 116624e
Fix bad depType check using unused string, use constants
greglittlefield-wf c76f4f9
Add fixme
greglittlefield-wf 9815c0c
Format
greglittlefield-wf 7efbafc
Clean up scanForConstructions
greglittlefield-wf db3e2fc
Fix expected messages
greglittlefield-wf 91814b4
Hack together special case error message for callable props
greglittlefield-wf 9ba391c
Fix missing words in messages
greglittlefield-wf f36b60f
Fix test cases
greglittlefield-wf 720cb3b
Fix test cases
greglittlefield-wf 00aa7e2
Pull in other suites, fix test cases
greglittlefield-wf 42d8009
More test case fixes
greglittlefield-wf 3c1b61d
Fix more test cases
greglittlefield-wf 9477019
Fix setStateWithUpdaterWithUpdater error message in edge case
greglittlefield-wf b5b2803
Make exhaustive hooks debugging use a comment flag
greglittlefield-wf 27658f8
First stab at handling function props as their own dependencies
greglittlefield-wf 434461a
Update test case
greglittlefield-wf 3d217dd
Fix complex expressions not being detected
greglittlefield-wf 6b4372d
Fix/remove test cases
greglittlefield-wf d8bd0cd
Move test case to valid set
greglittlefield-wf b00fbea
Clean up hook type checks
greglittlefield-wf 08575d8
Fix reducer hook logic and test case
greglittlefield-wf 9cb0101
Fix inline reducer suggestion case
greglittlefield-wf 0a156ec
Properly detect inline usages of function props, improve message when…
greglittlefield-wf 8b7d088
Fix most of the function prop cases
greglittlefield-wf 00e6021
Refactor/fix callable prop error messages, remove unnecessary depende…
greglittlefield-wf 8ffb5a4
Fix declared in callback check
greglittlefield-wf 923af45
Update expected test case value
greglittlefield-wf befa42b
Remove not-applicable test case
greglittlefield-wf 72addda
Address some fixmes/todos, cleanup
greglittlefield-wf 4ab1a26
Clean up getDependency, usages of getSimpleTargetAndPropertyName
greglittlefield-wf 99df585
Split out reusable utilities
greglittlefield-wf 1edb238
Reorganize reflection-based constant instantiation code
greglittlefield-wf 0b0136f
Split out and simplify prettyString implementation
greglittlefield-wf 13c1f06
Refactor most logic into the diagnostic so that addErrorWithFix can b…
greglittlefield-wf 9634764
Clean up `node` callback function body arg
greglittlefield-wf 9f207e8
First stab at setting up tests for suggestions (fixes), fix test cases
greglittlefield-wf 43284ac
Improve fix expectations, fix issues with multiple errors/fixes on th…
greglittlefield-wf c894645
Fix test cases
greglittlefield-wf b582e99
Fix test cases
greglittlefield-wf 723df4a
Remove function wrapper by default since most cases don't need it
greglittlefield-wf 0f203df
Fix typescript cases expected output
greglittlefield-wf 74e8b7f
Remove old comments
greglittlefield-wf e736615
Add debugging statements for error mapping
greglittlefield-wf 27469bd
Use printOnFailure
greglittlefield-wf c5c8401
Fix mapping ambiguity by not ignoring line numbers in error messages,…
greglittlefield-wf ce5327e
Implement fix for missing dependencies list
greglittlefield-wf 226868c
Cleanup
greglittlefield-wf 2688508
Clean up preamble
greglittlefield-wf d7f9aee
Uncomment most useTransition code
greglittlefield-wf 60e955f
Add debug:over_react_metrics flag to show time spent in diagnostics
greglittlefield-wf 2379d80
Better handling and error message when StateHook is in dependencies list
greglittlefield-wf 399df9b
Improve messages when StateHook is a dependency
greglittlefield-wf 97af0f8
Add test cases for StateHook in the dependency list
greglittlefield-wf 7fd055f
Fix edge cases when StateHook is a dependency
greglittlefield-wf e716660
Add fallback case for when whole hooks are passed as dependencies
greglittlefield-wf f33d63b
Clean up comment
greglittlefield-wf 8745938
Generalize and consolidate StateHook dependency handling into constru…
greglittlefield-wf 3410334
Address some fixmes
greglittlefield-wf f1b3c85
Fix memoized builder invocation showing as an always-changing dep
greglittlefield-wf b610516
Address fixme, add more StateHook dependency test cases
greglittlefield-wf 946f99f
Downgrade FIXME around sub-properties to TODO, update test
greglittlefield-wf b46d6b1
Reorganize hook constants into a class
greglittlefield-wf 907bc06
Address fixmes/todos and clean up logic when hook is a dependency
greglittlefield-wf 2234b46
Handle generic type references properly
greglittlefield-wf f22e911
Clean up fixmes
greglittlefield-wf 2cbf3eb
Address more todos/fixmes
greglittlefield-wf 4518047
Clean up fixmes
greglittlefield-wf c3af85a
Split out lookup functions, clean up lookUpVariable, add tests
greglittlefield-wf 72a9b93
Clean up more todos/fixmes
greglittlefield-wf 58390da
Improve function prop calling test coverage
greglittlefield-wf f5b797d
Add missing test cccase
greglittlefield-wf 49b9a3d
Clean up more fixmes/todos
greglittlefield-wf 4e3875c
Add tests for getNodeWithoutReactNamespace/getReactiveHookCallbackIndex
greglittlefield-wf fe3f518
Remove old test case
greglittlefield-wf 6fcd3e2
Also handle local functions in useCallback quick fix, update tests
greglittlefield-wf 3e4e733
Preserve dependencies list formatting when replacing it, add tests
greglittlefield-wf 46a55da
Replace forEach calls with for-loops
greglittlefield-wf 23503d1
Clean up unused comments and functions, fix typos
greglittlefield-wf 175da0e
Indicate which TODOs were ported over, more consistent formatting
greglittlefield-wf ec7e865
Improve behavior around cascades, add tests
greglittlefield-wf 9c7c64e
Clean up cascade comments
greglittlefield-wf 727e810
Add test cases from FIXMEs
greglittlefield-wf b3eaa84
Fix missing List.length setter in MockSdk
greglittlefield-wf 79d26bd
Fix test case
greglittlefield-wf 9efb442
Fix bad non-null operator
greglittlefield-wf e3e4728
Clean up todo, fix typo
greglittlefield-wf 031fb4b
Mark TODOs ported from JS implementation
greglittlefield-wf 74f7f0b
Add test case
greglittlefield-wf 23d8b8f
Rename test cases file, add attribution
greglittlefield-wf d4ddda7
Document exhaustive deps diagnostic
greglittlefield-wf 6bb0736
Misc cleanup
greglittlefield-wf 0e7695e
Use a single implementation for debug comments, document in README
greglittlefield-wf 00df41e
Clean up PluginOptionsReader
greglittlefield-wf a7bf400
Downgrade fixme
greglittlefield-wf 9645dd0
Fix plugin infos being filtered out in tests
greglittlefield-wf fbaab79
Format
greglittlefield-wf 5a12b43
Simplify WeakMap implementation
greglittlefield-wf a64958e
Cleanup, add doc comments
greglittlefield-wf 5f09a7d
Add exhaustive dependencies playground file
greglittlefield-wf 9adb1ed
Show percentages in diagnostic metrics
greglittlefield-wf e2a2873
Compute debug hint strings only when needed
greglittlefield-wf 967ccc6
Fix typo
greglittlefield-wf b58e5c6
Cleanup
greglittlefield-wf 2f264f3
Add a few more playground cases, add link to ticket
greglittlefield-wf 40d681a
Cleanup, format
greglittlefield-wf 2a33b8f
Adjust exhaustive dependencies names to better align with ESLint
greglittlefield-wf 76baa6b
Add more links, add more info to details section
greglittlefield-wf File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 6 additions & 1 deletion
7
tools/analyzer_plugin/lib/src/analysis_options/plugin_analysis_options.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
37 changes: 18 additions & 19 deletions
37
tools/analyzer_plugin/lib/src/analysis_options/reader.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,31 @@ | ||
import 'package:analyzer/dart/analysis/context_root.dart'; | ||
import 'package:analyzer/dart/analysis/results.dart'; | ||
import 'package:analyzer/file_system/file_system.dart'; | ||
import 'package:over_react_analyzer_plugin/src/analysis_options/plugin_analysis_options.dart'; | ||
import 'package:analyzer/file_system/file_system.dart' as analyzer_fs; | ||
import 'package:over_react_analyzer_plugin/src/analysis_options/parse.dart'; | ||
import 'package:over_react_analyzer_plugin/src/analysis_options/plugin_analysis_options.dart'; | ||
|
||
/// An analysis_options.yaml reader that parses the appropriate analysis_options.yaml file for the given | ||
/// [ResolvedUnitResult] and returns the configuration options for the over react analyzer plugin. | ||
/// An analysis_options.yaml reader that parses the appropriate analysis_options.yaml file | ||
/// and returns the configuration options for the over react analyzer plugin. | ||
/// | ||
/// The reader uses caching to reduce the number of file reads. If a result is given that uses the same | ||
/// analysis_options.yaml as a previous result, the reader will return a cache version. | ||
class AnalysisOptionsReader { | ||
final _cachedAnalysisOptions = <String, PluginAnalysisOptions?>{}; | ||
class PluginOptionsReader { | ||
final _cachedOptions = <String, PluginAnalysisOptions?>{}; | ||
|
||
PluginAnalysisOptions? getAnalysisOptionsForResult(ResolvedUnitResult result) { | ||
final file = result.session.analysisContext.contextRoot.optionsFile; | ||
if (file != null) { | ||
return _getAnalysisOptionForFilePath(file); | ||
} | ||
PluginAnalysisOptions? getOptionsForContextRoot(ContextRoot root) { | ||
final file = root.optionsFile; | ||
if (file == null) return null; | ||
|
||
// There is no analysis_options.yaml, so return null. | ||
return null; | ||
return _getOptionsFromOptionsFile(file); | ||
} | ||
|
||
PluginAnalysisOptions? _getAnalysisOptionForFilePath(File file) { | ||
return _cachedAnalysisOptions.putIfAbsent(file.path, () => _readAnalysisOptionForFilePath(file)); | ||
} | ||
PluginAnalysisOptions? getOptionsForResult(ResolvedUnitResult result) => | ||
getOptionsForContextRoot(result.session.analysisContext.contextRoot); | ||
|
||
PluginAnalysisOptions? _readAnalysisOptionForFilePath(File file) { | ||
final fileContents = file.readAsStringSync(); | ||
return processAnalysisOptionsFile(fileContents); | ||
PluginAnalysisOptions? _getOptionsFromOptionsFile(analyzer_fs.File file) { | ||
return _cachedOptions.putIfAbsent(file.path, () { | ||
if (!file.exists) return null; | ||
return processAnalysisOptionsFile(file.readAsStringSync()); | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This null-check was added since the first arg to
lookUpVariable
was made non-nullable.