Description
[Edit 2024: Note that the implicitly induced member as of today will throw rather than invoke noSuchMethod
. This just makes it even more important to introduce the lint as proposed, because it is even less likely that the implicitly induced member can be useful.]
Cf. #47148.
It seems to contradict the overall static safety of Dart that we silently allow a concrete class B
to implement/extend a class A
in a different library with an unimplemented private member _m
:
In this situation, an implicitly induced member known as a noSuchMethod forwarder is added to B
; this forwarder will invoke noSuchMethod
on this
, and pass some data to describe the invocation.
However, it is almost impossible to make that forwarder do anything other than throwing a NoSuchMethodError
. In particular, we can't add a noSuchMethod
implementation that does if (invocation.memberName == #_m) ..
to B
, because #_m
, being a private symbol, isn't equal to the given member name, because that's the #_m
of a different library.
For example:
// Library 'lib.dart'.
class A { void _m() {}}
void f(A a) => a._m();
// Library 'main.dart'.
import 'lib.dart';
class B implements A {} // No compile-time errors.
void main() => f(B()); // `NoSuchMethodError`.
This issue is a request for a lint that flags any class (like B
in the example) where a noSuchMethod forwarder is induced because of the privacy rule.