linter
linter copied to clipboard
A lint for shadowing members?
As an extension to https://www.dartlang.org/guides/language/effective-dart/usage#dont-use-this-when-not-needed-to-avoid-shadowing
Would it make sense to add a new lint type for (potentially unintentionally) shadowing an inherited member?
class A {
@protected
int get stuff => ... blah ...;
}
class B extends A {
[either] int stuff = ... blah ...;
[1000 lines later]
void someMethod() {
[or] int stuff = ... blah ...;
int thingy = stuff; // I thought I was getting super.stuff
}
}
IMHO that one just shouldn't be allowed. It's this case I think we need a lint for:
class A {
@protected
int get stuff => ... blah ...;
}
class B extends A {
void someMethod() {
int stuff;
// 10 lines later
int thingy = stuff; // I thought I was getting super.stuff
}
}
...which happens in particular when you renamed A.stuff and prior to that it didn't get shadowed by the local variable.
cc @a14n
I made a rule avoid_shadowing available in https://github.com/a14n/linter/tree/avoid_shadowing branch.
The rule is perhaps a little too aggressive. It adds a lint if there's already a similar name visible (see test).
On Flutter I get 155 lints:
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/examples/layers/widgets/gestures.dart#L36
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/examples/layers/widgets/sectors.dart#L34
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/examples/layers/widgets/custom_render_box.dart#L33
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/examples/layers/rendering/src/sector_layout.dart#L171
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/examples/layers/raw/canvas.dart#L25
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/examples/stocks/lib/stock_arrow.dart#L17
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/devicelab/lib/framework/adb.dart#L385
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/tools/dartdoc.dart#L68
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/manual_tests/material_arc.dart#L233
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/manual_tests/material_arc.dart#L71
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/manual_tests/material_arc.dart#L245
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/manual_tests/material_arc.dart#L58
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/manual_tests/drag_and_drop.dart#L161
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/dev/manual_tests/overlay_geometry.dart#L34
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/test/devfs_test.dart#L416
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/application_package.dart#L83
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/application_package.dart#L112
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/application_package.dart#L180
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/application_package.dart#L163
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/base/version.dart#L54
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/base/version.dart#L56
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/base/version.dart#L55
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/base/version.dart#L67
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/ios/devices.dart#L118
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/ios/devices.dart#L101
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/ios/devices.dart#L108
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/doctor.dart#L392
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/doctor.dart#L323
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/doctor.dart#L399
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/doctor.dart#L431
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/doctor.dart#L391
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/plugins.dart#L22
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/plugins.dart#L21
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/commands/create.dart#L114
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/commands/run.dart#L190
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/commands/run.dart#L265
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart#L179
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart#L188
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/android/android_studio.dart#L83
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/android/android_studio.dart#L283
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/android/android_studio.dart#L256
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/android/android_studio.dart#L71
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/version.dart#L185
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/vmservice.dart#L255
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/vmservice.dart#L586
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_tools/lib/src/vmservice.dart#L574
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_driver/lib/src/find.dart#L191
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_driver/lib/src/find.dart#L190
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_driver/lib/src/find.dart#L95
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_test/lib/src/widget_tester.dart#L307
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_test/lib/src/binding.dart#L994
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_test/lib/src/controller.dart#L461
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter_test/lib/src/controller.dart#L471
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/test/material/material_test.dart#L44
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/switch.dart#L356
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/progress_indicator.dart#L412
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/progress_indicator.dart#L234
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/progress_indicator.dart#L89
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/input_decorator.dart#L344
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/tabs.dart#L624
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/tabs.dart#L619
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/checkbox.dart#L200
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/checkbox.dart#L183
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/bottom_navigation_bar.dart#L570
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/slider.dart#L483
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/slider.dart#L451
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/time_picker.dart#L90
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/mergeable_material.dart#L677
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/text_selection.dart#L134
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/text_selection.dart#L71
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/material/radio.dart#L199
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/overscroll_indicator.dart#L427
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/semantics_debugger.dart#L312
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/scroll_physics.dart#L73
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/scroll_physics.dart#L131
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/basic.dart#L3156
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/basic.dart#L2851
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/gesture_detector.dart#L400
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/overlay.dart#L565
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/scroll_position.dart#L223
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/heroes.dart#L111
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/pages.dart#L33
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/framework.dart#L4058
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/framework.dart#L4107
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/framework.dart#L4114
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/framework.dart#L2696
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/framework.dart#L4122
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/framework.dart#L4071
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/layout_builder.dart#L145
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/layout_builder.dart#L132
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/page_view.dart#L58
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/page_view.dart#L72
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/page_view.dart#L244
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/page_view.dart#L83
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/widgets/page_view.dart#L188
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/painting/box_painter.dart#L471
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/painting/box_painter.dart#L453
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/painting/box_painter.dart#L1313
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/painting/box_painter.dart#L1273
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/painting/box_painter.dart#L369
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/foundation/assertions.dart#L250
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/foundation/assertions.dart#L218
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_padding.dart#L135
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_padding.dart#L133
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_padding.dart#L134
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_padding.dart#L132
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/viewport.dart#L351
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/viewport.dart#L243
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/viewport.dart#L250
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/viewport.dart#L1111
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/editable.dart#L399
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/editable.dart#L393
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/wrap.dart#L516
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/wrap.dart#L232
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/wrap.dart#L515
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/wrap.dart#L517
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/wrap.dart#L264
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/wrap.dart#L434
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart#L111
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/paragraph.dart#L279
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/paragraph.dart#L260
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_grid.dart#L488
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_persistent_header.dart#L328
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_persistent_header.dart#L286
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_persistent_header.dart#L238
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_persistent_header.dart#L269
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_persistent_header.dart#L329
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_persistent_header.dart#L206
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/box.dart#L451
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/box.dart#L1356
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/box.dart#L452
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/box.dart#L1459
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/box.dart#L1923
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/box.dart#L1938
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/box.dart#L1975
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/table.dart#L1248
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/table.dart#L1263
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart#L185
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/sliver.dart#L1059
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/object.dart#L1654
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/object.dart#L1780
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/object.dart#L2118
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/object.dart#L2038
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/object.dart#L1404
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/object.dart#L2047
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/proxy_box.dart#L272
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/semantics.dart#L510
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/block.dart#L70
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/rendering/shifted_box.dart#L317
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/cupertino/activity_indicator.dart#L96
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/cupertino/switch.dart#L367
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/cupertino/dialog.dart#L272
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/cupertino/thumb_painter.dart#L38
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/cupertino/slider.dart#L310
- https://github.com/flutter/flutter/blob/7b0b5c5760eaa0279782c1fa061b3d7a7acf2ba9/packages/flutter/lib/src/cupertino/slider.dart#L301
Randomly clicked on a few. They all look reasonable. Perhaps for an extra level of leniency initially, we can omit local variables shadowing instance methods. Hopefully in those cases if a function is passed where it's expecting something else, it would crash soon enough anyway.
Yeah, shadowing instance methods is probably ok.
Actually I clicked on a few more and none of those were methods so maybe that's not helpful.
I wonder what the right heuristic is. Having a local variable called Size that overrides the instance field "size" is fine. Having a local variable "widget" that overrides the instance field "widget" is not... but why not?
Similarly I had the mixed feeling about the lines linted.
However I can imagine some people happy with this rule as it is today. If I look at Checkstyle in the Java world there's a HiddenFieldCheck that has a similar heuristic (that also applies to the parameter names - I should perhaps add their checkings to the rule)
I just ran into a case today where this would have helped during a refactor, +1 to the lint.
My specific case was shadowing an instance field with a local variable on accident.
@a14n curious if there has been any progress on this?
@jakemac53 I just opened #872 to add an avoid_shadowing rule. It would be great if you can run this ne rule on your project and see if it is fine or if you see some pattern to customize.
Running it on flutter lints the following lines:
- dev/bots/analyze-sample-code.dart, line 212, col 24
- dev/tools/dartdoc.dart, line 108, col 22
- dev/devicelab/lib/framework/adb.dart, line 386, col 16
- examples/layers/widgets/sectors.dart, line 34, col 18
- examples/catalog/bin/sample_page.dart, line 198, col 28
- packages/flutter/test/material/user_accounts_drawer_header_test.dart, line 313, col 15
- packages/flutter/test/material/user_accounts_drawer_header_test.dart, line 202, col 15
- packages/flutter/test/material/time_picker_test.dart, line 547, col 24
- packages/flutter/test/foundation/diagnostics_test.dart, line 26, col 33
- packages/flutter/test/widgets/linked_scroll_view_test.dart, line 188, col 32
- packages/flutter/test/widgets/linked_scroll_view_test.dart, line 153, col 20
- packages/flutter/test/widgets/linked_scroll_view_test.dart, line 163, col 20
- packages/flutter/lib/src/material/animated_icons/animated_icons.dart, line 106, col 25
- packages/flutter/lib/src/material/tabs.dart, line 795, col 21
- packages/flutter/lib/src/material/tabs.dart, line 790, col 21
- packages/flutter/lib/src/material/slider.dart, line 651, col 17
- packages/flutter/lib/src/material/slider.dart, line 602, col 18
- packages/flutter/lib/src/material/time_picker.dart, line 1497, col 33
- packages/flutter/lib/src/material/checkbox.dart, line 207, col 20
- packages/flutter/lib/src/material/input_decorator.dart, line 1181, col 27
- packages/flutter/lib/src/material/input_decorator.dart, line 1075, col 27
- packages/flutter/lib/src/painting/decoration_image.dart, line 417, col 18
- packages/flutter/lib/src/rendering/box.dart, line 1606, col 26
- packages/flutter/lib/src/rendering/box.dart, line 1449, col 26
- packages/flutter/lib/src/rendering/box.dart, line 527, col 18
- packages/flutter/lib/src/rendering/box.dart, line 526, col 18
- packages/flutter/lib/src/rendering/wrap.dart, line 691, col 17
- packages/flutter/lib/src/rendering/wrap.dart, line 599, col 18
- packages/flutter/lib/src/rendering/wrap.dart, line 690, col 20
- packages/flutter/lib/src/rendering/wrap.dart, line 390, col 9
- packages/flutter/lib/src/rendering/wrap.dart, line 422, col 9
- packages/flutter/lib/src/rendering/wrap.dart, line 600, col 18
- packages/flutter/lib/src/rendering/wrap.dart, line 689, col 20
- packages/flutter/lib/src/rendering/wrap.dart, line 606, col 9
- packages/flutter/lib/src/rendering/sliver_fixed_extent_list.dart, line 111, col 18
- packages/flutter/lib/src/rendering/table.dart, line 1156, col 30
- packages/flutter/lib/src/rendering/table.dart, line 1157, col 30
- packages/flutter/lib/src/rendering/table.dart, line 993, col 15
- packages/flutter/lib/src/rendering/table.dart, line 992, col 15
- packages/flutter/lib/src/rendering/sliver_padding.dart, line 172, col 18
- packages/flutter/lib/src/rendering/sliver_padding.dart, line 170, col 18
- packages/flutter/lib/src/rendering/sliver_padding.dart, line 173, col 18
- packages/flutter/lib/src/rendering/sliver_padding.dart, line 171, col 18
- packages/flutter/lib/src/rendering/object.dart, line 1793, col 26
- packages/flutter/lib/src/rendering/object.dart, line 1123, col 13
- packages/flutter/lib/src/rendering/object.dart, line 1784, col 26
- packages/flutter/lib/src/rendering/object.dart, line 1891, col 26
- packages/flutter/lib/src/rendering/object.dart, line 1379, col 24
- packages/flutter/lib/src/rendering/object.dart, line 1519, col 26
- packages/flutter/lib/src/rendering/paragraph.dart, line 255, col 16
- packages/flutter/lib/src/rendering/viewport.dart, line 354, col 14
- packages/flutter/lib/src/rendering/viewport.dart, line 426, col 18
- packages/flutter/lib/src/rendering/viewport.dart, line 447, col 18
- packages/flutter/lib/src/rendering/viewport.dart, line 1402, col 18
- packages/flutter/lib/src/rendering/viewport.dart, line 473, col 26
- packages/flutter/lib/src/rendering/editable.dart, line 525, col 20
- packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart, line 197, col 17
- packages/flutter/lib/src/rendering/sliver_persistent_header.dart, line 257, col 18
- packages/flutter/lib/src/rendering/sliver_persistent_header.dart, line 517, col 18
- packages/flutter/lib/src/rendering/sliver_persistent_header.dart, line 291, col 18
- packages/flutter/lib/src/rendering/sliver_persistent_header.dart, line 406, col 18
- packages/flutter/lib/src/rendering/sliver_persistent_header.dart, line 516, col 18
- packages/flutter/lib/src/rendering/sliver_persistent_header.dart, line 460, col 18
- packages/flutter/lib/src/semantics/semantics.dart, line 964, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 966, col 19
- packages/flutter/lib/src/semantics/semantics.dart, line 961, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 963, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 962, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 965, col 12
- packages/flutter/lib/src/widgets/pages.dart, line 41, col 31
- packages/flutter/lib/src/widgets/overlay.dart, line 569, col 17
- packages/flutter/lib/src/widgets/page_view.dart, line 104, col 25
- packages/flutter/lib/src/widgets/page_view.dart, line 118, col 25
- packages/flutter/lib/src/widgets/page_view.dart, line 320, col 21
- packages/flutter/lib/src/widgets/page_view.dart, line 131, col 25
- packages/flutter/lib/src/widgets/page_view.dart, line 256, col 18
- packages/flutter/lib/src/widgets/framework.dart, line 4666, col 92
- packages/flutter/lib/src/widgets/framework.dart, line 4658, col 92
- packages/flutter/lib/src/widgets/framework.dart, line 4600, col 52
- packages/flutter/lib/src/widgets/framework.dart, line 4614, col 52
- packages/flutter/lib/src/widgets/framework.dart, line 4650, col 92
- packages/flutter/lib/src/widgets/framework.dart, line 3084, col 24
- packages/flutter/lib/src/widgets/layout_builder.dart, line 143, col 32
- packages/flutter/lib/src/widgets/layout_builder.dart, line 129, col 52
- packages/flutter/lib/src/widgets/icon.dart, line 118, col 25
- packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart, line 188, col 32
- packages/flutter/lib/src/widgets/gesture_detector.dart, line 539, col 33
- packages/flutter/lib/src/widgets/scroll_physics.dart, line 296, col 21
- packages/flutter/lib/src/widgets/scroll_physics.dart, line 395, col 21
- packages/flutter_driver/test/src/extension_test.dart, line 66, col 21
- packages/flutter_test/lib/src/widget_tester.dart, line 250, col 28
- packages/flutter_tools/test/protocol_discovery_test.dart, line 153, col 33
- packages/flutter_tools/test/protocol_discovery_test.dart, line 117, col 33
- packages/flutter_tools/test/protocol_discovery_test.dart, line 116, col 35
- packages/flutter_tools/test/protocol_discovery_test.dart, line 152, col 35
- packages/flutter_tools/test/protocol_discovery_test.dart, line 135, col 33
- packages/flutter_tools/test/protocol_discovery_test.dart, line 134, col 35
- packages/flutter_tools/test/devfs_test.dart, line 479, col 18
- packages/flutter_tools/test/base/build_test.dart, line 431, col 30
- packages/flutter_tools/test/base/build_test.dart, line 477, col 34
- packages/flutter_tools/test/commands/analyze_once_test.dart, line 147, col 23
- packages/flutter_tools/test/ios/mac_test.dart, line 59, col 26
- packages/flutter_tools/lib/src/device.dart, line 147, col 30
- packages/flutter_tools/lib/src/flutter_manifest.dart, line 70, col 22
- packages/flutter_tools/lib/src/flutter_manifest.dart, line 133, col 32
- packages/flutter_tools/lib/src/vmservice.dart, line 1063, col 12
- packages/flutter_tools/lib/src/vmservice.dart, line 1064, col 26
- packages/flutter_tools/lib/src/vmservice.dart, line 674, col 17
- packages/flutter_tools/lib/src/vmservice.dart, line 662, col 18
- packages/flutter_tools/lib/src/version.dart, line 237, col 20
- packages/flutter_tools/lib/src/doctor.dart, line 323, col 21
- packages/flutter_tools/lib/src/commands/create.dart, line 198, col 20
- packages/flutter_tools/lib/src/commands/create.dart, line 176, col 20
- packages/flutter_tools/lib/src/commands/run.dart, line 305, col 20
- packages/flutter_tools/lib/src/commands/fuchsia_reload.dart, line 359, col 18
- packages/flutter_tools/lib/src/commands/fuchsia_reload.dart, line 252, col 18
- packages/flutter_tools/lib/src/commands/fuchsia_reload.dart, line 375, col 38
- packages/flutter_tools/lib/src/protocol_discovery.dart, line 92, col 11
- packages/flutter_tools/lib/src/protocol_discovery.dart, line 68, col 9
- packages/flutter_tools/lib/src/android/android_studio.dart, line 226, col 18
- packages/flutter_tools/lib/src/cache.dart, line 470, col 22
@Hixie @xster does the results look good to you?
I just looked at a couple of places and had some half-baked thoughts.
I found several lints for code similar to the following:
final double currentTheta = this.currentTheta;
Seems like a fairly common pattern used to avoid invoking a potentially expensive method multiple times when the author is confident that the result of the invoked method won't change during the invocation of the containing method. Perhaps the lint should allow the shadowing if the local name is initialized by invoking the shadowed name.
final Version version = new Version.parse(versionText);
It's also fairly common (though not necessarily good practice) to given variables names that are the same as the type of the variable. Perhaps the lint should allow this pattern as well.
Finally, I wonder whether users really care about following this rule in test code, or whether this rule should limit itself to production code.
Having a local variable called "size" that overrides the instance field "size" is fine. Having a local variable "widget" that overrides the instance field "widget" is not... but why not?
I can think of a couple of possible reasons, though I won't pretend to know which if any are valid.
First, it's possible that some names, such as "size", "length", and "name", are generic enough and common enough that we just expect them to be used as local variable names even when they are also used as member names. Having that expectation might make it easier for us to deal with the cognitive load from shadowing. On the other hand, a name like "widget", while both generic and common, has a specific enough meaning in this context that perhaps it negates that expectation.
Another possibility is that it has less to do with the name and more to do with the perceived complexity of the type of the variable. Perhaps we deal better with shadowing simple types than we do with shadowing complex types.
Perhaps the lint should allow the shadowing if the local name is initialized by invoking the shadowed name.
I think we should allow this.
With the exclusion pattern var x = this.x; Flutter has the 82 below lints (121 without the pattern).
- dev/bots/analyze-sample-code.dart, line 212, col 24
- dev/tools/dartdoc.dart, line 108, col 22
- dev/devicelab/lib/framework/adb.dart, line 386, col 16
- examples/catalog/bin/sample_page.dart, line 198, col 28
- packages/flutter/test/material/user_accounts_drawer_header_test.dart, line 313, col 15
- packages/flutter/test/material/user_accounts_drawer_header_test.dart, line 202, col 15
- packages/flutter/test/material/time_picker_test.dart, line 547, col 24
- packages/flutter/test/foundation/diagnostics_test.dart, line 26, col 33
- packages/flutter/test/widgets/linked_scroll_view_test.dart, line 153, col 20
- packages/flutter/test/widgets/linked_scroll_view_test.dart, line 163, col 20
- packages/flutter/lib/src/material/animated_icons/animated_icons.dart, line 106, col 25
- packages/flutter/lib/src/material/tabs.dart, line 795, col 21
- packages/flutter/lib/src/material/tabs.dart, line 790, col 21
- packages/flutter/lib/src/material/slider.dart, line 602, col 18
- packages/flutter/lib/src/material/time_picker.dart, line 1497, col 33
- packages/flutter/lib/src/material/checkbox.dart, line 207, col 20
- packages/flutter/lib/src/material/input_decorator.dart, line 1181, col 27
- packages/flutter/lib/src/material/input_decorator.dart, line 1075, col 27
- packages/flutter/lib/src/painting/decoration_image.dart, line 417, col 18
- packages/flutter/lib/src/rendering/box.dart, line 527, col 18
- packages/flutter/lib/src/rendering/box.dart, line 526, col 18
- packages/flutter/lib/src/rendering/wrap.dart, line 691, col 17
- packages/flutter/lib/src/rendering/wrap.dart, line 690, col 20
- packages/flutter/lib/src/rendering/wrap.dart, line 390, col 9
- packages/flutter/lib/src/rendering/wrap.dart, line 422, col 9
- packages/flutter/lib/src/rendering/wrap.dart, line 689, col 20
- packages/flutter/lib/src/rendering/wrap.dart, line 606, col 9
- packages/flutter/lib/src/rendering/table.dart, line 1156, col 30
- packages/flutter/lib/src/rendering/table.dart, line 1157, col 30
- packages/flutter/lib/src/rendering/object.dart, line 1123, col 13
- packages/flutter/lib/src/rendering/paragraph.dart, line 255, col 16
- packages/flutter/lib/src/rendering/viewport.dart, line 354, col 14
- packages/flutter/lib/src/rendering/viewport.dart, line 426, col 18
- packages/flutter/lib/src/rendering/viewport.dart, line 447, col 18
- packages/flutter/lib/src/rendering/viewport.dart, line 1402, col 18
- packages/flutter/lib/src/rendering/viewport.dart, line 473, col 26
- packages/flutter/lib/src/rendering/editable.dart, line 525, col 20
- packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart, line 197, col 17
- packages/flutter/lib/src/semantics/semantics.dart, line 964, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 966, col 19
- packages/flutter/lib/src/semantics/semantics.dart, line 961, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 963, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 962, col 12
- packages/flutter/lib/src/semantics/semantics.dart, line 965, col 12
- packages/flutter/lib/src/widgets/pages.dart, line 41, col 31
- packages/flutter/lib/src/widgets/overlay.dart, line 569, col 17
- packages/flutter/lib/src/widgets/page_view.dart, line 256, col 18
- packages/flutter/lib/src/widgets/framework.dart, line 3084, col 24
- packages/flutter/lib/src/widgets/icon.dart, line 118, col 25
- packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart, line 188, col 32
- packages/flutter/lib/src/widgets/gesture_detector.dart, line 539, col 33
- packages/flutter_driver/test/src/extension_test.dart, line 66, col 21
- packages/flutter_tools/test/protocol_discovery_test.dart, line 153, col 33
- packages/flutter_tools/test/protocol_discovery_test.dart, line 117, col 33
- packages/flutter_tools/test/protocol_discovery_test.dart, line 116, col 35
- packages/flutter_tools/test/protocol_discovery_test.dart, line 152, col 35
- packages/flutter_tools/test/protocol_discovery_test.dart, line 135, col 33
- packages/flutter_tools/test/protocol_discovery_test.dart, line 134, col 35
- packages/flutter_tools/test/devfs_test.dart, line 479, col 18
- packages/flutter_tools/test/base/build_test.dart, line 431, col 30
- packages/flutter_tools/test/base/build_test.dart, line 477, col 34
- packages/flutter_tools/test/commands/analyze_once_test.dart, line 147, col 23
- packages/flutter_tools/test/ios/mac_test.dart, line 59, col 26
- packages/flutter_tools/lib/src/device.dart, line 147, col 30
- packages/flutter_tools/lib/src/flutter_manifest.dart, line 70, col 22
- packages/flutter_tools/lib/src/flutter_manifest.dart, line 133, col 32
- packages/flutter_tools/lib/src/vmservice.dart, line 1063, col 12
- packages/flutter_tools/lib/src/vmservice.dart, line 1064, col 26
- packages/flutter_tools/lib/src/vmservice.dart, line 674, col 17
- packages/flutter_tools/lib/src/vmservice.dart, line 662, col 18
- packages/flutter_tools/lib/src/version.dart, line 237, col 20
- packages/flutter_tools/lib/src/doctor.dart, line 323, col 21
- packages/flutter_tools/lib/src/commands/create.dart, line 198, col 20
- packages/flutter_tools/lib/src/commands/create.dart, line 176, col 20
- packages/flutter_tools/lib/src/commands/run.dart, line 305, col 20
- packages/flutter_tools/lib/src/commands/fuchsia_reload.dart, line 359, col 18
- packages/flutter_tools/lib/src/commands/fuchsia_reload.dart, line 252, col 18
- packages/flutter_tools/lib/src/commands/fuchsia_reload.dart, line 375, col 38
- packages/flutter_tools/lib/src/protocol_discovery.dart, line 92, col 11
- packages/flutter_tools/lib/src/protocol_discovery.dart, line 68, col 9
- packages/flutter_tools/lib/src/android/android_studio.dart, line 226, col 18
- packages/flutter_tools/lib/src/cache.dart, line 470, col 22
Another pattern that we should allow:
String get someValue {
final someValue = new StringBuffer();
...
return '$someValue';
}
So we should allow shadowing a property inside the implementation of that property.
+1 for this feature. It would be useful in certain instances where code has been refactored.
e.g. https://github.com/dart-lang/language/issues/737
Does this include closure variable shadowing? I just found a nasty bug that looks something like this (identifier names have been changed to protect their identities):
void prepareDeliciousMeal(Fridge f) {
final e = f.getSausage();
// ... more code ...
final ingredients = f.everything
.where((e) => e.goesWellWith.contains(e.id));
cook(ingredients);
}
If this is not the bug for this, just let me know, I'll create another one.