4f46f8bc9c
In the front end, the logic for determining when to report a `voidExpression` error is integrated into the resolution pass. The method `InferenceVisitorImpl.inferExpression` accepts a named parameter `isVoidAllowed`; if the value is `false`, and the expression's static type is `void`, an error will be reported. The parameter is optional with a default value of `false`; this means that the parameter only needs to be specified in the situations where `void` is allowed; this aligns well with the language spec, which lists the situations in which an expression may have type `void`, and declares that in all other situations it is an error. This change integrates the front end's `isVoidAllowed` boolean with the shared type analysis logic in `package:_fe_analyzer_shared`, so that the shared logic can specify when a subexpression should not be void. This will pave the way for fixing https://github.com/dart-lang/sdk/issues/62939 (Switch scrutinees of type void are erroneously accepted by the front end). It also will pave the way for sharing the logic for analyzing await expressions, which will make it easier to fix https://github.com/dart-lang/sdk/issues/62889 (Unsound type promotion in inner async/generator functions). Note that the analyzer doesn't use the `isVoidAllowed` parameter; it has its own mechanism for detecting invalid uses of void (which is more ad hoc). In the long run I would like to make the analyzer's mechanism more like the front end's, for easier code sharing; see https://github.com/dart-lang/sdk/issues/62942. Change-Id: Ibb8dd072d6aff980d7df0b2e94f434ee6a6a6964 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/489501 Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Paul Berry <paulberry@google.com>
FE/analyzer shared code
This package contains logic that is shared between the front_end and analyzer packages. It is intended solely to facilitate development of the Dart SDK, and is not intended for use by end users. In particular, this package has no public API, so no guarantee is made of compatibility between one version of the package and the next.
End users should consider using the analyzer package to analyze Dart source code.