pub enum PreprocessorError<'a> {
Show 25 variants
Endif(Span<'a>),
NoEndif(Token<'a>, Span<'a>),
Elsif(Span<'a>),
Else(Span<'a>),
EndKeywords(Span<'a>),
NoEndKeywords(Span<'a>),
InvalidDefineParameter(SpannedToken<'a>),
InvalidDefineArgument(SpannedToken<'a>),
InvalidVersionSpecifier((Option<&'a str>, Span<'a>)),
IncompleteDirective(Span<'a>),
IncompleteDefine(SpannedToken<'a>),
UndefinedMacro((&'a str, Span<'a>)),
DuplicateMacroParameter((&'a str, &'a str, Span<'a>, Span<'a>)),
NoDefaultAfterDefault((SpannedString<'a>, SpannedString<'a>)),
NoMacroArguments((Span<'a>, (&'a str, Span<'a>))),
TooManyMacroArguments((Span<'a>, (&'a str, usize, usize, Span<'a>))),
MissingMacroArgument((Span<'a>, (&'a str, Span<'a>))),
InvalidIdentifierFormation((&'a str, Span<'a>)),
InvalidRelativeTimescales(Span<'a>),
IncompleteMacroWithToken(SpannedToken<'a>),
Include(Span<'a>, String, Error),
IncludeDepth(Span<'a>, Vec<Span<'a>>),
VerboseError(VerboseError<'a>),
NewlineInDefine(Span<'a>),
EndOfFunctionArgument(SpannedToken<'a>),
}Expand description
An error encountered during preprocessing
As preprocessing can affect the interpretation of later source code, these errors are often irrecoverable
Errors marked with INTERNAL are meant for use inside the preprocessor for passing information, and should not be returned
Variants§
Endif(Span<'a>)
An `endif encountered outside a conditional preprocessor block
let source = "
`endif
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::Endif(_))));NoEndif(Token<'a>, Span<'a>)
No terminating `endif for a conditional preprocessor block
let source = "
`ifdef TEST
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::NoEndif(Token::DirIfdef, _))));Elsif(Span<'a>)
An `elsif encountered outside a conditional preprocessor block
let source = "
`elsif
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::Elsif(_))));Else(Span<'a>)
An `else encountered outside a conditional preprocessor block
let source = "
`else
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::Else(_))));EndKeywords(Span<'a>)
An `end_keywords encountered outside a `begin_keywords block
let source = "
`end_keywords
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::EndKeywords(_))));NoEndKeywords(Span<'a>)
No terminating `end_keywords for a `begin_keywords block
let source = "
`begin_keywords \"1800-2009\"
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::NoEndKeywords(_))));InvalidDefineParameter(SpannedToken<'a>)
A missing parameter in a `define function declaration where one is expected
let source = "
`define TEST()
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::InvalidDefineParameter(_))));InvalidDefineArgument(SpannedToken<'a>)
A missing or invalid argument specification in a `define function
let source = "
`define TEST(a, b c)
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::InvalidDefineArgument(_))));InvalidVersionSpecifier((Option<&'a str>, Span<'a>))
An invalid version specifier for a `begin_keywords directive
let source = "
`begin_keywords \"MyVersion\"
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::InvalidVersionSpecifier(_))));IncompleteDirective(Span<'a>)
A directive that doesn’t have all of the required components
In general, PreprocessorError::VerboseError is preferred, but may
not be suitable due to a lack of subsequent tokens
let source = "`line";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::IncompleteDirective(_))));IncompleteDefine(SpannedToken<'a>)
An incomplete preprocessor definition, specifically with function macro arguments
let source = "
`define TEST(
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::IncompleteDefine(_))));UndefinedMacro((&'a str, Span<'a>))
Use of a text macro that wasn’t previously defined
let source = "
`TEST
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::UndefinedMacro(_))));DuplicateMacroParameter((&'a str, &'a str, Span<'a>, Span<'a>))
Specifying a macro parameter that was already specified
let source = "
`define TEST(a, b, a) a + b
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::DuplicateMacroParameter(_))));NoDefaultAfterDefault((SpannedString<'a>, SpannedString<'a>))
Attempting to have a macro parameter with no default value after one that does
let source = "
`define TEST(a = 1, b) a + b
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::NoDefaultAfterDefault(_))));NoMacroArguments((Span<'a>, (&'a str, Span<'a>)))
Specifying no arguments for a macro function that takes arguments
let source = "
`define TEST(a, b) a + b
`TEST
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::NoMacroArguments(_))));TooManyMacroArguments((Span<'a>, (&'a str, usize, usize, Span<'a>)))
Specifying too many arguments for a macro function
let source = "
`define TEST(a, b) a + b
`TEST(1, 2, 3)
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::TooManyMacroArguments(_))));MissingMacroArgument((Span<'a>, (&'a str, Span<'a>)))
Missing an argument in a macro function use
let source = "
`define TEST(a, b) a + b
`TEST(1)
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::MissingMacroArgument(_))));InvalidIdentifierFormation((&'a str, Span<'a>))
An invalid preprocessor identifier specification
let source = "
`define TEST(a, b) a``_with_``b
`TEST(\"one\", \"two\")
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::InvalidIdentifierFormation(_))));InvalidRelativeTimescales(Span<'a>)
A precision that is less precise than the unit in a `timescale directive
let source = "
`timescale 100 fs / 1 s
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::InvalidRelativeTimescales(_))));IncompleteMacroWithToken(SpannedToken<'a>)
An incomplete macro due to mismatching grouping tokens ([], (), or {})
let source = "
`define TEST(a, b) a + b
`TEST(a = 1, b = 2])
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::IncompleteMacroWithToken(_))));Include(Span<'a>, String, Error)
An error reading a file specified by an `include macro
let source = "
`include \"other.v\"
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::Include(_, _, _))));IncludeDepth(Span<'a>, Vec<Span<'a>>)
The maximum include depth was hit, likely as a result of a self-referential
`include sequence
let source = "
`include \"test.v\"
";
state.retain_file(
"test.v".to_string(),
source.to_string(),
&cache,
);
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
assert!(matches!(preprocess_result, Err(PreprocessorError::IncludeDepth(_, _))));VerboseError(VerboseError<'a>)
A VerboseError detailing the expected and found tokens, for a case not covered above
This is most commonly used when we can provide the user with a bit more context
let source = "
`line
";
let input = lex(source, "test.v").tokens();
let preprocess_result = preprocess(
&mut TokenIterator::new(input.into_iter()),
&mut state,
&cache,
);
// Expects a line number
assert!(matches!(preprocess_result, Err(PreprocessorError::VerboseError(_))));NewlineInDefine(Span<'a>)
INTERNAL: A newline encountered in a `define directive
EndOfFunctionArgument(SpannedToken<'a>)
INTERNAL: The end of a function argument was encountered
Trait Implementations§
Source§impl<'a> Debug for PreprocessorError<'a>
impl<'a> Debug for PreprocessorError<'a>
Auto Trait Implementations§
impl<'a> !RefUnwindSafe for PreprocessorError<'a>
impl<'a> !UnwindSafe for PreprocessorError<'a>
impl<'a> Freeze for PreprocessorError<'a>
impl<'a> Send for PreprocessorError<'a>
impl<'a> Sync for PreprocessorError<'a>
impl<'a> Unpin for PreprocessorError<'a>
impl<'a> UnsafeUnpin for PreprocessorError<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);