mirror of
https://github.com/nushell/nushell.git
synced 2025-05-10 04:54:28 +02:00
Merge b17a46870c
into a340511e95
This commit is contained in:
commit
8149bf51b2
@ -348,8 +348,43 @@ impl NuCompleter {
|
|||||||
for (arg_idx, arg) in call.arguments.iter().enumerate() {
|
for (arg_idx, arg) in call.arguments.iter().enumerate() {
|
||||||
let span = arg.span();
|
let span = arg.span();
|
||||||
if span.contains(pos) {
|
if span.contains(pos) {
|
||||||
// if customized completion specified, it has highest priority
|
// Get custom completion from PositionalArg or Flag
|
||||||
if let Some(decl_id) = arg.expr().and_then(|e| e.custom_completion) {
|
let custom_completion_decl_id = {
|
||||||
|
// Check PositionalArg or Flag from Signature
|
||||||
|
let signature = working_set.get_decl(call.decl_id).signature();
|
||||||
|
|
||||||
|
match arg {
|
||||||
|
// For named arguments, check Flag
|
||||||
|
Argument::Named((name, short, value)) => {
|
||||||
|
if value.as_ref().is_none_or(|e| !e.span.contains(pos)) {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
// If we're completing the value of the flag,
|
||||||
|
// search for the matching custom completion decl_id (long or short)
|
||||||
|
let flag =
|
||||||
|
signature.get_long_flag(&name.item).or_else(|| {
|
||||||
|
short.as_ref().and_then(|s| {
|
||||||
|
signature.get_short_flag(
|
||||||
|
s.item.chars().next().unwrap_or('_'),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
});
|
||||||
|
flag.and_then(|f| f.custom_completion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// For positional arguments, check PositionalArg
|
||||||
|
Argument::Positional(_) => {
|
||||||
|
// Find the right positional argument by index
|
||||||
|
let arg_pos = positional_arg_indices.len();
|
||||||
|
signature
|
||||||
|
.get_positional(arg_pos)
|
||||||
|
.and_then(|pos_arg| pos_arg.custom_completion)
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(decl_id) = custom_completion_decl_id {
|
||||||
// for `--foo <tab>` and `--foo=<tab>`, the arg span should be trimmed
|
// for `--foo <tab>` and `--foo=<tab>`, the arg span should be trimmed
|
||||||
let (new_span, prefix) = if matches!(arg, Argument::Named(_)) {
|
let (new_span, prefix) = if matches!(arg, Argument::Named(_)) {
|
||||||
strip_placeholder_with_rsplit(
|
strip_placeholder_with_rsplit(
|
||||||
|
@ -2258,6 +2258,30 @@ fn extern_custom_completion_short_flag(mut extern_completer: NuCompleter) {
|
|||||||
match_suggestions(&expected, &suggestions);
|
match_suggestions(&expected, &suggestions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// When we're completing the flag name itself, not its value,
|
||||||
|
/// custom completions should not be used
|
||||||
|
#[rstest]
|
||||||
|
fn custom_completion_flag_name_not_value(mut extern_completer: NuCompleter) {
|
||||||
|
let suggestions = extern_completer.complete("spam --f", 8);
|
||||||
|
assert!(
|
||||||
|
suggestions.iter().any(|s| s.value == "--foo"),
|
||||||
|
"Should contain --foo flag"
|
||||||
|
);
|
||||||
|
let should_not_contain: Vec<_> = vec!["cat", "dog", "eel"];
|
||||||
|
for item in should_not_contain {
|
||||||
|
assert!(
|
||||||
|
!suggestions.iter().any(|s| s.value == item),
|
||||||
|
"Should not contain custom completion {}",
|
||||||
|
item
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also test with partial short flag
|
||||||
|
let suggestions = extern_completer.complete("spam -f", 7);
|
||||||
|
assert_eq!(1, suggestions.len(), "Should only have one suggestion");
|
||||||
|
assert_eq!("-f", suggestions[0].value, "Should suggest -f flag");
|
||||||
|
}
|
||||||
|
|
||||||
#[rstest]
|
#[rstest]
|
||||||
fn extern_complete_flags(mut extern_completer: NuCompleter) {
|
fn extern_complete_flags(mut extern_completer: NuCompleter) {
|
||||||
let suggestions = extern_completer.complete("spam -", 6);
|
let suggestions = extern_completer.complete("spam -", 6);
|
||||||
|
@ -183,11 +183,6 @@ fn flatten_expression_into(
|
|||||||
expr: &Expression,
|
expr: &Expression,
|
||||||
output: &mut Vec<(Span, FlatShape)>,
|
output: &mut Vec<(Span, FlatShape)>,
|
||||||
) {
|
) {
|
||||||
if let Some(custom_completion) = &expr.custom_completion {
|
|
||||||
output.push((expr.span, FlatShape::Custom(*custom_completion)));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
match &expr.expr {
|
match &expr.expr {
|
||||||
Expr::AttributeBlock(ab) => {
|
Expr::AttributeBlock(ab) => {
|
||||||
for attr in &ab.attributes {
|
for attr in &ab.attributes {
|
||||||
|
@ -350,6 +350,7 @@ pub fn parse_for(working_set: &mut StateWorkingSet, lite_command: &LiteCommand)
|
|||||||
shape: var_type.to_shape(),
|
shape: var_type.to_shape(),
|
||||||
var_id: Some(*var_id),
|
var_id: Some(*var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1067,6 +1067,7 @@ pub fn parse_internal_call(
|
|||||||
desc: "".to_string(),
|
desc: "".to_string(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1311,7 +1312,6 @@ pub fn parse_call(working_set: &mut StateWorkingSet, spans: &[Span], head: Span)
|
|||||||
span: _,
|
span: _,
|
||||||
span_id: _,
|
span_id: _,
|
||||||
ty,
|
ty,
|
||||||
custom_completion,
|
|
||||||
} = &alias.clone().wrapped_call
|
} = &alias.clone().wrapped_call
|
||||||
{
|
{
|
||||||
trace!("parsing: alias of external call");
|
trace!("parsing: alias of external call");
|
||||||
@ -1325,14 +1325,13 @@ pub fn parse_call(working_set: &mut StateWorkingSet, spans: &[Span], head: Span)
|
|||||||
final_args.push(arg);
|
final_args.push(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut expression = Expression::new(
|
let expression = Expression::new(
|
||||||
working_set,
|
working_set,
|
||||||
Expr::ExternalCall(head, final_args.into()),
|
Expr::ExternalCall(head, final_args.into()),
|
||||||
Span::concat(spans),
|
Span::concat(spans),
|
||||||
ty.clone(),
|
ty.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
expression.custom_completion = *custom_completion;
|
|
||||||
return expression;
|
return expression;
|
||||||
} else {
|
} else {
|
||||||
trace!("parsing: alias of internal call");
|
trace!("parsing: alias of internal call");
|
||||||
@ -3631,6 +3630,7 @@ pub fn parse_row_condition(working_set: &mut StateWorkingSet, spans: &[Span]) ->
|
|||||||
shape: SyntaxShape::Any,
|
shape: SyntaxShape::Any,
|
||||||
var_id: Some(var_id),
|
var_id: Some(var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
compile_block(working_set, &mut block);
|
compile_block(working_set, &mut block);
|
||||||
@ -3815,6 +3815,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
required: false,
|
required: false,
|
||||||
var_id: Some(var_id),
|
var_id: Some(var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
},
|
},
|
||||||
type_annotated: false,
|
type_annotated: false,
|
||||||
});
|
});
|
||||||
@ -3876,6 +3877,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
required: false,
|
required: false,
|
||||||
var_id: Some(var_id),
|
var_id: Some(var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
},
|
},
|
||||||
type_annotated: false,
|
type_annotated: false,
|
||||||
});
|
});
|
||||||
@ -3918,6 +3920,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
required: false,
|
required: false,
|
||||||
var_id: Some(var_id),
|
var_id: Some(var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
},
|
},
|
||||||
type_annotated: false,
|
type_annotated: false,
|
||||||
});
|
});
|
||||||
@ -3985,6 +3988,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
shape: SyntaxShape::Any,
|
shape: SyntaxShape::Any,
|
||||||
var_id: Some(var_id),
|
var_id: Some(var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
},
|
},
|
||||||
required: false,
|
required: false,
|
||||||
type_annotated: false,
|
type_annotated: false,
|
||||||
@ -4012,6 +4016,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
shape: SyntaxShape::Any,
|
shape: SyntaxShape::Any,
|
||||||
var_id: Some(var_id),
|
var_id: Some(var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
}));
|
}));
|
||||||
parse_mode = ParseMode::Arg;
|
parse_mode = ParseMode::Arg;
|
||||||
}
|
}
|
||||||
@ -4038,6 +4043,7 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
shape: SyntaxShape::Any,
|
shape: SyntaxShape::Any,
|
||||||
var_id: Some(var_id),
|
var_id: Some(var_id),
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
},
|
},
|
||||||
required: true,
|
required: true,
|
||||||
type_annotated: false,
|
type_annotated: false,
|
||||||
@ -4056,22 +4062,49 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
//TODO check if we're replacing a custom parameter already
|
//TODO check if we're replacing a custom parameter already
|
||||||
match last {
|
match last {
|
||||||
Arg::Positional {
|
Arg::Positional {
|
||||||
arg: PositionalArg { shape, var_id, .. },
|
arg:
|
||||||
|
PositionalArg {
|
||||||
|
shape,
|
||||||
|
var_id,
|
||||||
|
custom_completion,
|
||||||
|
..
|
||||||
|
},
|
||||||
required: _,
|
required: _,
|
||||||
type_annotated,
|
type_annotated,
|
||||||
} => {
|
} => {
|
||||||
working_set.set_variable_type(var_id.expect("internal error: all custom parameters must have var_ids"), syntax_shape.to_type());
|
working_set.set_variable_type(var_id.expect("internal error: all custom parameters must have var_ids"), syntax_shape.to_type());
|
||||||
|
// Extract custom_completion from CompleterWrapper if present
|
||||||
|
if let SyntaxShape::CompleterWrapper(_, decl_id) =
|
||||||
|
&syntax_shape
|
||||||
|
{
|
||||||
|
*custom_completion = Some(*decl_id);
|
||||||
|
}
|
||||||
*shape = syntax_shape;
|
*shape = syntax_shape;
|
||||||
*type_annotated = true;
|
*type_annotated = true;
|
||||||
}
|
}
|
||||||
Arg::RestPositional(PositionalArg {
|
Arg::RestPositional(PositionalArg {
|
||||||
shape, var_id, ..
|
shape,
|
||||||
|
var_id,
|
||||||
|
custom_completion,
|
||||||
|
..
|
||||||
}) => {
|
}) => {
|
||||||
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())));
|
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())));
|
||||||
|
// Extract custom_completion from CompleterWrapper if present
|
||||||
|
if let SyntaxShape::CompleterWrapper(_, decl_id) =
|
||||||
|
&syntax_shape
|
||||||
|
{
|
||||||
|
*custom_completion = Some(*decl_id);
|
||||||
|
}
|
||||||
*shape = syntax_shape;
|
*shape = syntax_shape;
|
||||||
}
|
}
|
||||||
Arg::Flag {
|
Arg::Flag {
|
||||||
flag: Flag { arg, var_id, .. },
|
flag:
|
||||||
|
Flag {
|
||||||
|
arg,
|
||||||
|
var_id,
|
||||||
|
custom_completion,
|
||||||
|
..
|
||||||
|
},
|
||||||
type_annotated,
|
type_annotated,
|
||||||
} => {
|
} => {
|
||||||
working_set.set_variable_type(var_id.expect("internal error: all custom parameters must have var_ids"), syntax_shape.to_type());
|
working_set.set_variable_type(var_id.expect("internal error: all custom parameters must have var_ids"), syntax_shape.to_type());
|
||||||
@ -4082,6 +4115,12 @@ pub fn parse_signature_helper(working_set: &mut StateWorkingSet, span: Span) ->
|
|||||||
span,
|
span,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
// Extract custom_completion from CompleterWrapper if present
|
||||||
|
if let SyntaxShape::CompleterWrapper(_, decl_id) =
|
||||||
|
&syntax_shape
|
||||||
|
{
|
||||||
|
*custom_completion = Some(*decl_id);
|
||||||
|
}
|
||||||
*arg = Some(syntax_shape);
|
*arg = Some(syntax_shape);
|
||||||
*type_annotated = true;
|
*type_annotated = true;
|
||||||
}
|
}
|
||||||
@ -5038,10 +5077,9 @@ pub fn parse_value(
|
|||||||
}
|
}
|
||||||
|
|
||||||
match shape {
|
match shape {
|
||||||
SyntaxShape::CompleterWrapper(shape, custom_completion) => {
|
SyntaxShape::CompleterWrapper(shape, _custom_completion) => {
|
||||||
let mut expression = parse_value(working_set, span, shape);
|
// Ignore the custom_completion field since it's now stored in PositionalArg/Flag
|
||||||
expression.custom_completion = Some(*custom_completion);
|
parse_value(working_set, span, shape)
|
||||||
expression
|
|
||||||
}
|
}
|
||||||
SyntaxShape::Number => parse_number(working_set, span),
|
SyntaxShape::Number => parse_number(working_set, span),
|
||||||
SyntaxShape::Float => parse_float(working_set, span),
|
SyntaxShape::Float => parse_float(working_set, span),
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
ast::{Argument, Block, Expr, ExternalArgument, ImportPattern, MatchPattern, RecordItem},
|
ast::{Argument, Block, Expr, ExternalArgument, ImportPattern, MatchPattern, RecordItem},
|
||||||
engine::StateWorkingSet,
|
engine::StateWorkingSet,
|
||||||
BlockId, DeclId, GetSpan, Signature, Span, SpanId, Type, VarId, IN_VARIABLE_ID,
|
BlockId, GetSpan, Signature, Span, SpanId, Type, VarId, IN_VARIABLE_ID,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -15,7 +15,6 @@ pub struct Expression {
|
|||||||
pub span: Span,
|
pub span: Span,
|
||||||
pub span_id: SpanId,
|
pub span_id: SpanId,
|
||||||
pub ty: Type,
|
pub ty: Type,
|
||||||
pub custom_completion: Option<DeclId>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Expression {
|
impl Expression {
|
||||||
@ -26,7 +25,6 @@ impl Expression {
|
|||||||
span,
|
span,
|
||||||
span_id,
|
span_id,
|
||||||
ty: Type::Any,
|
ty: Type::Any,
|
||||||
custom_completion: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,7 +570,6 @@ impl Expression {
|
|||||||
span,
|
span,
|
||||||
span_id,
|
span_id,
|
||||||
ty,
|
ty,
|
||||||
custom_completion: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -582,7 +579,6 @@ impl Expression {
|
|||||||
span,
|
span,
|
||||||
span_id,
|
span_id,
|
||||||
ty,
|
ty,
|
||||||
custom_completion: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -592,7 +588,6 @@ impl Expression {
|
|||||||
span,
|
span,
|
||||||
span_id: SpanId::new(0),
|
span_id: SpanId::new(0),
|
||||||
ty,
|
ty,
|
||||||
custom_completion: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -602,7 +597,6 @@ impl Expression {
|
|||||||
span: self.span,
|
span: self.span,
|
||||||
span_id,
|
span_id,
|
||||||
ty: self.ty,
|
ty: self.ty,
|
||||||
custom_completion: self.custom_completion,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
engine::{Call, Command, CommandType, EngineState, Stack},
|
engine::{Call, Command, CommandType, EngineState, Stack},
|
||||||
BlockId, Example, PipelineData, ShellError, SyntaxShape, Type, Value, VarId,
|
BlockId, DeclId, Example, PipelineData, ShellError, SyntaxShape, Type, Value, VarId,
|
||||||
};
|
};
|
||||||
use nu_derive_value::FromValue;
|
use nu_derive_value::FromValue;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -23,6 +23,7 @@ pub struct Flag {
|
|||||||
// For custom commands
|
// For custom commands
|
||||||
pub var_id: Option<VarId>,
|
pub var_id: Option<VarId>,
|
||||||
pub default_value: Option<Value>,
|
pub default_value: Option<Value>,
|
||||||
|
pub custom_completion: Option<DeclId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The signature definition for a positional argument
|
/// The signature definition for a positional argument
|
||||||
@ -35,6 +36,7 @@ pub struct PositionalArg {
|
|||||||
// For custom commands
|
// For custom commands
|
||||||
pub var_id: Option<VarId>,
|
pub var_id: Option<VarId>,
|
||||||
pub default_value: Option<Value>,
|
pub default_value: Option<Value>,
|
||||||
|
pub custom_completion: Option<DeclId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Command categories
|
/// Command categories
|
||||||
@ -254,6 +256,7 @@ impl Signature {
|
|||||||
required: false,
|
required: false,
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
};
|
};
|
||||||
self.named.push(flag);
|
self.named.push(flag);
|
||||||
self
|
self
|
||||||
@ -318,6 +321,7 @@ impl Signature {
|
|||||||
shape: shape.into(),
|
shape: shape.into(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
self
|
self
|
||||||
@ -336,6 +340,7 @@ impl Signature {
|
|||||||
shape: shape.into(),
|
shape: shape.into(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
self
|
self
|
||||||
@ -353,6 +358,7 @@ impl Signature {
|
|||||||
shape: shape.into(),
|
shape: shape.into(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
self
|
self
|
||||||
@ -392,6 +398,7 @@ impl Signature {
|
|||||||
desc: desc.into(),
|
desc: desc.into(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
self
|
self
|
||||||
@ -415,6 +422,7 @@ impl Signature {
|
|||||||
desc: desc.into(),
|
desc: desc.into(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
self
|
self
|
||||||
@ -437,6 +445,7 @@ impl Signature {
|
|||||||
desc: desc.into(),
|
desc: desc.into(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
});
|
});
|
||||||
|
|
||||||
self
|
self
|
||||||
|
@ -45,6 +45,7 @@ fn test_signature_chained() {
|
|||||||
shape: SyntaxShape::String,
|
shape: SyntaxShape::String,
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -55,6 +56,7 @@ fn test_signature_chained() {
|
|||||||
shape: SyntaxShape::String,
|
shape: SyntaxShape::String,
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@ -65,6 +67,7 @@ fn test_signature_chained() {
|
|||||||
shape: SyntaxShape::String,
|
shape: SyntaxShape::String,
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -78,6 +81,7 @@ fn test_signature_chained() {
|
|||||||
desc: "required named description".to_string(),
|
desc: "required named description".to_string(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -91,6 +95,7 @@ fn test_signature_chained() {
|
|||||||
desc: "required named description".to_string(),
|
desc: "required named description".to_string(),
|
||||||
var_id: None,
|
var_id: None,
|
||||||
default_value: None,
|
default_value: None,
|
||||||
|
custom_completion: None,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user