Find a file
Paul Berry 32ab547688 Fix analyzer handling of record literal type inference.
This CL contains several small bug fixes:

- The context is only used for type inference if it is a record type
  with the same shape as the record literal. Previously, if the
  context was a record type with a different shape than the record
  literal, the analyzer would attempt to do an approximate match
  (using the context from any matching named fields, and from all the
  positional fields that were in common between the context and the
  literal). At first glance, it might seem like this would only matter
  for erroneous code (since record shape mismatches typically lead to
  compile-time errors). But if the context arises from a local
  variable promotion, then a mismatch doesn't lead to a compile-time
  error; it simply leads to a demotion. So the difference is
  observable for non-erroneous code.

- If one of the fields is implicitly downcast from `dynamic`, the
  static type of the field's expression remains `dynamic`. This makes
  the behavior of dynamic downcasts inside field literals consistent
  with all other implicit dynamic downcasts.

- If one of the fields is implicitly downcast from `dynamic`, the
  downcast is made to the greatest closure of the context. Previously,
  the downcast was made to the context itself, which meant that it was
  possible to create static types containing the unknown type,
  violating one of the key assumptions of the Dart type system.

- If one of the fields has a static type of `dynamic`, and `dynamic`
  is a subtype of the greatest closure of the context (e.g. because
  the context is `Object?`), no dynamic downcast is
  performed. Previously, a dynamic downcast _was_ performed, meaning
  that the static type of the resulting record literal would have
  `dynamic` in a spot where `Object?` should be.

This brings the analyzer behavior into line with the spec and the
front end, with one minor exception:

- When the front end uses the greatest closure of the context to
  implicitly downcast a field from dynamic, it uses a modified
  greatest closure algorithm where covariant instances of `_` are
  replaced with `dynamic` instead of `Object?`.

The front end's behavior in this rare case doesn't agree with the
spec; I'll address this in a future CL.

Change-Id: Ib1ab7ee4d0f63a152480704e2c0d5332446a613c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/350983
Reviewed-by: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
2024-02-20 20:21:48 +00:00
.dart_tool [infra] re-land work to auto-generate .dart_tool/package_config.json 2022-04-12 17:21:02 +00:00
.github Bump actions/upload-artifact from 4.1.0 to 4.3.0 2024-01-29 17:59:54 +00:00
benchmarks [dart2wasm] Switch binaryen optimization levels from -O3 to -Os 2024-02-14 13:45:13 +00:00
build Revert "Roll zlib to 646b7f569718921d7d4b5b8e22572ff6c76f2596." 2024-02-13 10:03:56 +00:00
docs [docs] minor cleanup of the docs/ directory 2023-11-15 20:06:51 +00:00
pkg Fix analyzer handling of record literal type inference. 2024-02-20 20:21:48 +00:00
runtime [vm] Add some warnings to Dart_RecordTimelineEvent. 2024-02-20 20:18:09 +00:00
samples fix use of deprecated members in ffi samples 2024-01-31 22:31:59 +00:00
sdk [ddc] Cleanup dead code from the runtime library 2024-02-16 22:33:54 +00:00
tests Fix analyzer handling of record literal type inference. 2024-02-20 20:21:48 +00:00
third_party [dap] Restore DAP readme 2024-02-12 07:54:09 +00:00
tools [vm] Make iso-stress builder use valid -Dtest_configuration when compiling the giant stress test 2024-02-20 09:39:00 +00:00
utils Reland "[ddc] Fix running d8 with test.py" 2024-02-13 20:09:58 +00:00
.clang-format
.gitattributes Remove the legacy "_2" tests. \o/ 2023-11-17 20:17:23 +00:00
.gitconfig [infra] Add documentation to .gitconfig 2018-06-11 18:24:16 +00:00
.gitignore [docs] update the messaging for dart:html and related libraries 2024-01-22 21:28:02 +00:00
.gn [build] Switch to Fuchsia core SDK. 2023-11-10 19:23:11 +00:00
.mailmap Fixed various typos in a lot of files 2022-07-25 12:21:59 +00:00
.style.yapf Mass format python with yapf 2019-08-05 20:34:31 +00:00
AUTHORS Simplify the license situation 2022-09-14 21:06:22 +00:00
BUILD.gn [vm] Do not bundle dart.lib in the Dart SDK 2024-02-15 14:09:37 +00:00
CHANGELOG.md [io] Make it possible to change the line ending output by stdout and stderr. 2024-02-16 20:06:03 +00:00
codereview.settings [infra] Default presubmits to use python3 2021-08-24 08:20:47 +00:00
CONTRIBUTING.md Update CONTRIBUTING.md 2023-11-20 09:29:37 +00:00
DEPS Revert "Add parameter for analytics instance" 2024-02-19 08:58:28 +00:00
LICENSE Update LICENSE 2021-04-08 07:57:10 +00:00
OWNERS Assign owners to each top level file. 2023-12-14 12:38:11 +00:00
PATENT_GRANT Rename patent file 2019-08-16 12:03:17 +00:00
PRESUBMIT.py [presubmit] first check for formatting errors in bulk. 2024-02-15 19:29:42 +00:00
README.dart-sdk Update README.dart-sdk for inclusion of AOT snapshots 2023-11-21 10:33:22 +00:00
README.md Update readme content 2023-12-18 15:30:58 +00:00
sdk.code-workspace [cleanup] Remove co19_2 and other references to _2 suites 2023-11-22 11:15:57 +00:00
sdk_args.gni Fix typos 2022-06-15 11:08:28 +00:00
SECURITY.md Add link to published advisories 2022-02-08 19:45:07 +00:00
WATCHLISTS [analyzer] Properly close analyzer WATCHLISTS entry 2023-12-10 18:02:25 +00:00

Dart

An approachable, portable, and productive language for high-quality apps on any platform

Dart is:

  • Approachable: Develop with a strongly typed programming language that is consistent, concise, and offers modern language features like null safety and patterns.

  • Portable: Compile to ARM, x64, or RISC-V machine code for mobile, desktop, and backend. Compile to JavaScript or WebAssembly for the web.

  • Productive: Make changes iteratively: use hot reload to see the result instantly in your running app. Diagnose app issues using DevTools.

Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:

  • Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.

  • Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).

Dart platforms illustration

License & patents

Dart is free and open source.

See LICENSE and PATENT_GRANT.

Using Dart

Visit dart.dev to learn more about the language, tools, and to find codelabs.

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

Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).

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.