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

Store symbol definitions using NodeKey #11121

Merged
merged 3 commits into from
Apr 24, 2024
Merged

Conversation

carljm
Copy link
Contributor

@carljm carljm commented Apr 24, 2024

Summary

Indexing definitions of symbols is necessary for fast lazy type evaluation, so that when we see a reference to a name we can figure out the type of that symbol from its definition(s).

We only want to do this indexing of definitions once per module, and then it needs to remain available in the cache thereafter for use by lazy type evaluation.

Rust lifetimes won't let us use direct references to AST nodes owned by the cache.

We could use unsafe code to strip the lifetimes from these references, with safety ensured by our cache invalidation: if we evict the AST from the cache, we must evict the symbol definitions also. But in order to serialize such a cache to disk, we would need (at least) an AST numbering scheme. This may still be something to look into in the future, for improved performance.

For now, use NodeKey: indirect references to an AST node consisting of a NodeKind and a TextRange, which we can find again reasonably quickly in the AST. These are easy to serialize, have no lifetime problems, and don't require unsafe code.

Test Plan

Updated tests.

@carljm carljm requested a review from MichaReiser April 24, 2024 01:17
Copy link
Contributor

github-actions bot commented Apr 24, 2024

ruff-ecosystem results

Linter (stable)

✅ ecosystem check detected no linter changes.

Linter (preview)

✅ ecosystem check detected no linter changes.

@carljm carljm force-pushed the cjm/red-knot/symbols-types branch from bf3a182 to fbea550 Compare April 24, 2024 02:02
crates/red_knot/src/ast_ids.rs Outdated Show resolved Hide resolved
crates/red_knot/src/symbols.rs Outdated Show resolved Hide resolved
crates/red_knot/src/symbols.rs Show resolved Hide resolved
@carljm carljm merged commit 9c56732 into red-knot Apr 24, 2024
18 checks passed
@carljm carljm deleted the cjm/red-knot/symbols-types branch April 24, 2024 14:52
MichaReiser pushed a commit that referenced this pull request Apr 25, 2024
## Summary

Indexing definitions of symbols is necessary for fast lazy type
evaluation, so that when we see a reference to a name we can figure out
the type of that symbol from its definition(s).

We only want to do this indexing of definitions once per module, and
then it needs to remain available in the cache thereafter for use by
lazy type evaluation.

Rust lifetimes won't let us use direct references to AST nodes owned by
the cache.

We could use unsafe code to strip the lifetimes from these references,
with safety ensured by our cache invalidation: if we evict the AST from
the cache, we must evict the symbol definitions also. But in order to
serialize such a cache to disk, we would need (at least) an AST
numbering scheme. This may still be something to look into in the
future, for improved performance.

For now, use `NodeKey`: indirect references to an AST node consisting of
a `NodeKind` and a `TextRange`, which we can find again reasonably
quickly in the AST. These are easy to serialize, have no lifetime
problems, and don't require unsafe code.

## Test Plan

Updated tests.
@carljm carljm added the internal An internal refactor or improvement label Apr 26, 2024
MichaReiser pushed a commit that referenced this pull request Apr 27, 2024
## Summary

Indexing definitions of symbols is necessary for fast lazy type
evaluation, so that when we see a reference to a name we can figure out
the type of that symbol from its definition(s).

We only want to do this indexing of definitions once per module, and
then it needs to remain available in the cache thereafter for use by
lazy type evaluation.

Rust lifetimes won't let us use direct references to AST nodes owned by
the cache.

We could use unsafe code to strip the lifetimes from these references,
with safety ensured by our cache invalidation: if we evict the AST from
the cache, we must evict the symbol definitions also. But in order to
serialize such a cache to disk, we would need (at least) an AST
numbering scheme. This may still be something to look into in the
future, for improved performance.

For now, use `NodeKey`: indirect references to an AST node consisting of
a `NodeKind` and a `TextRange`, which we can find again reasonably
quickly in the AST. These are easy to serialize, have no lifetime
problems, and don't require unsafe code.

## Test Plan

Updated tests.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
internal An internal refactor or improvement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants