Shared: Local name resolution library#21873
Draft
hvitved wants to merge 6 commits into
Draft
Conversation
| class NestedFunctionAccess extends LocalAccess { | ||
| private Function f; | ||
|
|
||
| NestedFunctionAccess() { nestedFunctionAccess(_, f, this) } |
46e6643 to
78a5319
Compare
|
|
||
| /** Gets the name of this variable as a string. */ | ||
| string getText() { result = text } | ||
| predicate accessCand(AstNode n, string name) { |
0de851d to
35ff093
Compare
35ff093 to
cad848a
Compare
| * We also move any `else` branch _before_ the condition to ensure that shadowing declarations | ||
| * inside the condition are not in scope. | ||
| */ | ||
| private AstNode getChildAdj(AstNode parent, int index) { |
9ce2e74 to
baef7eb
Compare
|
|
||
| class Ranked = AstNode; | ||
|
|
||
| int getRank(C parent, Ranked child) { |
59b8380 to
0f3ee22
Compare
Contributor
Author
Rerun has been triggered: 5 restarted 🚀 |
Contributor
Author
Rerun has been triggered: 1 restarted 🚀 |
0f3ee22 to
b5586e5
Compare
| ) | ||
| } | ||
|
|
||
| predicate accessCand(AstNode n, string name) { |
da949b1 to
392fab1
Compare
392fab1 to
128dd5d
Compare
| /** | ||
| * Holds if `n` is a node that may access a local named `name`. | ||
| */ | ||
| predicate accessCand(AstNode n, string name); |
Contributor
Author
Rerun has been triggered: 2 restarted 🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR adds a new shared library for doing local name binding, and applies it to Ruby and Rust.
The interface to the library is inspired by a similar unreleased library created by @asgerf, but unlike that library, this library supports sibling-based shadowing as known from Rust:
The implementation handles sibling shadowing much simpler than the current Rust implementation (which also has a bug, see one of the added tests), by treating shadowing sibling declarations as defining a new scope, and then letting all subsequent statements be children of that scope. That is, when looking up names by going up the AST, we rewrite the AST above to (eliding leaf nodes):
Note how the RHS is moved away from
let x = x + 1to ensure that it resolves to the preceding declaration.