Add support for var decl spans (#4787)

This commit is contained in:
JT
2022-03-09 04:42:19 -05:00
committed by GitHub
parent 4ddf24269a
commit 2ac990655e
6 changed files with 85 additions and 41 deletions

View File

@ -2,8 +2,8 @@ use nu_engine::CallExt;
use nu_protocol::ast::{Call, Expr, Expression};
use nu_protocol::engine::{Command, EngineState, Stack};
use nu_protocol::{
Category, DataSource, Example, IntoPipelineData, PipelineData, PipelineMetadata, Signature,
Span, SyntaxShape, Value,
Category, DataSource, Example, IntoPipelineData, PipelineData, PipelineMetadata, ShellError,
Signature, Span, SyntaxShape, Value,
};
#[derive(Clone)]
@ -41,7 +41,6 @@ impl Command for Metadata {
match arg {
Some(Expression {
expr: Expr::FullCellPath(full_cell_path),
span,
..
}) => {
if full_cell_path.tail.is_empty() {
@ -50,25 +49,30 @@ impl Command for Metadata {
expr: Expr::Var(var_id),
..
} => {
let origin = stack.get_var_with_origin(*var_id, *span)?;
let variable = engine_state.get_var(*var_id);
Ok(build_metadata_record(&origin, &input.metadata(), head)
.into_pipeline_data())
Ok(build_metadata_record(
Ok(variable.declaration_span),
&input.metadata(),
head,
)
.into_pipeline_data())
}
_ => {
let val: Value = call.req(engine_state, stack, 0)?;
Ok(build_metadata_record(&val, &input.metadata(), head)
Ok(build_metadata_record(val.span(), &input.metadata(), head)
.into_pipeline_data())
}
}
} else {
let val: Value = call.req(engine_state, stack, 0)?;
Ok(build_metadata_record(&val, &input.metadata(), head).into_pipeline_data())
Ok(build_metadata_record(val.span(), &input.metadata(), head)
.into_pipeline_data())
}
}
Some(_) => {
let val: Value = call.req(engine_state, stack, 0)?;
Ok(build_metadata_record(&val, &input.metadata(), head).into_pipeline_data())
Ok(build_metadata_record(val.span(), &input.metadata(), head).into_pipeline_data())
}
None => {
let mut cols = vec![];
@ -113,11 +117,15 @@ impl Command for Metadata {
}
}
fn build_metadata_record(arg: &Value, metadata: &Option<PipelineMetadata>, head: Span) -> Value {
fn build_metadata_record(
span: Result<Span, ShellError>,
metadata: &Option<PipelineMetadata>,
head: Span,
) -> Value {
let mut cols = vec![];
let mut vals = vec![];
if let Ok(span) = arg.span() {
if let Ok(span) = span {
cols.push("span".into());
vals.push(Value::Record {
cols: vec!["start".into(), "end".into()],