this pr refines #8270 and closes #8109 # description examples: the original syntax is okay ```nu def okay [nums: list] {} # the type of list will be list<any> ``` empty annotations are allowed in any variation the last two may be caught by a future formatter, but do not affect `nu` code currently ```nu def okay [nums: list<>] {} # okay def okay [nums: list< >] {} # weird but also okay def okay [nums: list< >] {} # also weird but okay ``` types are allowed (See [notes](#notes) below) ```nu def okay [nums: list<int>] {} # `test [a b c]` will throw an error def okay [nums: list< int > {} # any amount of space within the angle brackets is okay def err [nums: list <int>] {} # this is not okay, `nums` and `<int>` will be parsed as # two separate params, ``` nested annotations are allowed in many variations ```nu def okay [items: list<list<int>>] {} def okay [items: list<list>] {} ``` any unterminated annotation is caught ```nu Error: nu::parser::unexpected_eof × Unexpected end of code. ╭─[source:1:1] 1 │ def err [nums: list<int] {} · ▲ · ╰── expected closing > ╰──── ``` unknown types are flagged ```nu Error: nu::parser::unknown_type × Unknown type. ╭─[source:1:1] 1 │ def err [nums: list<str>] {} · ─┬─ · ╰── unknown type ╰──── Error: nu::parser::unknown_type × Unknown type. ╭─[source:1:1] 1 │ def err [nums: list<int, string>] {} · ─────┬───── · ╰── unknown type ╰──── ``` # notes the error message for mismatched types in not as intuitive ```nu Error: nu::parser::parse_mismatch × Parse mismatch during operation. ╭─[source:1:1] 1 │ def err [nums: list<int>] {}; err [a b c] · ┬ · ╰── expected int ╰──── ``` it should be something like this ```nu Error: nu::parser::parse_mismatch × Parse mismatch during operation. ╭─[source:1:1] 1 │ def err [nums: list<int>] {}; err [a b c] · ──┬── · ╰── expected list<int> ╰──── ``` this is currently not implemented
30 lines
811 B
Rust
30 lines
811 B
Rust
mod deparse;
|
|
mod errors;
|
|
mod eval;
|
|
mod flatten;
|
|
mod known_external;
|
|
mod lex;
|
|
mod lite_parser;
|
|
mod parse_keywords;
|
|
mod parse_patterns;
|
|
mod parser;
|
|
mod type_check;
|
|
|
|
pub use deparse::{escape_for_script_arg, escape_quote_string};
|
|
pub use errors::ParseError;
|
|
pub use flatten::{
|
|
flatten_block, flatten_expression, flatten_pipeline, flatten_pipeline_element, FlatShape,
|
|
};
|
|
pub use known_external::KnownExternal;
|
|
pub use lex::{lex, lex_signature, Token, TokenContents};
|
|
pub use lite_parser::{lite_parse, LiteBlock, LiteElement};
|
|
pub use parse_keywords::*;
|
|
|
|
pub use parser::{
|
|
is_math_expression_like, parse, parse_block, parse_duration_bytes, parse_expression,
|
|
parse_external_call, trim_quotes, trim_quotes_str, unescape_unquote_string,
|
|
};
|
|
|
|
#[cfg(feature = "plugin")]
|
|
pub use parse_keywords::parse_register;
|