@@ -9,13 +9,15 @@ use starpls_syntax::ast::AstNode;
99use starpls_syntax:: ast:: { self } ;
1010use starpls_syntax:: match_ast;
1111use starpls_syntax:: SyntaxToken ;
12+ use starpls_syntax:: TextRange ;
1213use starpls_syntax:: T ;
1314
1415use crate :: util:: pick_best_token;
1516use crate :: Database ;
1617use crate :: FilePosition ;
1718use crate :: LocationLink ;
1819use crate :: ResolvedPath ;
20+ use crate :: TextSize ;
1921
2022struct 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