@@ -6,7 +6,7 @@ use crate::{
66 lite_parser:: { LiteCommand , LitePipeline , LiteRedirection , LiteRedirectionTarget , lite_parse} ,
77 parse_keywords:: * ,
88 parse_patterns:: parse_pattern,
9- parse_shape_specs:: { ShapeDescriptorUse , parse_shape_name, parse_type} ,
9+ parse_shape_specs:: { ShapeDescriptorUse , parse_completer , parse_shape_name, parse_type} ,
1010 type_check:: { self , check_range_types, math_result_type, type_compatible} ,
1111} ;
1212use itertools:: Itertools ;
@@ -4180,12 +4180,39 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
41804180 }
41814181 ParseMode :: Type => {
41824182 if let Some ( last) = args. last_mut ( ) {
4183- let syntax_shape = parse_shape_name (
4184- working_set,
4185- & contents,
4186- span,
4187- ShapeDescriptorUse :: Argument ,
4188- ) ;
4183+ let ( syntax_shape, completer) = if contents. contains ( & b'@' ) {
4184+ let mut split = contents. splitn ( 2 , |b| b == & b'@' ) ;
4185+
4186+ let shape_name = split
4187+ . next ( )
4188+ . expect ( "If `bytes` contains `@` splitn returns 2 slices" ) ;
4189+ let shape_span =
4190+ Span :: new ( span. start , span. start + shape_name. len ( ) ) ;
4191+ let cmd_span =
4192+ Span :: new ( span. start + shape_name. len ( ) + 1 , span. end ) ;
4193+ let cmd_name = split
4194+ . next ( )
4195+ . expect ( "If `bytes` contains `@` splitn returns 2 slices" ) ;
4196+ (
4197+ parse_shape_name (
4198+ working_set,
4199+ shape_name,
4200+ shape_span,
4201+ ShapeDescriptorUse :: Argument ,
4202+ ) ,
4203+ parse_completer ( working_set, cmd_name, cmd_span) ,
4204+ )
4205+ } else {
4206+ (
4207+ parse_shape_name (
4208+ working_set,
4209+ & contents,
4210+ span,
4211+ ShapeDescriptorUse :: Argument ,
4212+ ) ,
4213+ None ,
4214+ )
4215+ } ;
41894216 //TODO check if we're replacing a custom parameter already
41904217 match last {
41914218 Arg :: Positional {
@@ -4200,12 +4227,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
42004227 type_annotated,
42014228 } => {
42024229 working_set. set_variable_type ( var_id. expect ( "internal error: all custom parameters must have var_ids" ) , syntax_shape. to_type ( ) ) ;
4203- // Extract custom_completion from CompleterWrapper if present
4204- if let SyntaxShape :: CompleterWrapper ( _, decl_id) =
4205- & syntax_shape
4206- {
4207- * custom_completion = Some ( * decl_id) ;
4208- }
4230+ * custom_completion = completer;
42094231 * shape = syntax_shape;
42104232 * type_annotated = true ;
42114233 }
@@ -4216,12 +4238,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
42164238 ..
42174239 } ) => {
42184240 working_set. set_variable_type ( var_id. expect ( "internal error: all custom parameters must have var_ids" ) , Type :: List ( Box :: new ( syntax_shape. to_type ( ) ) ) ) ;
4219- // Extract custom_completion from CompleterWrapper if present
4220- if let SyntaxShape :: CompleterWrapper ( _, decl_id) =
4221- & syntax_shape
4222- {
4223- * custom_completion = Some ( * decl_id) ;
4224- }
4241+ * custom_completion = completer;
42254242 * shape = syntax_shape;
42264243 }
42274244 Arg :: Flag {
@@ -4242,12 +4259,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
42424259 span,
42434260 ) ) ;
42444261 }
4245- // Extract custom_completion from CompleterWrapper if present
4246- if let SyntaxShape :: CompleterWrapper ( _, decl_id) =
4247- & syntax_shape
4248- {
4249- * custom_completion = Some ( * decl_id) ;
4250- }
4262+ * custom_completion = completer;
42514263 * arg = Some ( syntax_shape) ;
42524264 * type_annotated = true ;
42534265 }
@@ -5204,10 +5216,6 @@ pub fn parse_value(
52045216 }
52055217
52065218 match shape {
5207- SyntaxShape :: CompleterWrapper ( shape, _custom_completion) => {
5208- // Ignore the custom_completion field since it's now stored in PositionalArg/Flag
5209- parse_value ( working_set, span, shape)
5210- }
52115219 SyntaxShape :: Number => parse_number ( working_set, span) ,
52125220 SyntaxShape :: Float => parse_float ( working_set, span) ,
52135221 SyntaxShape :: Int => parse_int ( working_set, span) ,
0 commit comments