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

Resolve references lazily #1228

Merged
merged 11 commits into from
Feb 4, 2025
Merged

Conversation

ggiraldez
Copy link
Contributor

@ggiraldez ggiraldez commented Jan 22, 2025

This hopefully reduces resolution time when not all references (eg. those in dependencies) need to be resolved, but requires the BindingGraph to retain both the StackGraph and the Resolver (with the database of partial path candidates and the partial paths arena).

This PR also includes an optimization to the resolution algorithm. When selecting candidates to extend an already complete partial path, discard those that would immediately push a @typeof symbol (eg. through the path that replaces a variable by its type) since we know those will never resolve. This can halve the number of evaluated partial paths (ie. references that resolve to a variable/field definition) and provide a very significant performance gain in some cases.

Copy link

changeset-bot bot commented Jan 22, 2025

⚠️ No Changeset found

Latest commit: 2f4e94a

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Only don't include extensions when recursion is not allowed in resolution.
…ol is pushed next

This avoids a lot of extra work for the resolution when the identifier being
resolved is a variable that has a type. Since the definition is found but then
replace by the sequence `@typeof` and the type of the variable, which will never
resolve. This path *is* used when resolving for members of the type of the
variable.
@ggiraldez ggiraldez changed the title Switch to lazily resolving references Resolve references lazily Jan 24, 2025
@ggiraldez ggiraldez marked this pull request as ready for review January 24, 2025 22:50
@ggiraldez ggiraldez requested review from a team as code owners January 24, 2025 22:50
@ggiraldez ggiraldez enabled auto-merge February 4, 2025 16:16
@ggiraldez ggiraldez added this pull request to the merge queue Feb 4, 2025
Merged via the queue into NomicFoundation:main with commit ee7e203 Feb 4, 2025
1 check passed
@ggiraldez ggiraldez deleted the lazy-resolution branch February 4, 2025 17:07
@OmarTawfik OmarTawfik linked an issue Feb 5, 2025 that may be closed by this pull request
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.

bindings perf investigations
2 participants