Add TextRange to Identifier (#8)
## Summary This PR adds `TextRange` to `Identifier`. Right now, the AST only includes ranges for identifiers in certain cases (`Expr::Name`, `Keyword`, etc.), namely when the identifier comprises an entire AST node. In Ruff, we do additional ad-hoc lexing to extract identifiers from source code. One frequent example: given a function `def f(): ...`, we lex to find the range of `f`, for use in diagnostics. Another: `except ValueError as e`, for which the AST doesn't include a range for `e`. Note that, as an optimization, we avoid storing the `TextRange` for `Expr::Name`, since it's already included.
This commit is contained in:
@@ -90,7 +90,7 @@ pub(crate) fn parse_args(func_args: Vec<FunctionArgument>) -> Result<ArgumentLis
|
||||
Some((start, end, name)) => {
|
||||
// Check for duplicate keyword arguments in the call.
|
||||
if let Some(keyword_name) = &name {
|
||||
if !keyword_names.insert(keyword_name.clone()) {
|
||||
if !keyword_names.insert(keyword_name.to_string()) {
|
||||
return Err(LexicalError {
|
||||
error: LexicalErrorType::DuplicateKeywordArgumentError(
|
||||
keyword_name.to_string(),
|
||||
@@ -103,7 +103,7 @@ pub(crate) fn parse_args(func_args: Vec<FunctionArgument>) -> Result<ArgumentLis
|
||||
}
|
||||
|
||||
keywords.push(ast::Keyword {
|
||||
arg: name.map(ast::Identifier::new),
|
||||
arg: name.map(|name| ast::Identifier::new(name, TextRange::new(start, end))),
|
||||
value,
|
||||
range: TextRange::new(start, end),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user