Description
I'd like a new class in the meta package, SideEffects, and a new top-level const instance of that class, sideEffects.
This fellow could be used to annotate a getter [1], indicating when a getter has side effects. Any static analysis rules (including lint rules), can then be written to "safely" assume that any property access or prefixed identifier has no side effects. I say "safely" because any time a confused developer sees a static analysis report and says "oh that's not right at all," they can add this @sideEffects
annotation to a getter, which the rule can use to not generate false positive reports.
For example:
class A {
@sideEffects
B get b {
print('b was gotten');
return B();
}
}
class B {
int c, d;
}
void f() {
if (a.b.c == null) {
a.b.c = 7; // triggers a prefer_conditional_assignment lint report.
}
a.b
..c = 1
..d = 2;
a.b.c = 3; // triggers a cascade_invocations lint report.
a.b; // triggers unnecessary_statement lint report.
a.b.c = 7;
return a.b.c; // triggers a join_return_with_assignment lint report.
}
Each of these four lint reports are incorrect, as get A.b
has side effects. We've seen real code in, e.g. caching modules that have to ignore these reports.
[1] why just a getter? Meh, I'd be happy to open this up to more node types, but I've only thought of uses for getters for now.