Rework how type information is communicated from CFE to analyzer.

This CL introduces new Factory/TypeInferenceListener methods to
communicate details about types that are literally named in the source

Previously, when an expression like `x as List<int>` was analyzed, the
resolution information about `List<int>` was communicated to the
analyzer via a kernel DartType, forcing the analyzer to walk the type
representation, applying each of its constituent parts to the
corresponding part of the AST for `List<int>`.  This was a lot of work
for the analyzer, it failed to resolve parts of invalid types (such as
`List<int, String>), and it didn't pave the way toward moving to the
Factory API.

The new approach is for information about each type appearing in the
syntax to be communicated to the analyzer at the time the BodyBuilder
converts it to a DartType.  So for an invalid type like `List<int,
String>`, the resolution of `String` is communicated to the analyzer
at the time it is converted to a DartType; later, when `String` is
discarded (because `List` only accepts one type parameter), no crucial
information is lost, because the analyzer already knows the resolution
of `String`.

Work still to be done has been captured in issues:
- #33844: References to type parameter elements are not translated
- #33845: Function typed formal parameters are not handled
- #33846: Function types using `Function` syntax are not yet handled

Change-Id: I96dd9b6f3eb573b0b7a46335e8644c59fb78bae7
Reviewed-by: Konstantin Shcheglov <>
Reviewed-by: Brian Wilkerson <>
Commit-Queue: Paul Berry <>
23 files changed
tree: 350d0724ac78840f3bbbb66de20b4b98d4f58104
  1. .clang-format
  2. .gitattributes
  3. .gitconfig
  4. .github/
  5. .gitignore
  6. .gn
  7. .mailmap
  8. .packages
  12. DEPS
  16. README.dart-sdk
  19. build/
  20. client/
  21. codereview.settings
  22. dartdoc_options.yaml
  23. docs/
  24. pkg/
  25. runtime/
  26. samples-dev/
  27. samples/
  28. sdk/
  29. tests/
  30. third_party/
  31. tools/
  32. utils/


Dart is an open-source, scalable programming language, with robust libraries and runtimes, for building web, server, and mobile apps.

Using Dart

Visit the to learn more about the language, tools, getting started, and more.

Browse for more packages and libraries contributed by the community and the Dart team.

Building Dart

If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.

There are more documents on our wiki.

Contributing to Dart

The easiest way to contribute to Dart is to file issues.

You can also contribute patches, as described in Contributing.

License & patents