mirror of
https://github.com/nushell/nushell.git
synced 2025-06-12 13:06:49 +02:00
change one-of syntax to use (type_a | type_b) syntax
This commit is contained in:
parent
c7224be3cd
commit
70dc4a3006
@ -64,17 +64,12 @@ pub fn parse_shape_name(
|
|||||||
b"number" => SyntaxShape::Number,
|
b"number" => SyntaxShape::Number,
|
||||||
b"path" => SyntaxShape::Filepath,
|
b"path" => SyntaxShape::Filepath,
|
||||||
b"range" => SyntaxShape::Range,
|
b"range" => SyntaxShape::Range,
|
||||||
_ if bytes.starts_with(b"one_of")
|
_ if bytes.starts_with(b"list")
|
||||||
|| bytes.starts_with(b"list")
|
|
||||||
|| bytes.starts_with(b"record")
|
|| bytes.starts_with(b"record")
|
||||||
|| bytes.starts_with(b"table") =>
|
|| bytes.starts_with(b"table") =>
|
||||||
{
|
{
|
||||||
let (type_name, type_params) = split_generic_params(working_set, bytes, span);
|
let (type_name, type_params) = split_generic_params(working_set, bytes, span);
|
||||||
match type_name {
|
match type_name {
|
||||||
b"one_of" => SyntaxShape::OneOf(match type_params {
|
|
||||||
Some(params) => parse_type_params(working_set, params, use_loc),
|
|
||||||
None => vec![],
|
|
||||||
}),
|
|
||||||
b"list" => SyntaxShape::List(Box::new(match type_params {
|
b"list" => SyntaxShape::List(Box::new(match type_params {
|
||||||
Some(params) => {
|
Some(params) => {
|
||||||
let mut parsed_params = parse_type_params(working_set, params, use_loc);
|
let mut parsed_params = parse_type_params(working_set, params, use_loc);
|
||||||
@ -106,6 +101,11 @@ pub fn parse_shape_name(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
b"string" => SyntaxShape::String,
|
b"string" => SyntaxShape::String,
|
||||||
|
_ if bytes.starts_with(b"(") && bytes.ends_with(b")") => {
|
||||||
|
let source =
|
||||||
|
bytes[1..(bytes.len() - 1)].into_spanned(Span::new(span.start + 1, span.end - 1));
|
||||||
|
parse_one_of(working_set, source, use_loc)
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if bytes.contains(&b'@') {
|
if bytes.contains(&b'@') {
|
||||||
let mut split = bytes.splitn(2, |b| b == &b'@');
|
let mut split = bytes.splitn(2, |b| b == &b'@');
|
||||||
@ -161,10 +161,9 @@ fn split_generic_params<'a>(
|
|||||||
bytes: &'a [u8],
|
bytes: &'a [u8],
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> (&'a [u8], Option<Spanned<&'a [u8]>>) {
|
) -> (&'a [u8], Option<Spanned<&'a [u8]>>) {
|
||||||
let n = bytes.iter().position(|&c| c == b'<' || c == b'(');
|
let n = bytes.iter().position(|&c| c == b'<');
|
||||||
let (open_delim_pos, close_delim) = match n.and_then(|n| Some((n, bytes.get(n)?))) {
|
let (open_delim_pos, close_delim) = match n.and_then(|n| Some((n, bytes.get(n)?))) {
|
||||||
Some((n, b'<')) => (n, b'>'),
|
Some((n, b'<')) => (n, b'>'),
|
||||||
Some((n, b'(')) => (n, b')'),
|
|
||||||
_ => return (bytes, None),
|
_ => return (bytes, None),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -313,3 +312,44 @@ fn parse_type_params(
|
|||||||
|
|
||||||
sig
|
sig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_one_of(
|
||||||
|
working_set: &mut StateWorkingSet,
|
||||||
|
Spanned { item: source, span }: Spanned<&[u8]>,
|
||||||
|
use_loc: ShapeDescriptorUse,
|
||||||
|
) -> SyntaxShape {
|
||||||
|
let (tokens, err) = lex_signature(source, span.start, &[b'\n', b'\r'], &[b':', b','], true);
|
||||||
|
|
||||||
|
if let Some(err) = err {
|
||||||
|
working_set.error(err);
|
||||||
|
return SyntaxShape::Any;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut sig = vec![];
|
||||||
|
|
||||||
|
let mut tokens = tokens.into_iter().peekable();
|
||||||
|
while let Some(token) = tokens.next() {
|
||||||
|
let TokenContents::Item = token.contents else {
|
||||||
|
working_set.error(ParseError::Expected("a type", token.span));
|
||||||
|
return SyntaxShape::Any;
|
||||||
|
};
|
||||||
|
|
||||||
|
let shape_bytes = working_set.get_span_contents(token.span).to_vec();
|
||||||
|
let shape = parse_shape_name(working_set, &shape_bytes, token.span, use_loc);
|
||||||
|
sig.push(shape);
|
||||||
|
|
||||||
|
let Some(token_pipe) = tokens.next() else {
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
match token_pipe.contents {
|
||||||
|
TokenContents::Pipe => {}
|
||||||
|
_ => {
|
||||||
|
working_set.error(ParseError::Expected("pipe '|'", token_pipe.span));
|
||||||
|
return SyntaxShape::Any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SyntaxShape::OneOf(sig)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user