Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Combine the two implementations of "library canonicalization" #3781

Merged
merged 1 commit into from
Jun 10, 2024

Conversation

srawlins
Copy link
Member

@srawlins srawlins commented Jun 6, 2024

I was shocked to find that we had two mechanisms for determining an element's "canonical library": ModelElement.canonicalLibrary and a PackageGraph._findCanonicalLibraryFor. They were not quite the same implementation, but the differences turn out to be uninteresting; the two implementations can be combined. This change removes PackageGraph._findCanonicalLibraryFor. This implementation was only used in the package graph to find the canonical element for a given element. That code can now just use ModelElement.canonicalLibrary. It requires a fair bit of refactoring all over:

  • PackageGraph.findCanonicalModelElementFor previously accepted an analyzer Element, instead of a ModelElement, but almost all of the call sites used foo.element or some other expression that could easily be replaced with an access to a ModelElement instead of the correlated Element.
  • Document ModelElement.definingLibrary, ModelElement.canonicalLibrary, ModelElement._searchForCanonicalLibrary.
  • Simplify ContainerMember.computeCanonicalEnclosingContainer to stop unnecessarily special-casing extensions and extension types.
  • Simplify lookup component of ModelElement._searchForCanonicalLibrary.
  • Simplity ContainerMember.referenceGrandparentOverrides to not use sync*.
  • Move the top-level findCanonicalFor function out of model_utils.dart and into inheriting_container.dart, the only code that uses it anymore.
  • Thanks for your contribution! Please replace this text with a description of what this PR is changing or adding and why, list any relevant issues, and review the contribution guidelines below.

  • I’ve reviewed the contributor guide and applied the relevant portions to this PR.
Contribution guidelines:

Note that many Dart repos have a weekly cadence for reviewing PRs - please allow for some latency before initial review feedback.

I was shocked to find that we had two mechanisms for determining an element's
"canonical library": `ModelElement.canonicalLibrary` and a
`PackageGraph._findCanonicalLibraryFor`. They were not quite the same
implementation, but the differences turn out to be uninteresting; the two
implementations can be combined. This change removes
`PackageGraph._findCanonicalLibraryFor`. This implementation was only used in
the package graph to find the canonical element for a given element. That code
can now just use `ModelElement.canonicalLibrary`. It requires a fair bit of
refactoring all over:

* `PackageGraph.findCanonicalModelElementFor` previously accepted an analyzer
  Element, instead of a ModelElement, but almost all of the call sites used
  `foo.element` or some other expression that could easily be replaced with an
  access to a ModelElement instead of the correlated Element.
* Document `ModelElement.definingLibrary`, `ModelElement.canonicalLibrary`,
  `ModelElement._searchForCanonicalLibrary`.
* Simplify `ContainerMember.computeCanonicalEnclosingContainer` to stop
  unnecessarily special-casing extensions and extension types.
* Simplify lookup component of `ModelElement._searchForCanonicalLibrary`.
* Simplity `ContainerMember.referenceGrandparentOverrides` to not use `sync*`.
* Move the top-level `findCanonicalFor` function out of `model_utils.dart` and
  into `inheriting_container.dart`, the only code that uses it anymore.
@srawlins
Copy link
Member Author

srawlins commented Jun 7, 2024

CC @dart-lang/analyzer-team

Copy link
Member

@bwilkerson bwilkerson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't really have the context for this, but assuming that the tests are adequate to catch any user-visible changes this might have caused, lgtm.

@srawlins srawlins merged commit 12d271a into dart-lang:main Jun 10, 2024
9 checks passed
@srawlins srawlins deleted the one-lib-canonical branch June 10, 2024 16:24
copybara-service bot pushed a commit to dart-lang/sdk that referenced this pull request Jun 13, 2024
…ser, path, shelf, test, webdev

Revisions updated by `dart tools/rev_sdk_deps.dart`.

async (https://github.com/dart-lang/async/compare/4073129..a004370):
  a004370  2024-06-10  Kevin Moore  Bump min SDK, tighten dependencies, test wasm on 3.4 (dart-lang/async#277)

convert (https://github.com/dart-lang/convert/compare/70940e3..0c9eab7):
  0c9eab7  2024-06-10  Kevin Moore  latest lints, require Dart 3.4 (dart-lang/convert#107)

crypto (https://github.com/dart-lang/crypto/compare/7a9428a..813e35e):
  813e35e  2024-06-10  Kevin Moore  Update min SDK, test wasm on 3.4 (dart-lang/crypto#174)

dartdoc (https://github.com/dart-lang/dartdoc/compare/3decf1e..14d33d3):
  14d33d3a  2024-06-12  Sam Rawlins  Fix referencing an aliased type parameter. (dart-lang/dartdoc#3784)
  12d271a5  2024-06-10  Sam Rawlins  Combine the two implementations of "library canonicalization" (dart-lang/dartdoc#3781)
  ca61935e  2024-06-10  Sam Rawlins  Revert "Deprecate --resources-dir option. (`#3696`)" (dart-lang/dartdoc#3782)

ecosystem (https://github.com/dart-lang/ecosystem/compare/865b2c5..b2b045f):
  b2b045f  2024-06-12  Devon Carew  remove extraneous quotes (dart-lang/ecosystem#270)
  fdedf3c  2024-06-11  Devon Carew  move to logging; check for safety exceptions (dart-lang/ecosystem#269)
  27574e0  2024-06-10  dependabot[bot]  Bump the github-actions group with 2 updates (dart-lang/ecosystem#268)
  6e53c96  2024-06-10  Devon Carew  updates for the blast_repo tool (dart-lang/ecosystem#267)

http (https://github.com/dart-lang/http/compare/b522000..e2e2170):
  e2e2170  2024-06-11  David Wimmer  Update README.md (dart-lang/http#1231)
  f8d5bf8  2024-06-12  Anikate De  [pkgs/ok_http] Add functionality to accept and configure redirects. (dart-lang/http#1230)
  93ff4a9  2024-06-11  Anikate De  [ok_http]: Use the Android SDK to generate JNI bindings. (dart-lang/http#1229)

http_parser (https://github.com/dart-lang/http_parser/compare/551e0e4..53d4041):
  53d4041  2024-06-10  Kevin Moore  blast_repo fixes (dart-lang/http_parser#98)
  1ff06e4  2024-06-10  Kevin Moore  Update min SDK, test wasm on 3.4 (dart-lang/http_parser#97)

path (https://github.com/dart-lang/path/compare/8fc4c72..04807b6):
  04807b6  2024-06-10  Kevin Moore  Update to latest lints, bump min SDK to 3.4, test wasm on 3.4 (dart-lang/path#168)

shelf (https://github.com/dart-lang/shelf/compare/ea3c983..4c54af6):
  4c54af6  2024-06-11  Kevin Moore  [shelf_test_handler] Bump dev deps (dart-lang/shelf#435)

test (https://github.com/dart-lang/test/compare/83c597e..329c6df):
  329c6dff  2024-06-10  Jacob MacDonald  fix windows failures (dart-lang/test#2244)
  777631bb  2024-06-10  Rexios  Bump min Dart version to 3.4.0 for WASM (dart-lang/test#2242)

webdev (https://github.com/dart-lang/webdev/compare/9ada46f..eccc7d8):
  eccc7d87  2024-06-12  Parker Lougheed  Update `package:lints` and clean up library declarations (dart-lang/webdev#2436)

Change-Id: Ic7aede173c9730f0ccd1bc3138f50a92ddf49fce
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/371440
Commit-Queue: Devon Carew <devoncarew@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants