authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-02-16 00:27:14-08:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-02-16 00:51:53-08:00
logc0f040a1b3c5f865374e3027102048483ec0c0b2
tree11072d5d01b9f0b18bcedd268177c126bf432d31
parentc796d5ef4aa87f2db690d0090873c0c94c3aae04
signaturebadge-check Signed by SSH key SHA256:xbd+BjjhyBfwk7GVoURf9Yx0gzDerHbvYv7SddNWmAs

chore: warns


11 files changed, 45 insertions(+), 73 deletions(-)

Cargo.toml-3
......@@ -19,6 +19,3 @@ serde_json = "1.0"
1919serde_yml = "0.0.12"
2020wasm-bindgen = { version = "0.2" }
2121serde-wasm-bindgen = "0.6.5"
22
23[rust-analyzer.cargo]
24features = ["wasm"]
src/component_transforms.rs+10-10
......@@ -14,27 +14,27 @@ const SUFFIX: &str = "__markodown__";
1414
1515/// Heading component name
1616fn heading_component() -> String {
17 format!("HeadingComponent{}", SUFFIX)
17 format!("HeadingComponent{SUFFIX}")
1818}
1919
2020/// Code block component name
2121fn code_block_component() -> String {
22 format!("CodeBlockComponent{}", SUFFIX)
22 format!("CodeBlockComponent{SUFFIX}")
2323}
2424
2525/// Link component name
2626fn link_component() -> String {
27 format!("LinkComponent{}", SUFFIX)
27 format!("LinkComponent{SUFFIX}")
2828}
2929
3030/// Image component name
3131fn image_component() -> String {
32 format!("ImageComponent{}", SUFFIX)
32 format!("ImageComponent{SUFFIX}")
3333}
3434
3535/// Blockquote component name
3636fn blockquote_component() -> String {
37 format!("BlockquoteComponent{}", SUFFIX)
37 format!("BlockquoteComponent{SUFFIX}")
3838}
3939
4040/// Generate import statements for all configured component imports
......@@ -199,7 +199,7 @@ fn transform_heading(node: &mut Node) {
199199
200200 // Create a new MarkoBlockComplete to replace this node
201201 let mut open = OpenOwned::from_tag_name(&heading_component());
202 open.insert_attr(&format!("level={}", level));
202 open.insert_attr(&format!("level={level}"));
203203
204204 // We need to take ownership of children
205205 let children = std::mem::take(&mut node.children);
......@@ -222,7 +222,7 @@ fn transform_heading(node: &mut Node) {
222222 let level = heading.level;
223223
224224 let mut open = OpenOwned::from_tag_name(&heading_component());
225 open.insert_attr(&format!("level={}", level));
225 open.insert_attr(&format!("level={level}"));
226226
227227 let children = std::mem::take(&mut node.children);
228228
......@@ -241,7 +241,7 @@ fn transform_heading(node: &mut Node) {
241241 if let Some(marko_open) = node.cast_mut::<MarkoOpen>() {
242242 if let Some(level) = parse_heading_level(marko_open.open.as_ref().tag_name()) {
243243 marko_open.open.replace_tag_name(&heading_component());
244 marko_open.open.insert_attr(&format!("level={}", level));
244 marko_open.open.insert_attr(&format!("level={level}"));
245245 }
246246 return;
247247 }
......@@ -250,7 +250,7 @@ fn transform_heading(node: &mut Node) {
250250 if let Some(marko_open) = node.cast_mut::<MarkoOpenWithText>() {
251251 if let Some(level) = parse_heading_level(marko_open.open.as_ref().tag_name()) {
252252 marko_open.open.replace_tag_name(&heading_component());
253 marko_open.open.insert_attr(&format!("level={}", level));
253 marko_open.open.insert_attr(&format!("level={level}"));
254254 }
255255 return;
256256 }
......@@ -259,7 +259,7 @@ fn transform_heading(node: &mut Node) {
259259 if let Some(marko_block) = node.cast_mut::<MarkoBlockComplete>() {
260260 if let Some(level) = parse_heading_level(marko_block.open.as_ref().tag_name()) {
261261 marko_block.open.replace_tag_name(&heading_component());
262 marko_block.open.insert_attr(&format!("level={}", level));
262 marko_block.open.insert_attr(&format!("level={level}"));
263263 // Also update close tag to generic </>
264264 marko_block.close_tag = "</>".to_string();
265265 }
src/lib.rs+5-13
......@@ -156,18 +156,11 @@ pub fn transform(
156156
157157 if let Some(self_path) = self_import {
158158 text = format!(
159 "import Layout__markodown__ from \"{}\";import * as self__markodown__ from \"{}\";\n{}<Layout__markodown__ module=self__markodown__ outline={outline_array}>\n{}</>",
160 layout_path,
161 self_path,
162 hoisted,
163 text
159 "import Layout__markodown__ from \"{layout_path}\";import * as self__markodown__ from \"{self_path}\";\n{hoisted}<Layout__markodown__ module=self__markodown__ outline={outline_array}>\n{text}</>"
164160 );
165161 } else {
166162 text = format!(
167 "import Layout__markodown__ from \"{}\";\n{}<Layout__markodown__ module=null outline={outline_array}>\n{}</>",
168 layout_path,
169 hoisted,
170 text
163 "import Layout__markodown__ from \"{layout_path}\";\n{hoisted}<Layout__markodown__ module=null outline={outline_array}>\n{text}</>"
171164 );
172165 }
173166 } else {
......@@ -245,7 +238,7 @@ fn has_marko_features(node: &markdown_it::Node) -> bool {
245238 || node.cast::<plugin::tags::MarkoOpenWithText>().is_some()
246239 || node.cast::<plugin::tags::MarkoInlineTag>().is_some()
247240 || node.cast::<plugin::tags::MarkoBlockComplete>().is_some()
248 || node.children.iter().any(|child| has_marko_features(child))
241 || node.children.iter().any(has_marko_features)
249242}
250243
251244/// Validate that Marko open/close tags are properly matched
......@@ -299,8 +292,7 @@ fn validate_marko_tags(
299292 // Mismatched: expected </top_name>, got </name>
300293 errors.push(
301294 OxcDiagnostic::error(format!(
302 "Mismatched closing tag: expected </{}>, found </{}>",
303 top_name, name
295 "Mismatched closing tag: expected </{top_name}>, found </{name}>"
304296 ))
305297 .with_labels(vec![
306298 top_span.label("opened here"),
......@@ -337,7 +329,7 @@ fn validate_marko_tags(
337329
338330 // Check for unclosed tags
339331 for (name, span) in stack {
340 errors.push(OxcDiagnostic::error(format!("Unclosed tag <{}>", name)).with_label(span));
332 errors.push(OxcDiagnostic::error(format!("Unclosed tag <{name}>")).with_label(span));
341333 }
342334}
343335
src/marko.rs+9-18
......@@ -1,6 +1,5 @@
11use oxc_diagnostics::OxcDiagnostic;
22use oxc_span::Span;
3use serde_yml::libyml::tag;
43
54use crate::{
65 err,
......@@ -201,12 +200,10 @@ pub fn parse_open(src: &str) -> Result<Open, OxcDiagnostic> {
201200 }
202201 }
203202 }
203 } else if l.expect("/>").is_ok() {
204 self_closing = true;
204205 } else {
205 if l.expect("/>").is_ok() {
206 self_closing = true;
207 } else {
208 l.expect(">")?;
209 }
206 l.expect(">")?;
210207 }
211208
212209 Ok(Open::new(
......@@ -245,13 +242,10 @@ fn parse_tag_name<'a>(l: &mut LexState<'a>) -> Result<&'a str, OxcDiagnostic> {
245242 return Ok("");
246243 }
247244 let start = l.offset;
248 loop {
249 match l.peek_byte() {
250 Some(b'a'..=b'z' | b'A'..=b'Z' | b'_' | b'-' | b'$' | b'@' | b'0'..=b'9') => {
251 l.offset += 1
252 }
253 _ => break,
254 }
245 while let Some(b'a'..=b'z' | b'A'..=b'Z' | b'_' | b'-' | b'$' | b'@' | b'0'..=b'9') =
246 l.peek_byte()
247 {
248 l.offset += 1
255249 }
256250 let tag_name = &l.src[start as usize..l.offset as usize];
257251 if !tag_name.is_empty() {
......@@ -263,11 +257,8 @@ fn parse_tag_name<'a>(l: &mut LexState<'a>) -> Result<&'a str, OxcDiagnostic> {
263257
264258fn parse_attr_name<'a>(l: &mut LexState<'a>) -> Result<&'a str, OxcDiagnostic> {
265259 let start = l.offset;
266 loop {
267 match l.peek_byte() {
268 Some(b'a'..=b'z' | b'A'..=b'Z' | b'_' | b'-' | b':') => l.offset += 1,
269 _ => break,
270 }
260 while let Some(b'a'..=b'z' | b'A'..=b'Z' | b'_' | b'-' | b':') = l.peek_byte() {
261 l.offset += 1;
271262 }
272263 let tag_name = &l.src[start as usize..l.offset as usize];
273264 if !tag_name.is_empty() {
src/marko_ast.rs+5-11
......@@ -53,7 +53,7 @@ impl<'a> Open<'a> {
5353 let mut l = LexState::new(self.src);
5454 l.advance(3);
5555 parse_expr(&mut l).expect("validated text should pass");
56 Span::new(3, l.offset() as u32)
56 Span::new(3, l.offset())
5757 }
5858 }
5959
......@@ -180,7 +180,7 @@ impl OpenOwned {
180180 /// For example: `<Heading#foo class="bar">` with `level=3` → `<Heading#foo level=3 class="bar">`
181181 pub fn insert_attr(&mut self, attr: &str) {
182182 let insert_pos = self.shorthand_end as usize;
183 let insert_str = format!(" {}", attr);
183 let insert_str = format!(" {attr}");
184184 let delta = insert_str.len();
185185
186186 // Build new source
......@@ -208,7 +208,7 @@ impl OpenOwned {
208208 /// Create a new OpenOwned from a tag name (for synthesizing tags).
209209 /// Creates a simple `<tagname>` with no attributes.
210210 pub fn from_tag_name(tag_name: &str) -> Self {
211 let src = format!("<{}>", tag_name);
211 let src = format!("<{tag_name}>");
212212 let tag_name_span = Span::new(1, 1 + tag_name.len() as u32);
213213 OpenOwned {
214214 src,
......@@ -293,14 +293,8 @@ impl<'a> LexState<'a> {
293293 }
294294
295295 pub fn skip_whitespace(&mut self) {
296 loop {
297 match self.peek_byte() {
298 Some(byte) => match byte {
299 b' ' | b'\n' | b'\t' | b'\r' => self.offset += 1,
300 _ => break,
301 },
302 None => break,
303 }
296 while let Some(b' ' | b'\n' | b'\t' | b'\r') = self.peek_byte() {
297 self.offset += 1;
304298 }
305299 }
306300}
src/outline.rs+7-7
......@@ -76,7 +76,7 @@ pub fn generate_slug(text: &str, existing_ids: &mut HashSet<String>) -> String {
7676
7777 let mut counter = 1;
7878 loop {
79 let new_slug = format!("{}-{}", slug, counter);
79 let new_slug = format!("{slug}-{counter}");
8080 if !existing_ids.contains(&new_slug) {
8181 existing_ids.insert(new_slug.clone());
8282 return new_slug;
......@@ -140,7 +140,7 @@ fn collect_recursive(
140140
141141 // Generate component name
142142 *heading_counter += 1;
143 let component_name = format!("Heading_{}__markodown__", heading_counter);
143 let component_name = format!("Heading_{heading_counter}__markodown__");
144144
145145 // Render children before replacing them
146146 let rendered_content = render_children(node);
......@@ -176,7 +176,7 @@ fn collect_recursive(
176176 let id = generate_slug(&text, existing_ids);
177177
178178 *heading_counter += 1;
179 let component_name = format!("Heading_{}__markodown__", heading_counter);
179 let component_name = format!("Heading_{heading_counter}__markodown__");
180180
181181 let rendered_content = render_children(node);
182182
......@@ -208,7 +208,7 @@ fn collect_recursive(
208208 let id = generate_slug(&text, existing_ids);
209209
210210 *heading_counter += 1;
211 let component_name = format!("Heading_{}__markodown__", heading_counter);
211 let component_name = format!("Heading_{heading_counter}__markodown__");
212212
213213 let rendered_content = render_children(node);
214214
......@@ -288,7 +288,7 @@ fn collect_recursive(
288288 };
289289
290290 *heading_counter += 1;
291 let component_name = format!("Heading_{}__markodown__", heading_counter);
291 let component_name = format!("Heading_{heading_counter}__markodown__");
292292
293293 let rendered_content = render_children(node);
294294
......@@ -367,7 +367,7 @@ fn collect_recursive(
367367 };
368368
369369 *heading_counter += 1;
370 let component_name = format!("Heading_{}__markodown__", heading_counter);
370 let component_name = format!("Heading_{heading_counter}__markodown__");
371371
372372 let rendered_content = render_children(node);
373373
......@@ -446,7 +446,7 @@ fn collect_recursive(
446446 };
447447
448448 *heading_counter += 1;
449 let component_name = format!("Heading_{}__markodown__", heading_counter);
449 let component_name = format!("Heading_{heading_counter}__markodown__");
450450
451451 let rendered_content = render_children(node);
452452
src/plugin/frontmatter.rs+2-2
......@@ -147,8 +147,8 @@ pub fn extract_preamble_and_frontmatter(
147147
148148 // Calculate bytes consumed (including the trailing newline after closing ---)
149149 let mut bytes_consumed = 0;
150 for i in 0..end_line {
151 bytes_consumed += lines[i].len() + 1; // +1 for newline
150 for line in lines.iter().take(end_line) {
151 bytes_consumed += line.len() + 1; // +1 for newline
152152 }
153153
154154 // Consume one trailing blank line for separation if present
src/plugin/mod.rs+1-1
......@@ -34,7 +34,7 @@ pub(crate) struct ErrorBlock {
3434}
3535
3636impl NodeValue for ErrorBlock {
37 fn render(&self, _: &Node, r: &mut dyn Renderer) {
37 fn render(&self, _: &Node, _: &mut dyn Renderer) {
3838 panic!("cannot render ErrorBlock");
3939 }
4040}
src/plugin/tags.rs+1-3
......@@ -165,9 +165,7 @@ fn find_same_line_close<'a>(content: &'a str, tag_name: &str) -> Option<(&'a str
165165 }
166166 pos = lt_pos + close.length as usize;
167167 } else {
168 if close.tag_name.is_none() {
169 stack.pop();
170 } else if stack.last() == close.tag_name.as_ref() {
168 if close.tag_name.is_none() || stack.last() == close.tag_name.as_ref() {
171169 stack.pop();
172170 }
173171 pos = lt_pos + close.length as usize;
src/typescript.rs+4-4
......@@ -3,7 +3,7 @@ use crate::{adjust_err, err, marko_ast::LexState};
33
44use oxc_allocator::Allocator;
55use oxc_ast::ast::{Expression, Statement};
6use oxc_diagnostics::{LabeledSpan, OxcDiagnostic};
6use oxc_diagnostics::OxcDiagnostic;
77use oxc_span::{GetSpan, SourceType};
88
99pub fn scan_first_statement_forbid_trailing(source: &str) -> Result<u32, OxcDiagnostic> {
......@@ -13,7 +13,7 @@ pub fn scan_first_statement_forbid_trailing(source: &str) -> Result<u32, OxcDiag
1313 let len = span.end - span.start;
1414
1515 if let Some(trailing) = source[span.end as usize..].lines().next() {
16 if trailing.trim().len() > 0 {
16 if !trailing.trim().is_empty() {
1717 return Err(err(
1818 "Trailing content not allowed here",
1919 span.end + (trailing.len() - trailing.trim_start().len()) as u32,
......@@ -42,7 +42,7 @@ fn parse_stmt_extra<'alloc, 'src: 'alloc>(
4242 .with_typescript(true);
4343
4444 let mut result = oxc_parser::Parser::new(allocator, source, source_type).parse();
45 if !result.errors.is_empty() && result.program.body.len() == 0 {
45 if !result.errors.is_empty() && result.program.body.is_empty() {
4646 let first_err = result
4747 .errors
4848 .into_iter()
......@@ -69,7 +69,7 @@ fn parse_stmt_extra<'alloc, 'src: 'alloc>(
6969 return Err(adjust_err(first_err, offset));
7070 }
7171 result = oxc_parser::Parser::new(allocator, candidate, source_type).parse();
72 if (!result.errors.is_empty() || result.panicked) && result.program.body.len() == 0 {
72 if (!result.errors.is_empty() || result.panicked) && result.program.body.is_empty() {
7373 let before_trim = &candidate[..candidate.len() - 1];
7474 let after_trim = before_trim.trim_end();
7575 if after_trim.len() < before_trim.len() {
src/wasm.rs+1-1
......@@ -49,7 +49,7 @@ fn offset_to_line_col(src: &str, offset: usize) -> (u32, u32) {
4949/// - Takes the first label and absorbs its position into the root error.
5050/// - If there are multiple labels or labels with text, forward them.
5151fn convert_diagnostic(src: &str, diag: &OxcDiagnostic) -> WasmDiagnostic {
52 let labels = diag.labels.as_ref().map(|l| l.as_slice()).unwrap_or(&[]);
52 let labels = diag.labels.as_deref().unwrap_or(&[]);
5353
5454 // Determine root line/column from first label, or default to 1:1
5555 let (line, column) = if let Some(first) = labels.first() {