## Summary This PR builds on the changes in #16220 to pass a target Python version to the parser. It also adds the `Parser::unsupported_syntax_errors` field, which collects version-related syntax errors while parsing. These syntax errors are then turned into `Message`s in ruff (in preview mode). This PR only detects one syntax error (`match` statement before Python 3.10), but it has been pretty quick to extend to several other simple errors (see #16308 for example). ## Test Plan The current tests are CLI tests in the linter crate, but these could be supplemented with inline parser tests after #16357. I also tested the display of these syntax errors in VS Code:   --------- Co-authored-by: Alex Waygood <alex.waygood@gmail.com>
56 lines
1.3 KiB
Rust
56 lines
1.3 KiB
Rust
use ruff_python_ast::{PySourceType, PythonVersion};
|
|
|
|
use crate::{AsMode, Mode};
|
|
|
|
/// Options for controlling how a source file is parsed.
|
|
///
|
|
/// You can construct a [`ParseOptions`] directly from a [`Mode`]:
|
|
///
|
|
/// ```
|
|
/// use ruff_python_parser::{Mode, ParseOptions};
|
|
///
|
|
/// let options = ParseOptions::from(Mode::Module);
|
|
/// ```
|
|
///
|
|
/// or from a [`PySourceType`]
|
|
///
|
|
/// ```
|
|
/// use ruff_python_ast::PySourceType;
|
|
/// use ruff_python_parser::ParseOptions;
|
|
///
|
|
/// let options = ParseOptions::from(PySourceType::Python);
|
|
/// ```
|
|
#[derive(Clone, Debug)]
|
|
pub struct ParseOptions {
|
|
/// Specify the mode in which the code will be parsed.
|
|
pub(crate) mode: Mode,
|
|
/// Target version for detecting version-related syntax errors.
|
|
pub(crate) target_version: PythonVersion,
|
|
}
|
|
|
|
impl ParseOptions {
|
|
#[must_use]
|
|
pub fn with_target_version(mut self, target_version: PythonVersion) -> Self {
|
|
self.target_version = target_version;
|
|
self
|
|
}
|
|
}
|
|
|
|
impl From<Mode> for ParseOptions {
|
|
fn from(mode: Mode) -> Self {
|
|
Self {
|
|
mode,
|
|
target_version: PythonVersion::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<PySourceType> for ParseOptions {
|
|
fn from(source_type: PySourceType) -> Self {
|
|
Self {
|
|
mode: source_type.as_mode(),
|
|
target_version: PythonVersion::default(),
|
|
}
|
|
}
|
|
}
|