Skip to content

Commit db21acd

Browse files
authored
feat: Add Go to Definition for unexists labels (#375)
1 parent a59aff8 commit db21acd

1 file changed

Lines changed: 36 additions & 30 deletions

File tree

crates/starpls_ide/src/goto_definition.rs

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ use starpls_syntax::ast::AstNode;
99
use starpls_syntax::ast::{self};
1010
use starpls_syntax::match_ast;
1111
use starpls_syntax::SyntaxToken;
12+
use starpls_syntax::TextRange;
1213
use starpls_syntax::T;
1314

1415
use crate::util::pick_best_token;
1516
use crate::Database;
1617
use crate::FilePosition;
1718
use crate::LocationLink;
1819
use crate::ResolvedPath;
20+
use crate::TextSize;
1921

2022
struct GotoDefinitionHandler<'a> {
2123
sema: Semantics<'a>,
@@ -262,38 +264,42 @@ impl<'a> GotoDefinitionHandler<'a> {
262264
} => {
263265
let build_file = self.sema.db.get_file(build_file_id)?;
264266
let parse = self.sema.parse(build_file).syntax(self.sema.db);
265-
let call_expr = parse
266-
.children()
267-
.filter_map(ast::CallExpr::cast)
268-
.find(|expr| {
269-
expr.arguments()
270-
.into_iter()
271-
.flat_map(|args| args.arguments())
272-
.any(|arg| match arg {
273-
ast::Argument::Keyword(arg) => {
274-
arg.name()
275-
.and_then(|name| name.name())
276-
.map(|name| name.text() == "name")
277-
.unwrap_or_default()
278-
&& arg
279-
.expr()
280-
.and_then(|expr| match expr {
281-
ast::Expression::Literal(expr) => Some(expr),
282-
_ => None,
283-
})
284-
.and_then(|expr| match expr.kind() {
285-
ast::LiteralKind::String(s) => {
286-
s.value().map(|value| *value == target)
287-
}
288-
_ => None,
289-
})
267+
let optional_call_expr =
268+
parse
269+
.children()
270+
.filter_map(ast::CallExpr::cast)
271+
.find(|expr| {
272+
expr.arguments()
273+
.into_iter()
274+
.flat_map(|args| args.arguments())
275+
.any(|arg| match arg {
276+
ast::Argument::Keyword(arg) => {
277+
arg.name()
278+
.and_then(|name| name.name())
279+
.map(|name| name.text() == "name")
290280
.unwrap_or_default()
291-
}
292-
_ => false,
293-
})
294-
})?;
281+
&& arg
282+
.expr()
283+
.and_then(|expr| match expr {
284+
ast::Expression::Literal(expr) => Some(expr),
285+
_ => None,
286+
})
287+
.and_then(|expr| match expr.kind() {
288+
ast::LiteralKind::String(s) => {
289+
s.value().map(|value| *value == target)
290+
}
291+
_ => None,
292+
})
293+
.unwrap_or_default()
294+
}
295+
_ => false,
296+
})
297+
});
298+
let range = match optional_call_expr {
299+
Some(call_expr) => call_expr.syntax().text_range(),
300+
None => TextRange::new(TextSize::new(0), TextSize::new(0)),
301+
};
295302

296-
let range = call_expr.syntax().text_range();
297303
Some(vec![LocationLink::Local {
298304
origin_selection_range: Some(self.token.text_range()),
299305
target_range: range,

0 commit comments

Comments
 (0)