@@ -579,11 +579,12 @@ internal static ScriptExtentAdapter GetFunctionNameExtent(this FunctionDefinitio
579579 ScriptExtentAdapter funcExtent = new ( ast . Extent ) ;
580580 string ? extentText = ast . Extent . Text ;
581581
582- if ( TryGetFunctionNameOffsets ( extentText , out int nameStartOffset , out int nameEndOffset ) )
582+ if ( ! string . IsNullOrEmpty ( extentText ) )
583583 {
584+ ( int nameStartOffset , int nameEndOffset ) = GetFunctionNameOffsets ( extentText , ast . Name ) ;
584585 ScriptPosition originalStart = funcExtent . Start ;
585- funcExtent . Start = GetPositionAtOffset ( originalStart , extentText ! , nameStartOffset ) ;
586- funcExtent . End = GetPositionAtOffset ( originalStart , extentText ! , nameEndOffset ) ;
586+ funcExtent . Start = GetPositionAtOffset ( originalStart , extentText , nameStartOffset ) ;
587+ funcExtent . End = GetPositionAtOffset ( originalStart , extentText , nameEndOffset ) ;
587588 return funcExtent ;
588589 }
589590
@@ -641,65 +642,55 @@ private static ScriptPosition AdjustPosition(
641642 basePosition . ColumnNumber + columnDelta ,
642643 basePosition . Line ) ;
643644
644- private static bool TryGetFunctionNameOffsets (
645- string ? text ,
646- out int nameStartOffset ,
647- out int nameEndOffset )
645+ internal static ( int NameStartOffset , int NameEndOffset ) GetFunctionNameOffsets (
646+ string text ,
647+ string functionName )
648648 {
649- nameStartOffset = 0 ;
650- nameEndOffset = 0 ;
651-
652- if ( text is null || text . Length == 0 )
649+ if ( string . IsNullOrEmpty ( text ) )
653650 {
654- return false ;
651+ throw new ArgumentException ( "Function definition text cannot be null or empty." , nameof ( text ) ) ;
655652 }
656653
657- string nonNullText = text ;
658-
659- const string functionKeyword = "function" ;
660- int functionIndex = nonNullText . IndexOf ( functionKeyword , StringComparison . OrdinalIgnoreCase ) ;
661- if ( functionIndex < 0 )
654+ if ( string . IsNullOrEmpty ( functionName ) )
662655 {
663- return false ;
656+ throw new ArgumentException ( "Function name cannot be null or empty." , nameof ( functionName ) ) ;
664657 }
665658
666- int index = functionIndex + functionKeyword . Length ;
667- while ( index < nonNullText . Length && char . IsWhiteSpace ( nonNullText [ index ] ) )
659+ int keywordStart = 0 ;
660+ while ( keywordStart < text . Length && char . IsWhiteSpace ( text [ keywordStart ] ) )
668661 {
669- index ++ ;
662+ keywordStart ++ ;
670663 }
671664
672- if ( index >= nonNullText . Length )
665+ if ( keywordStart >= text . Length )
673666 {
674- return false ;
667+ throw new InvalidOperationException ( "Function definition text does not contain a declaration keyword." ) ;
675668 }
676669
677- nameStartOffset = index ;
678-
679- while ( index < nonNullText . Length )
670+ int keywordEnd = keywordStart ;
671+ while ( keywordEnd < text . Length && ! char . IsWhiteSpace ( text [ keywordEnd ] ) )
680672 {
681- char current = nonNullText [ index ] ;
682-
683- if ( current == '`' )
684- {
685- index ++ ;
686- if ( index < nonNullText . Length )
687- {
688- index ++ ;
689- }
673+ keywordEnd ++ ;
674+ }
690675
691- continue ;
692- }
676+ string keyword = text . Substring ( keywordStart , keywordEnd - keywordStart ) ;
677+ bool isKnownKeyword = keyword . Equals ( "function" , StringComparison . OrdinalIgnoreCase )
678+ || keyword . Equals ( "filter" , StringComparison . OrdinalIgnoreCase )
679+ || keyword . Equals ( "workflow" , StringComparison . OrdinalIgnoreCase ) ;
693680
694- if ( char . IsWhiteSpace ( current ) || current == '{' || current == '(' )
695- {
696- break ;
697- }
681+ if ( ! isKnownKeyword )
682+ {
683+ throw new InvalidOperationException ( $ "Unexpected function definition keyword ' { keyword } '." ) ;
684+ }
698685
699- index ++ ;
686+ int nameStartOffset = text . IndexOf ( functionName , keywordEnd , StringComparison . Ordinal ) ;
687+ if ( nameStartOffset < 0 )
688+ {
689+ throw new InvalidOperationException ( $ "Could not find function name '{ functionName } ' in function definition text.") ;
700690 }
701691
702- nameEndOffset = index ;
703- return nameEndOffset > nameStartOffset ;
692+ int nameEndOffset = nameStartOffset + functionName . Length ;
693+
694+ return ( nameStartOffset , nameEndOffset ) ;
704695 }
705696}
0 commit comments