Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[red-knot] Use memory address as AST node key (#14317)
## Summary Use the memory address to uniquely identify AST nodes, instead of relying on source range and kind. The latter fails for ASTs resulting from invalid syntax examples. See #14313 for details. Also results in a 1-2% speedup (https://codspeed.io/astral-sh/ruff/runs/67349cf55f36b36baa211360) closes #14313 ## Review Here are the places where we use `NodeKey` directly or indirectly (via `ExpressionNodeKey` or `DefinitionNodeKey`): ```rs // semantic_index.rs pub(crate) struct SemanticIndex<'db> { // [...] /// Map expressions to their corresponding scope. scopes_by_expression: FxHashMap<ExpressionNodeKey, FileScopeId>, /// Map from a node creating a definition to its definition. definitions_by_node: FxHashMap<DefinitionNodeKey, Definition<'db>>, /// Map from a standalone expression to its [`Expression`] ingredient. expressions_by_node: FxHashMap<ExpressionNodeKey, Expression<'db>>, // [...] } // semantic_index/builder.rs pub(super) struct SemanticIndexBuilder<'db> { // [...] scopes_by_expression: FxHashMap<ExpressionNodeKey, FileScopeId>, definitions_by_node: FxHashMap<ExpressionNodeKey, Definition<'db>>, expressions_by_node: FxHashMap<ExpressionNodeKey, Expression<'db>>, } // semantic_index/ast_ids.rs pub(crate) struct AstIds { /// Maps expressions to their expression id. expressions_map: FxHashMap<ExpressionNodeKey, ScopedExpressionId>, /// Maps expressions which "use" a symbol (that is, [`ast::ExprName`]) to a use id. uses_map: FxHashMap<ExpressionNodeKey, ScopedUseId>, } pub(super) struct AstIdsBuilder { expressions_map: FxHashMap<ExpressionNodeKey, ScopedExpressionId>, uses_map: FxHashMap<ExpressionNodeKey, ScopedUseId>, } ``` ## Test Plan Added two failing examples to the corpus.
- Loading branch information