Compare commits

..

3 Commits

Author SHA1 Message Date
23df7e5429 Merge remote-tracking branch 'origin/main' into paultag/diff 2024-12-12 11:03:22 -05:00
0006d72973 Merge branch 'main' of github.com:KittyCAD/modeling-app into paultag/diff 2024-12-11 10:41:57 -05:00
ea57de0074 More Walk cleanup
- The `Node` type contained two enums by mistake. Those have been
   removed.

 - Export the `Visitor` and `Visitable` traits, as I start to migrate
   stuff to them.

 - Add a wrapper to pull the `digest` off the node without doing a
   `match` elsewhere.
2024-12-10 14:38:44 -05:00
5 changed files with 8 additions and 48 deletions

View File

@ -1,3 +1,3 @@
[codespell]
ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,absolutey,atleast,ue,afterall,ket
ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,absolutey,atleast,ue,afterall
skip: **/target,node_modules,build,**/Cargo.lock,./docs/kcl/*.md,.yarn.lock,**/yarn.lock,./openapi/*.json,./src/lib/machine-api.d.ts

View File

@ -4,7 +4,7 @@
use std::{cell::RefCell, collections::HashMap, str::FromStr};
use winnow::{
combinator::{alt, opt, peek, preceded, repeat, separated, separated_pair, terminated},
combinator::{alt, delimited, opt, peek, preceded, repeat, separated, separated_pair, terminated},
dispatch,
error::{ErrMode, StrContext, StrContextValue},
prelude::*,
@ -1662,24 +1662,12 @@ fn label(i: &mut TokenSlice) -> PResult<Node<Identifier>> {
}
fn unnecessarily_bracketed(i: &mut TokenSlice) -> PResult<Expr> {
let (bra, result, ket) = (
delimited(
terminated(open_paren, opt(whitespace)),
expression,
preceded(opt(whitespace), close_paren),
)
.parse_next(i)?;
let expr_range: SourceRange = (&result).into();
ParseContext::warn(CompilationError::with_suggestion(
SourceRange::new(bra.start, ket.end, result.module_id()),
None,
"Unnecessary parentheses around sub-expression",
Some(("Remove parentheses", i.text(expr_range))),
Tag::Unnecessary,
));
Ok(result)
.parse_next(i)
}
fn expr_allowed_in_pipe_expr(i: &mut TokenSlice) -> PResult<Expr> {
@ -4251,15 +4239,6 @@ var baz = 2
"#
);
}
#[test]
fn warn_unneccessary_parens() {
let some_program_string = r#"foo((a + b))"#;
let (_, errs) = assert_no_err(some_program_string);
assert_eq!(errs.len(), 1);
let replaced = errs[0].apply_suggestion(some_program_string).unwrap();
assert_eq!(replaced, r#"foo(a + b)"#);
}
}
#[cfg(test)]

View File

@ -27,18 +27,11 @@ pub(crate) use tokeniser::RESERVED_WORDS;
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct TokenStream {
tokens: Vec<Token>,
// TODO this could easily be borrowed except that the LSP caches token streams
source: String,
module_id: ModuleId,
}
impl TokenStream {
fn new(tokens: Vec<Token>, source: String, module_id: ModuleId) -> Self {
Self {
tokens,
source,
module_id,
}
fn new(tokens: Vec<Token>) -> Self {
Self { tokens }
}
pub(super) fn remove_unknown(&mut self) -> Vec<Token> {
@ -61,11 +54,6 @@ impl TokenStream {
pub fn as_slice(&self) -> TokenSlice {
TokenSlice::from(self)
}
pub fn text(&self, range: SourceRange) -> &str {
debug_assert_eq!(range.module_id(), self.module_id);
&self.source[range.start()..range.end()]
}
}
impl<'a> From<&'a TokenStream> for TokenSlice<'a> {
@ -108,10 +96,6 @@ impl<'a> TokenSlice<'a> {
&self.stream.tokens[i + self.start]
}
pub fn text(&self, range: SourceRange) -> &str {
self.stream.text(range)
}
pub fn iter(&self) -> impl Iterator<Item = &Token> {
(**self).iter()
}

View File

@ -69,11 +69,7 @@ pub(super) fn lex(i: &str, module_id: ModuleId) -> Result<TokenStream, ParseErro
input: Located::new(i),
state,
};
Ok(TokenStream::new(
repeat(0.., token).parse(input)?,
i.to_owned(),
module_id,
))
Ok(TokenStream::new(repeat(0.., token).parse(input)?))
}
pub(super) type Input<'a> = Stateful<Located<&'a str>, State>;

View File

@ -3,4 +3,5 @@ mod ast_visitor;
mod ast_walk;
pub use ast_node::Node;
pub use ast_visitor::{Visitable, Visitor};
pub use ast_walk::walk;