add custom_completion field to .scope command
@@ -7,7 +7,7 @@ use nu_protocol::ast::{Block, Call, Expr, Expression, Operator};
use nu_protocol::engine::{EngineState, Stack, Visibility};
use nu_protocol::{
IntoInterruptiblePipelineData, IntoPipelineData, PipelineData, Range, ShellError, Span,
- Spanned, Unit, Value, VarId, ENV_VARIABLE_ID,
+ Spanned, SyntaxShape, Unit, Value, VarId, ENV_VARIABLE_ID,
};
use crate::{current_dir_str, get_full_help};
@@ -760,6 +760,17 @@ pub fn eval_subexpression(
Ok(input)
}
+fn extract_custom_completion_from_arg(engine_state: &EngineState, shape: &SyntaxShape) -> String {
+ return match shape {
+ SyntaxShape::Custom(_, custom_completion_decl_id) => {
+ let custom_completion_command = engine_state.get_decl(*custom_completion_decl_id);
+ let custom_completion_command_name: &str = &*custom_completion_command.name();
+ custom_completion_command_name.to_string()
+ }
+ _ => "".to_string(),
+ };
+}
+
pub fn create_scope(
engine_state: &EngineState,
stack: &Stack,
@@ -852,6 +863,7 @@ pub fn create_scope(
"is_optional".to_string(),
"short_flag".to_string(),
"description".to_string(),
+ "custom_completion".to_string(),
];
// required_positional
@@ -864,6 +876,10 @@ pub fn create_scope(
Value::boolean(false, span),
Value::nothing(span),
Value::string(req.desc, span),
+ Value::string(
+ extract_custom_completion_from_arg(engine_state, &req.shape),
+ span,
+ ),
];
sig_records.push(Value::Record {
@@ -883,6 +899,10 @@ pub fn create_scope(
Value::boolean(true, span),
Value::nothing(span),
Value::string(opt.desc, span),
+ Value::string(
+ extract_custom_completion_from_arg(engine_state, &opt.shape),
+ span,
+ ),
];
sig_records.push(Value::Record {
@@ -903,6 +923,10 @@ pub fn create_scope(
Value::boolean(true, span),
Value::nothing(span),
Value::string(rest.desc, span),
+ Value::string(
+ extract_custom_completion_from_arg(engine_state, &rest.shape),
+ span,
+ ),
];
sig_records.push(Value::Record {
@@ -922,8 +946,11 @@ pub fn create_scope(
continue;
}
+ let mut custom_completion_command_name: String = "".to_string();
let shape = if let Some(arg) = named.arg {
flag_type = Value::string("named", span);
+ custom_completion_command_name =
+ extract_custom_completion_from_arg(engine_state, &arg);
Value::string(arg.to_string(), span)
} else {
flag_type = Value::string("switch", span);
@@ -944,6 +971,7 @@ pub fn create_scope(
Value::boolean(!named.required, span),
short_flag,
Value::string(named.desc, span),
+ Value::string(custom_completion_command_name, span),
];
sig_records.push(Value::Record {
