fix/allow clippy errors
This commit is contained in:
parent
55acd88f0a
commit
8c52d3668e
9 changed files with 51 additions and 30 deletions
|
@ -28,7 +28,8 @@ let_underscore_must_use = "warn"
|
||||||
manual_clamp = "warn"
|
manual_clamp = "warn"
|
||||||
pedantic = "warn"
|
pedantic = "warn"
|
||||||
str_to_string = "warn"
|
str_to_string = "warn"
|
||||||
unneeded_field_patter = "warn"
|
unneeded_field_pattern = "warn"
|
||||||
|
unnested_or_patterns = "warn"
|
||||||
|
|
||||||
allow_attributes_without_reason = "deny"
|
allow_attributes_without_reason = "deny"
|
||||||
cast_lossles = "deny"
|
cast_lossles = "deny"
|
||||||
|
|
|
@ -8,6 +8,10 @@ pub const TRAIT_NUMERIC: &str = "Num";
|
||||||
|
|
||||||
pub const CMD_ADD: &str = "add";
|
pub const CMD_ADD: &str = "add";
|
||||||
|
|
||||||
|
#[allow(
|
||||||
|
clippy::unwrap_used,
|
||||||
|
reason = "Errs can only be returned in case of duplicate names in the same namespace, which will not happen here"
|
||||||
|
)]
|
||||||
pub fn initialise_globals() -> GlobalNamespace {
|
pub fn initialise_globals() -> GlobalNamespace {
|
||||||
let ns = GlobalNamespace::init();
|
let ns = GlobalNamespace::init();
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,7 @@ use codespan_reporting::{
|
||||||
use crate::{
|
use crate::{
|
||||||
builtins::initialise_globals,
|
builtins::initialise_globals,
|
||||||
error::{ErrorKind, Errors},
|
error::{ErrorKind, Errors},
|
||||||
syntax::{
|
syntax::{check::check, parse_syntax, PipelineElement},
|
||||||
check::{self, check},
|
|
||||||
parse_syntax, PipelineElement,
|
|
||||||
},
|
|
||||||
typed::into_typed_repr,
|
typed::into_typed_repr,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -70,7 +67,7 @@ impl<'a> Evaluator<'a> {
|
||||||
locs: errs,
|
locs: errs,
|
||||||
}],
|
}],
|
||||||
);
|
);
|
||||||
self.curr_phase = EvalPhase::Failed
|
self.curr_phase = EvalPhase::Failed;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -87,42 +84,39 @@ impl<'a> Evaluator<'a> {
|
||||||
self.errors.insert(file_id, errs);
|
self.errors.insert(file_id, errs);
|
||||||
self.curr_phase = EvalPhase::Failed;
|
self.curr_phase = EvalPhase::Failed;
|
||||||
} else {
|
} else {
|
||||||
self.curr_phase = EvalPhase::BareTyped(file_id, syntax.clone())
|
self.curr_phase = EvalPhase::BareTyped(file_id, syntax.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EvalPhase::BareTyped(file_id, syntax) => {
|
EvalPhase::BareTyped(file_id, syntax) => {
|
||||||
let ns = initialise_globals();
|
let ns = initialise_globals();
|
||||||
let r = into_typed_repr(&ns, syntax);
|
let r = into_typed_repr(&ns, syntax);
|
||||||
|
|
||||||
if let Err(errs) = r {
|
match r {
|
||||||
self.errors.insert(file_id, vec![errs]);
|
Ok(typed) => {
|
||||||
self.curr_phase = EvalPhase::Failed;
|
|
||||||
} else {
|
|
||||||
if self.cfg.debug_print_typed_repr {
|
if self.cfg.debug_print_typed_repr {
|
||||||
let typed = r.unwrap();
|
|
||||||
println!("Typed repr: {typed:#?}");
|
println!("Typed repr: {typed:#?}");
|
||||||
}
|
}
|
||||||
|
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
Err(errs) => {
|
||||||
|
self.errors.insert(file_id, vec![errs]);
|
||||||
|
self.curr_phase = EvalPhase::Failed;
|
||||||
}
|
}
|
||||||
EvalPhase::Failed => self.error_out().unwrap(),
|
|
||||||
}
|
}
|
||||||
self.next()
|
}
|
||||||
|
EvalPhase::Failed => self.error_out().expect("unable to print errors"),
|
||||||
|
}
|
||||||
|
self.next();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn error_out(self) -> Result<!, codespan_reporting::files::Error> {
|
pub fn error_out(self) -> Result<!, codespan_reporting::files::Error> {
|
||||||
let Evaluator {
|
let Evaluator { files, errors, .. } = self;
|
||||||
curr_phase,
|
|
||||||
files,
|
|
||||||
errors,
|
|
||||||
cfg,
|
|
||||||
} = self;
|
|
||||||
|
|
||||||
let writer = StandardStream::stderr(ColorChoice::Always);
|
let writer = StandardStream::stderr(ColorChoice::Always);
|
||||||
let config = term::Config::default();
|
let config = term::Config::default();
|
||||||
|
|
||||||
for (file_id, errors) in errors.iter() {
|
for (file_id, errors) in &errors {
|
||||||
let writer = &mut writer.lock();
|
let writer = &mut writer.lock();
|
||||||
for error in errors {
|
for error in errors {
|
||||||
term::emit(writer, &config, &files, &error.into_diag(*file_id, &files))?;
|
term::emit(writer, &config, &files, &error.into_diag(*file_id, &files))?;
|
||||||
|
|
|
@ -5,9 +5,9 @@ use logos::Logos;
|
||||||
pub enum Token<'a> {
|
pub enum Token<'a> {
|
||||||
#[regex("[\\w]+", |lex| lex.slice())]
|
#[regex("[\\w]+", |lex| lex.slice())]
|
||||||
Word(&'a str),
|
Word(&'a str),
|
||||||
#[regex("[\\d]+", priority = 2, callback = |lex| lex.slice().parse::<i64>().unwrap())]
|
#[regex("[\\d]+", priority = 2, callback = |lex| lex.slice().parse::<i64>().expect("regex should only match valid integers. This is a bug."))]
|
||||||
IntLiteral(i64),
|
IntLiteral(i64),
|
||||||
#[regex("[\\d]+\\.[\\d]+", |lex| lex.slice().parse::<f64>().unwrap())]
|
#[regex("[\\d]+\\.[\\d]+", |lex| lex.slice().parse::<f64>().expect("regex should only match valid floats. This is a bug."))]
|
||||||
FloatLiteral(f64),
|
FloatLiteral(f64),
|
||||||
#[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#, |lex| lex.slice().to_owned())]
|
#[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#, |lex| lex.slice().to_owned())]
|
||||||
StringLiteral(String),
|
StringLiteral(String),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#![feature(never_type)]
|
#![feature(never_type, lint_reasons)]
|
||||||
|
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
|
||||||
|
@ -10,7 +10,10 @@ mod args;
|
||||||
mod builtins;
|
mod builtins;
|
||||||
mod error;
|
mod error;
|
||||||
mod evaluator;
|
mod evaluator;
|
||||||
|
|
||||||
|
#[allow(clippy::indexing_slicing, reason = "in logos, outside our control")]
|
||||||
mod lexer;
|
mod lexer;
|
||||||
|
|
||||||
mod namespace;
|
mod namespace;
|
||||||
mod syntax;
|
mod syntax;
|
||||||
mod typed;
|
mod typed;
|
||||||
|
|
|
@ -20,8 +20,14 @@ impl<'a> TypeDef<'a> {
|
||||||
match def {
|
match def {
|
||||||
InternalTypeDef::Single(id) => match id {
|
InternalTypeDef::Single(id) => match id {
|
||||||
// safe to unwrap because this is only used with internal representations
|
// safe to unwrap because this is only used with internal representations
|
||||||
TypeNamespaceId::Types(id) => TypeDef::Type(ns.get_type(*id).unwrap()),
|
TypeNamespaceId::Types(id) => TypeDef::Type(
|
||||||
TypeNamespaceId::Traits(id) => TypeDef::Trait(ns.get_trait(*id).unwrap()),
|
ns.get_type(*id)
|
||||||
|
.expect("Incorrect internal type id. This is a bug."),
|
||||||
|
),
|
||||||
|
TypeNamespaceId::Traits(id) => TypeDef::Trait(
|
||||||
|
ns.get_trait(*id)
|
||||||
|
.expect("Incorrect internal trait id. This is a bug."),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
InternalTypeDef::List(list) => TypeDef::List(
|
InternalTypeDef::List(list) => TypeDef::List(
|
||||||
list.into_iter()
|
list.into_iter()
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
#[allow(clippy::unwrap_used, reason = "these are tests. they may unwrap.")]
|
||||||
mod test;
|
mod test;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|
|
@ -45,6 +45,10 @@ pub fn parse_syntax(input: &str) -> Result<Vec<PipelineElement>, Vec<logos::Span
|
||||||
match tok {
|
match tok {
|
||||||
Token::Pipe => {
|
Token::Pipe => {
|
||||||
if !partial_command.is_empty() {
|
if !partial_command.is_empty() {
|
||||||
|
#[allow(
|
||||||
|
clippy::unwrap_used,
|
||||||
|
reason = "this branch can only run if partial_command isn't empty"
|
||||||
|
)]
|
||||||
let span = partial_command.first().unwrap().span.start
|
let span = partial_command.first().unwrap().span.start
|
||||||
..partial_command.last().unwrap().span.end;
|
..partial_command.last().unwrap().span.end;
|
||||||
r.push(PipelineElement {
|
r.push(PipelineElement {
|
||||||
|
@ -84,6 +88,10 @@ pub fn parse_syntax(input: &str) -> Result<Vec<PipelineElement>, Vec<logos::Span
|
||||||
}
|
}
|
||||||
|
|
||||||
if !partial_command.is_empty() {
|
if !partial_command.is_empty() {
|
||||||
|
#[allow(
|
||||||
|
clippy::unwrap_used,
|
||||||
|
reason = "this branch can only run if partial_command isn't empty"
|
||||||
|
)]
|
||||||
let span =
|
let span =
|
||||||
partial_command.first().unwrap().span.start..partial_command.last().unwrap().span.end;
|
partial_command.first().unwrap().span.start..partial_command.last().unwrap().span.end;
|
||||||
r.push(PipelineElement {
|
r.push(PipelineElement {
|
||||||
|
|
|
@ -31,6 +31,10 @@ pub enum LiteralKind {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LiteralKind {
|
impl LiteralKind {
|
||||||
|
#[allow(
|
||||||
|
clippy::unwrap_used,
|
||||||
|
reason = "these are fetched by type name constants used for keeping names consistent in codebase, which cannot be None"
|
||||||
|
)]
|
||||||
pub fn get_type<'a>(&self, ns: &'a GlobalNamespace) -> Type<'a> {
|
pub fn get_type<'a>(&self, ns: &'a GlobalNamespace) -> Type<'a> {
|
||||||
match self {
|
match self {
|
||||||
LiteralKind::Int(_) => ns.get_type_by_name(TYPE_INTEGER).unwrap(),
|
LiteralKind::Int(_) => ns.get_type_by_name(TYPE_INTEGER).unwrap(),
|
||||||
|
|
Loading…
Reference in a new issue