From e55ee301c605c22eb5d8afd05413be43d0c7acbc Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Thu, 26 Jun 2025 20:46:41 -0400 Subject: [PATCH 1/3] internal: bump rust to 1.88.0 --- Cargo.toml | 4 ++-- PLAN.md | 9 +++++++++ crates/squawk_github/Cargo.toml | 9 +++------ rust-toolchain.toml | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fc321699..e7ecfcd6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,8 @@ members = ["crates/*"] resolver = "2" [workspace.package] -edition = "2021" -rust-version = "1.81.0" +edition = "2024" +rust-version = "1.88.0" authors = ["Squawk Team & Contributors"] license = "Apache-2.0 OR MIT" diff --git a/PLAN.md b/PLAN.md index d2d0cfd3..ed49980c 100644 --- a/PLAN.md +++ b/PLAN.md @@ -449,6 +449,15 @@ select name, created from u join t using (t_id); select name, u.created from u join t using (t_id); ``` +### Rule: invalid literal + +Check for invalid literals + +```sql +select '{"foo": 1,}'::json; +-- ^ invalid json, unexpected trailing comma +``` + ### Rule: column label is the same as an existing column ```sql diff --git a/crates/squawk_github/Cargo.toml b/crates/squawk_github/Cargo.toml index 7393287a..212472fe 100644 --- a/crates/squawk_github/Cargo.toml +++ b/crates/squawk_github/Cargo.toml @@ -1,13 +1,10 @@ [package] name = "squawk_github" version = "0.0.0" -authors = ["Steve Dignam "] -edition = "2018" +authors.workspace = true +edition.workspace = true license.workspace = true -description = "Postgres SQL linter Github APIs used in Squawk" -repository = "https://github.com/sbdchd/squawk" -readme = "README.md" -keywords = ["bot", "github", "linter"] +readme.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/rust-toolchain.toml b/rust-toolchain.toml index b140484c..01818ea2 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] targets = ["x86_64-unknown-linux-gnu", "x86_64-apple-darwin", "aarch64-apple-darwin"] -channel = "1.84.0" +channel = "1.88.0" From da1cd65b157554df72238a0c10eebe554086b739 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Thu, 26 Jun 2025 20:58:18 -0400 Subject: [PATCH 2/3] fix lint --- crates/squawk/src/debug.rs | 8 ++--- crates/squawk/src/main.rs | 4 +-- crates/squawk_github/Cargo.toml | 5 ++- crates/squawk_linter/src/lib.rs | 8 ++--- crates/squawk_parser/src/grammar.rs | 32 +++++++------------ crates/squawk_parser/tests/tests.rs | 9 +++--- crates/xtask/src/codegen.rs | 10 +++--- crates/xtask/src/download_regression_tests.rs | 14 ++++---- crates/xtask/src/new_rule.rs | 4 +-- 9 files changed, 44 insertions(+), 50 deletions(-) diff --git a/crates/squawk/src/debug.rs b/crates/squawk/src/debug.rs index c4c3d5e5..4f7ddf20 100644 --- a/crates/squawk/src/debug.rs +++ b/crates/squawk/src/debug.rs @@ -6,8 +6,8 @@ use serde_json::json; use squawk_syntax::{ast::AstNode, syntax_error::SyntaxError}; use crate::{ - file::{sql_from_path, sql_from_stdin}, DebugOption, + file::{sql_from_path, sql_from_stdin}, }; pub(crate) fn debug( @@ -26,9 +26,9 @@ pub(crate) fn debug( if verbose { let content = &sql[start as usize..(start + token.len) as usize]; start += token.len; - writeln!(f, "{:?} @ {:?}", content, token.kind)?; + writeln!(f, "{content:?} @ {:?}", token.kind)?; } else { - writeln!(f, "{:?}", token)?; + writeln!(f, "{token:?}")?; } } } @@ -54,7 +54,7 @@ pub(crate) fn debug( snap += &format!("@{:?}:{:?} {:?}", range.start(), range.end(), text); } } - writeln!(f, "{}", snap)?; + writeln!(f, "{snap}")?; let renderer = Renderer::styled(); render_syntax_errors(&errors, filename, sql, |message| { writeln!(f, "{}", renderer.render(message))?; diff --git a/crates/squawk/src/main.rs b/crates/squawk/src/main.rs index 4b40e0e3..494e02f5 100644 --- a/crates/squawk/src/main.rs +++ b/crates/squawk/src/main.rs @@ -204,10 +204,10 @@ Please open an issue at https://github.com/sbdchd/squawk/issues/new with the log conf.assume_in_transaction.unwrap_or_default() }; - info!("pg version: {:?}", pg_version); + info!("pg version: {pg_version:?}"); info!("excluded rules: {:?}", &excluded_rules); info!("excluded paths: {:?}", &excluded_paths); - info!("assume in a transaction: {:?}", assume_in_transaction); + info!("assume in a transaction: {assume_in_transaction:?}"); let mut clap_app = Opt::clap(); let stdout = io::stdout(); diff --git a/crates/squawk_github/Cargo.toml b/crates/squawk_github/Cargo.toml index 212472fe..b4363f37 100644 --- a/crates/squawk_github/Cargo.toml +++ b/crates/squawk_github/Cargo.toml @@ -4,7 +4,10 @@ version = "0.0.0" authors.workspace = true edition.workspace = true license.workspace = true -readme.workspace = true +description = "Postgres SQL linter Github APIs used in Squawk" +repository = "https://github.com/sbdchd/squawk" +readme = "README.md" +keywords = ["bot", "github", "linter"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/squawk_linter/src/lib.rs b/crates/squawk_linter/src/lib.rs index 0327fd18..2da41aff 100644 --- a/crates/squawk_linter/src/lib.rs +++ b/crates/squawk_linter/src/lib.rs @@ -1,10 +1,10 @@ use std::collections::HashSet; use std::fmt; -use enum_iterator::all; use enum_iterator::Sequence; -use ignore::find_ignores; +use enum_iterator::all; pub use ignore::Ignore; +use ignore::find_ignores; use ignore_index::IgnoreIndex; use lazy_static::lazy_static; use rowan::TextRange; @@ -152,7 +152,7 @@ impl TryFrom<&str> for Rule { "ban-alter-domain-with-add-constraint" => Ok(Rule::BanAlterDomainWithAddConstraint), "ban-truncate-cascade" => Ok(Rule::BanTruncateCascade), // xtask:new-rule:str-name - _ => Err(format!("Unknown violation name: {}", s)), + _ => Err(format!("Unknown violation name: {s}")), } } } @@ -211,7 +211,7 @@ impl fmt::Display for Rule { Rule::BanTruncateCascade => "ban-truncate-cascade", // xtask:new-rule:variant-to-name }; - write!(f, "{}", val) + write!(f, "{val}") } } diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 7e48425f..4b3a6e57 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -2,13 +2,13 @@ // https://github.com/rust-lang/rust-analyzer/tree/d8887c0758bbd2d5f752d5bd405d4491e90e7ed6/crates/parser/src/grammar use crate::{ + CompletedMarker, Marker, Parser, generated::token_sets::{ ALL_KEYWORDS, BARE_LABEL_KEYWORDS, COLUMN_OR_TABLE_KEYWORDS, RESERVED_KEYWORDS, TYPE_KEYWORDS, UNRESERVED_KEYWORDS, }, syntax_kind::SyntaxKind::{self, *}, token_set::TokenSet, - CompletedMarker, Marker, Parser, }; const EXPR_RECOVERY_SET: TokenSet = TokenSet::new(&[ @@ -2951,7 +2951,7 @@ fn from_item_name(p: &mut Parser<'_>) { } } got => { - p.error(format!("expected a name, got {:?}", got)); + p.error(format!("expected a name, got {got:?}")); } }, None => p.error("expected name"), @@ -3829,11 +3829,7 @@ fn operator(p: &mut Parser<'_>) { pub(crate) fn current_operator(p: &Parser<'_>) -> Option { let (power, kind, _) = current_op(p, &Restrictions::default()); - if power == 0 { - None - } else { - Some(kind) - } + if power == 0 { None } else { Some(kind) } } fn using_index(p: &mut Parser<'_>) { @@ -5565,7 +5561,7 @@ fn stmt(p: &mut Parser, r: &StmtRestrictions) -> Option { // commands are outlined in: // https://www.postgresql.org/docs/17/sql-commands.html // TODO: see error recovery in rust-analyzer's expr_bp - p.err_and_bump(&format!("expected command, found {:?}", command)); + p.err_and_bump(&format!("expected command, found {command:?}")); // m.abandon(p); None } @@ -8643,8 +8639,7 @@ fn create_materialized_view(p: &mut Parser<'_>) -> CompletedMarker { Some(SELECT | SELECT_INTO | COMPOUND_SELECT | TABLE | VALUES) => (), Some(kind) => { p.error(format!( - "expected SELECT, TABLE, or VALUES statement, got {:?}", - kind + "expected SELECT, TABLE, or VALUES statement, got {kind:?}" )); } None => { @@ -8960,8 +8955,7 @@ fn select_insert_delete_update_or_notify(p: &mut Parser<'_>) { SELECT | VALUES | INSERT | UPDATE | DELETE | NOTIFY => (), kind => { p.error(format!( - "expected SELECT, INSERT, UPDATE, DELETE, NOTIFY, or VALUES statement, got {:?}", - kind + "expected SELECT, INSERT, UPDATE, DELETE, NOTIFY, or VALUES statement, got {kind:?}" )); } } @@ -9953,8 +9947,7 @@ fn explain(p: &mut Parser<'_>) -> CompletedMarker { | PAREN_SELECT => (), kind => { p.error(format!( - "expected SELECT, INSERT, UPDATE, DELETE, MERGE, or VALUES statement, got {:?}", - kind + "expected SELECT, INSERT, UPDATE, DELETE, MERGE, or VALUES statement, got {kind:?}", )); } } @@ -10906,8 +10899,7 @@ fn reindex(p: &mut Parser<'_>) -> CompletedMarker { } kind => { p.error(format!( - "expected CONCURRENTLY, TABLESPACE, or VERBOSE option, got {:?}", - kind + "expected CONCURRENTLY, TABLESPACE, or VERBOSE option, got {kind:?}", )); break; } @@ -10979,7 +10971,7 @@ fn create_view(p: &mut Parser<'_>) -> CompletedMarker { match stmt(p, &StmtRestrictions::default()) { Some(statement) => match statement.kind() { SELECT | COMPOUND_SELECT | SELECT_INTO | VALUES | TABLE => (), - kind => p.error(format!("expected SELECT, got {:?}", kind)), + kind => p.error(format!("expected SELECT, got {kind:?}")), }, None => p.error("expected SELECT"), } @@ -11178,8 +11170,7 @@ fn declare(p: &mut Parser<'_>) -> CompletedMarker { Some(SELECT | SELECT_INTO | COMPOUND_SELECT | TABLE | VALUES) => (), Some(kind) => { p.error(format!( - "expected SELECT, TABLE, or VALUES statement, got {:?}", - kind + "expected SELECT, TABLE, or VALUES statement, got {kind:?}", )); } None => { @@ -11609,8 +11600,7 @@ fn preparable_stmt(p: &mut Parser<'_>) { ) => (), Some(kind) => { p.error(format!( - "expected SELECT, TABLE, VALUES, INSERT, UPDATE, DELETE, or MERGE statement, got {:?}", - kind + "expected SELECT, TABLE, VALUES, INSERT, UPDATE, DELETE, or MERGE statement, got {kind:?}" )); } None => { diff --git a/crates/squawk_parser/tests/tests.rs b/crates/squawk_parser/tests/tests.rs index b06a5e1d..1f1c42fa 100644 --- a/crates/squawk_parser/tests/tests.rs +++ b/crates/squawk_parser/tests/tests.rs @@ -1,8 +1,8 @@ // based on https://github.com/rust-lang/rust-analyzer/blob/d8887c0758bbd2d5f752d5bd405d4491e90e7ed6/crates/parser/src/tests.rs use camino::Utf8Path; -use dir_test::{dir_test, Fixture}; +use dir_test::{Fixture, dir_test}; use insta::{assert_snapshot, with_settings}; -use squawk_parser::{parse, LexedStr}; +use squawk_parser::{LexedStr, parse}; use std::fmt::Write; #[dir_test( @@ -39,8 +39,7 @@ fn parser_ok(fixture: Fixture<&str>) { if let Err(e) = &pg_result { assert!( &pg_result.is_ok(), - "tests defined in the `ok` can't have Postgres parser errors. Found {}", - e + "tests defined in the `ok` can't have Postgres parser errors. Found {e}", ); } } @@ -93,7 +92,7 @@ fn regression_suite(fixture: Fixture<&str>) { let (_parsed, errors) = parse_text(content); - let snapshot_name = format!("regression_{}", test_name); + let snapshot_name = format!("regression_{test_name}"); with_settings!({ omit_expression => true, diff --git a/crates/xtask/src/codegen.rs b/crates/xtask/src/codegen.rs index 2856efae..c1d17f4b 100644 --- a/crates/xtask/src/codegen.rs +++ b/crates/xtask/src/codegen.rs @@ -29,10 +29,10 @@ use anyhow::{Context, Result}; use convert_case::{Case, Casing}; use quote::{format_ident, quote}; use ungrammar::{Grammar, Rule}; -use xshell::{cmd, Shell}; +use xshell::{Shell, cmd}; use crate::{ - keywords::{keyword_kinds, KeywordKinds}, + keywords::{KeywordKinds, keyword_kinds}, path::project_root, }; @@ -623,7 +623,9 @@ fn lower_rule(acc: &mut Vec, grammar: &Grammar, label: Option<&String>, r acc.push(field); return; } - panic!("unhandled rule: {rule:?}. Instead of `'foo' T (',', T)`, write `'foo' (T (',', T))`"); + panic!( + "unhandled rule: {rule:?}. Instead of `'foo' T (',', T)`, write `'foo' (T (',', T))`" + ); } Rule::Labeled { label: l, rule } => { assert!(label.is_none()); @@ -678,7 +680,7 @@ fn lower_separated_list( if !matches!( repeat.as_slice(), [comma, Rule::Node(n)] - if trailing_sep.map_or(true, |it| comma == &**it) && n == node + if trailing_sep.is_none_or(|it| comma == &**it) && n == node ) { return false; } diff --git a/crates/xtask/src/download_regression_tests.rs b/crates/xtask/src/download_regression_tests.rs index cc26832f..33ff0758 100644 --- a/crates/xtask/src/download_regression_tests.rs +++ b/crates/xtask/src/download_regression_tests.rs @@ -1,7 +1,7 @@ -use anyhow::{bail, Result}; +use anyhow::{Result, bail}; use camino::Utf8PathBuf; use regex::Regex; -use std::fs::{create_dir_all, remove_dir_all, File}; +use std::fs::{File, create_dir_all, remove_dir_all}; use std::io::{BufRead, Cursor, Write}; use std::process::Command; @@ -11,7 +11,7 @@ pub(crate) fn download_regression_tests() -> Result<()> { let target_dir = Utf8PathBuf::from(OUTPUT_DIR); if target_dir.exists() { - println!("Cleaning target directory: {:?}", target_dir); + println!("Cleaning target directory: {target_dir:?}"); remove_dir_all(&target_dir)?; } @@ -21,7 +21,7 @@ pub(crate) fn download_regression_tests() -> Result<()> { let total_files = urls.len(); for (index, url) in urls.iter().enumerate() { - let filename = url.split('/').last().unwrap(); + let filename = url.split('/').next_back().unwrap(); if filename.contains("psql") { // skipping this for now, we don't support psql continue; @@ -51,7 +51,7 @@ pub(crate) fn download_regression_tests() -> Result<()> { let cursor = Cursor::new(&output.stdout); if let Err(e) = preprocess_sql(cursor, &mut processed_content) { - eprintln!("Error: Failed to process file: {}", e); + eprintln!("Error: Failed to process file: {e}"); continue; } @@ -195,7 +195,7 @@ fn preprocess_sql(source: R, mut dest: W) -> Result<()> { let m = caps.get(1).or_else(|| caps.get(2)).unwrap(); let matched_var = &remaining[m.start()..m.end()]; - println!("#{} Replacing template variable {}", idx, matched_var); + println!("#{idx} Replacing template variable {matched_var}"); result.push('\''); result.push_str(matched_var); @@ -213,7 +213,7 @@ fn preprocess_sql(source: R, mut dest: W) -> Result<()> { } // Write the cleaned line - writeln!(dest, "{}", result)?; + writeln!(dest, "{result}")?; } Ok(()) diff --git a/crates/xtask/src/new_rule.rs b/crates/xtask/src/new_rule.rs index cd91bcd6..3a94ae58 100644 --- a/crates/xtask/src/new_rule.rs +++ b/crates/xtask/src/new_rule.rs @@ -1,7 +1,7 @@ use anyhow::Result; use convert_case::{Case, Casing}; -use crate::{path::project_root, NewRuleArgs}; +use crate::{NewRuleArgs, path::project_root}; use std::fs; fn make_lint(name: &str) -> String { @@ -72,7 +72,7 @@ mod test {{ fn create_rule_file(name: &str) -> Result<()> { let name = name.to_case(Case::Snake); let root = project_root(); - let lint_path = root.join(format!("crates/squawk_linter/src/rules/{}.rs", name)); + let lint_path = root.join(format!("crates/squawk_linter/src/rules/{name}.rs")); if fs::exists(&lint_path)? { println!("skipping rule file creation, it already exists {lint_path}"); From dab47e5521b5f72cec478c82b29bffc5e17b7dc3 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Thu, 26 Jun 2025 21:02:36 -0400 Subject: [PATCH 3/3] fix --- crates/squawk/src/github.rs | 14 +++++------- crates/squawk/src/reporter.rs | 22 ++++++++++++++----- crates/squawk_lexer/src/lib.rs | 2 +- crates/squawk_linter/src/ignore.rs | 2 +- .../rules/adding_foreign_key_constraint.rs | 2 +- .../src/rules/adding_not_null_field.rs | 2 +- .../rules/adding_primary_key_constraint.rs | 2 +- .../src/rules/adding_required_field.rs | 2 +- .../ban_alter_domain_with_add_constraint.rs | 2 +- .../squawk_linter/src/rules/ban_char_field.rs | 2 +- ...oncurrent_index_creation_in_transaction.rs | 2 +- .../ban_create_domain_with_constraint.rs | 2 +- .../src/rules/ban_drop_column.rs | 2 +- .../src/rules/ban_drop_database.rs | 2 +- .../src/rules/ban_drop_not_null.rs | 2 +- .../squawk_linter/src/rules/ban_drop_table.rs | 2 +- .../src/rules/ban_truncate_cascade.rs | 2 +- .../src/rules/changing_column_type.rs | 2 +- .../src/rules/constraint_missing_not_valid.rs | 4 ++-- .../src/rules/disallow_unique_constraint.rs | 4 ++-- .../src/rules/prefer_bigint_over_int.rs | 2 +- .../src/rules/prefer_bigint_over_smallint.rs | 2 +- .../src/rules/prefer_identity.rs | 2 +- .../src/rules/prefer_robust_stmts.rs | 4 ++-- .../src/rules/prefer_text_field.rs | 4 ++-- .../src/rules/prefer_timestamptz.rs | 4 ++-- .../src/rules/renaming_column.rs | 2 +- .../squawk_linter/src/rules/renaming_table.rs | 2 +- .../require_concurrent_index_creation.rs | 4 ++-- .../require_concurrent_index_deletion.rs | 2 +- .../src/rules/transaction_nesting.rs | 2 +- crates/squawk_linter/src/version.rs | 2 +- crates/squawk_linter/src/visitors.rs | 2 +- .../squawk_syntax/src/ast/generated/nodes.rs | 4 ++-- .../squawk_syntax/src/ast/generated/tokens.rs | 2 +- crates/squawk_syntax/src/ast/traits.rs | 2 +- crates/squawk_syntax/src/lib.rs | 10 +++++---- crates/squawk_syntax/src/syntax_node.rs | 2 +- crates/squawk_syntax/src/test.rs | 2 +- crates/squawk_syntax/src/validation.rs | 2 +- crates/xtask/src/keywords.rs | 2 +- crates/xtask/src/main.rs | 2 +- 42 files changed, 74 insertions(+), 64 deletions(-) diff --git a/crates/squawk/src/github.rs b/crates/squawk/src/github.rs index 2a9bf699..2b6f9d2f 100644 --- a/crates/squawk/src/github.rs +++ b/crates/squawk/src/github.rs @@ -1,11 +1,11 @@ -use crate::config::Config; -use crate::reporter::{fmt_tty_violation, CheckReport}; use crate::Command; +use crate::config::Config; +use crate::reporter::{CheckReport, fmt_tty_violation}; use crate::{file_finding::find_paths, reporter::check_files}; -use anyhow::{anyhow, bail, Result}; +use anyhow::{Result, anyhow, bail}; use console::strip_ansi_codes; use log::info; -use squawk_github::{actions, app, comment_on_pr, GitHubApi}; +use squawk_github::{GitHubApi, actions, app, comment_on_pr}; use squawk_linter::{Rule, Version}; const VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -178,11 +178,7 @@ fn get_comment_body(files: &[CheckReport], version: &str) -> String { } const fn get_violations_emoji(count: usize) -> &'static str { - if count > 0 { - "🚒" - } else { - "✅" - } + if count > 0 { "🚒" } else { "✅" } } fn get_sql_file_content(violation: &CheckReport) -> Result { diff --git a/crates/squawk/src/reporter.rs b/crates/squawk/src/reporter.rs index 10ab444b..a83cb089 100644 --- a/crates/squawk/src/reporter.rs +++ b/crates/squawk/src/reporter.rs @@ -16,8 +16,8 @@ use std::path::PathBuf; use std::process::ExitCode; use crate::{ - file::{sql_from_path, sql_from_stdin}, Reporter, + file::{sql_from_path, sql_from_stdin}, }; fn check_sql( @@ -223,11 +223,23 @@ fn print_summary(f: &mut W, summary: &Summary) -> Result<()> { f, "Found {total_violations} issue{plural} in {files_with_violations} file{files_plural} (checked {files_checked} {files_checked_plural})", total_violations = summary.total_violations, - plural = if summary.total_violations == 1 { "" } else { "s" }, + plural = if summary.total_violations == 1 { + "" + } else { + "s" + }, files_with_violations = summary.files_with_violations, - files_plural = if summary.files_with_violations == 1 { "" } else { "s" }, + files_plural = if summary.files_with_violations == 1 { + "" + } else { + "s" + }, files_checked = summary.files_checked, - files_checked_plural = if summary.files_checked == 1 { "source file" } else { "source files" } + files_checked_plural = if summary.files_checked == 1 { + "source file" + } else { + "source files" + } )?; } Ok(()) @@ -355,7 +367,7 @@ select \; #[cfg(test)] mod test_reporter { use super::check_sql; - use crate::reporter::{print_violations, Reporter}; + use crate::reporter::{Reporter, print_violations}; use console::strip_ansi_codes; use insta::{assert_debug_snapshot, assert_snapshot}; diff --git a/crates/squawk_lexer/src/lib.rs b/crates/squawk_lexer/src/lib.rs index d5b373aa..8b6dc9c9 100644 --- a/crates/squawk_lexer/src/lib.rs +++ b/crates/squawk_lexer/src/lib.rs @@ -279,7 +279,7 @@ impl Cursor<'_> { return LiteralKind::Int { base, empty_int: false, - } + }; } } } else { diff --git a/crates/squawk_linter/src/ignore.rs b/crates/squawk_linter/src/ignore.rs index b3cbaa53..13887def 100644 --- a/crates/squawk_linter/src/ignore.rs +++ b/crates/squawk_linter/src/ignore.rs @@ -108,7 +108,7 @@ pub(crate) fn find_ignores(ctx: &mut Linter, file: &SyntaxNode) { #[cfg(test)] mod test { - use crate::{find_ignores, Linter, Rule}; + use crate::{Linter, Rule, find_ignores}; #[test] fn single_ignore() { diff --git a/crates/squawk_linter/src/rules/adding_foreign_key_constraint.rs b/crates/squawk_linter/src/rules/adding_foreign_key_constraint.rs index 702b16ad..e231feed 100644 --- a/crates/squawk_linter/src/rules/adding_foreign_key_constraint.rs +++ b/crates/squawk_linter/src/rules/adding_foreign_key_constraint.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/adding_not_null_field.rs b/crates/squawk_linter/src/rules/adding_not_null_field.rs index c3a4e2a9..a20104a7 100644 --- a/crates/squawk_linter/src/rules/adding_not_null_field.rs +++ b/crates/squawk_linter/src/rules/adding_not_null_field.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/adding_primary_key_constraint.rs b/crates/squawk_linter/src/rules/adding_primary_key_constraint.rs index fe9a5b64..39fad5f0 100644 --- a/crates/squawk_linter/src/rules/adding_primary_key_constraint.rs +++ b/crates/squawk_linter/src/rules/adding_primary_key_constraint.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/adding_required_field.rs b/crates/squawk_linter/src/rules/adding_required_field.rs index 2ec683a4..85a40264 100644 --- a/crates/squawk_linter/src/rules/adding_required_field.rs +++ b/crates/squawk_linter/src/rules/adding_required_field.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_alter_domain_with_add_constraint.rs b/crates/squawk_linter/src/rules/ban_alter_domain_with_add_constraint.rs index 7f461153..78108d78 100644 --- a/crates/squawk_linter/src/rules/ban_alter_domain_with_add_constraint.rs +++ b/crates/squawk_linter/src/rules/ban_alter_domain_with_add_constraint.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_char_field.rs b/crates/squawk_linter/src/rules/ban_char_field.rs index 78a047d8..788497e6 100644 --- a/crates/squawk_linter/src/rules/ban_char_field.rs +++ b/crates/squawk_linter/src/rules/ban_char_field.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, TokenText, + ast::{self, AstNode}, }; use crate::visitors::check_not_allowed_types; diff --git a/crates/squawk_linter/src/rules/ban_concurrent_index_creation_in_transaction.rs b/crates/squawk_linter/src/rules/ban_concurrent_index_creation_in_transaction.rs index f3dde939..7fe09159 100644 --- a/crates/squawk_linter/src/rules/ban_concurrent_index_creation_in_transaction.rs +++ b/crates/squawk_linter/src/rules/ban_concurrent_index_creation_in_transaction.rs @@ -1,4 +1,4 @@ -use squawk_syntax::{ast, Parse, SourceFile}; +use squawk_syntax::{Parse, SourceFile, ast}; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_create_domain_with_constraint.rs b/crates/squawk_linter/src/rules/ban_create_domain_with_constraint.rs index 6ab8bf90..800d6fdc 100644 --- a/crates/squawk_linter/src/rules/ban_create_domain_with_constraint.rs +++ b/crates/squawk_linter/src/rules/ban_create_domain_with_constraint.rs @@ -1,7 +1,7 @@ use rowan::TextRange; use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_drop_column.rs b/crates/squawk_linter/src/rules/ban_drop_column.rs index a622efb4..41875e21 100644 --- a/crates/squawk_linter/src/rules/ban_drop_column.rs +++ b/crates/squawk_linter/src/rules/ban_drop_column.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_drop_database.rs b/crates/squawk_linter/src/rules/ban_drop_database.rs index 75db6aea..5adbe0bb 100644 --- a/crates/squawk_linter/src/rules/ban_drop_database.rs +++ b/crates/squawk_linter/src/rules/ban_drop_database.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_drop_not_null.rs b/crates/squawk_linter/src/rules/ban_drop_not_null.rs index 49bda243..42ebc444 100644 --- a/crates/squawk_linter/src/rules/ban_drop_not_null.rs +++ b/crates/squawk_linter/src/rules/ban_drop_not_null.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_drop_table.rs b/crates/squawk_linter/src/rules/ban_drop_table.rs index 7cab303d..9acca17b 100644 --- a/crates/squawk_linter/src/rules/ban_drop_table.rs +++ b/crates/squawk_linter/src/rules/ban_drop_table.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/ban_truncate_cascade.rs b/crates/squawk_linter/src/rules/ban_truncate_cascade.rs index 4edaffe5..30f26416 100644 --- a/crates/squawk_linter/src/rules/ban_truncate_cascade.rs +++ b/crates/squawk_linter/src/rules/ban_truncate_cascade.rs @@ -1,4 +1,4 @@ -use squawk_syntax::{ast, Parse, SourceFile}; +use squawk_syntax::{Parse, SourceFile, ast}; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/changing_column_type.rs b/crates/squawk_linter/src/rules/changing_column_type.rs index 6df2c8da..0fb73f66 100644 --- a/crates/squawk_linter/src/rules/changing_column_type.rs +++ b/crates/squawk_linter/src/rules/changing_column_type.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/constraint_missing_not_valid.rs b/crates/squawk_linter/src/rules/constraint_missing_not_valid.rs index 3314da08..9e3744ca 100644 --- a/crates/squawk_linter/src/rules/constraint_missing_not_valid.rs +++ b/crates/squawk_linter/src/rules/constraint_missing_not_valid.rs @@ -1,11 +1,11 @@ use std::collections::HashSet; use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; -use crate::{text::trim_quotes, Linter, Rule, Violation}; +use crate::{Linter, Rule, Violation, text::trim_quotes}; pub fn tables_created_in_transaction( assume_in_transaction: bool, diff --git a/crates/squawk_linter/src/rules/disallow_unique_constraint.rs b/crates/squawk_linter/src/rules/disallow_unique_constraint.rs index 94560b7e..003d57b5 100644 --- a/crates/squawk_linter/src/rules/disallow_unique_constraint.rs +++ b/crates/squawk_linter/src/rules/disallow_unique_constraint.rs @@ -1,9 +1,9 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; -use crate::{text::trim_quotes, Linter, Rule, Violation}; +use crate::{Linter, Rule, Violation, text::trim_quotes}; use super::constraint_missing_not_valid::tables_created_in_transaction; diff --git a/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs b/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs index e0af8eee..6bf13b12 100644 --- a/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs +++ b/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; use squawk_syntax::ast::AstNode; -use squawk_syntax::{ast, Parse, SourceFile}; +use squawk_syntax::{Parse, SourceFile, ast}; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs b/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs index f600698d..61e817ca 100644 --- a/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs +++ b/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; use squawk_syntax::ast::AstNode; -use squawk_syntax::{ast, Parse, SourceFile}; +use squawk_syntax::{Parse, SourceFile, ast}; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/prefer_identity.rs b/crates/squawk_linter/src/rules/prefer_identity.rs index 823aaac7..2f4d48da 100644 --- a/crates/squawk_linter/src/rules/prefer_identity.rs +++ b/crates/squawk_linter/src/rules/prefer_identity.rs @@ -1,8 +1,8 @@ use std::collections::HashSet; use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/prefer_robust_stmts.rs b/crates/squawk_linter/src/rules/prefer_robust_stmts.rs index 8b43e8eb..d3acc68c 100644 --- a/crates/squawk_linter/src/rules/prefer_robust_stmts.rs +++ b/crates/squawk_linter/src/rules/prefer_robust_stmts.rs @@ -1,11 +1,11 @@ use std::collections::HashMap; use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; -use crate::{text::trim_quotes, Linter, Rule, Violation}; +use crate::{Linter, Rule, Violation, text::trim_quotes}; #[derive(PartialEq)] enum Constraint { diff --git a/crates/squawk_linter/src/rules/prefer_text_field.rs b/crates/squawk_linter/src/rules/prefer_text_field.rs index 62e24ec4..c173dddc 100644 --- a/crates/squawk_linter/src/rules/prefer_text_field.rs +++ b/crates/squawk_linter/src/rules/prefer_text_field.rs @@ -1,11 +1,11 @@ use std::collections::HashSet; use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; -use crate::{text::trim_quotes, Linter, Rule, Violation}; +use crate::{Linter, Rule, Violation, text::trim_quotes}; use crate::visitors::check_not_allowed_types; diff --git a/crates/squawk_linter/src/rules/prefer_timestamptz.rs b/crates/squawk_linter/src/rules/prefer_timestamptz.rs index 3756b1cd..6d60d22a 100644 --- a/crates/squawk_linter/src/rules/prefer_timestamptz.rs +++ b/crates/squawk_linter/src/rules/prefer_timestamptz.rs @@ -1,10 +1,10 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; -use crate::{text::trim_quotes, visitors::check_not_allowed_types}; use crate::{Linter, Rule, Violation}; +use crate::{text::trim_quotes, visitors::check_not_allowed_types}; pub fn is_not_allowed_timestamp(ty: &ast::Type) -> bool { match ty { diff --git a/crates/squawk_linter/src/rules/renaming_column.rs b/crates/squawk_linter/src/rules/renaming_column.rs index 5b3d0d55..879c7bb7 100644 --- a/crates/squawk_linter/src/rules/renaming_column.rs +++ b/crates/squawk_linter/src/rules/renaming_column.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/renaming_table.rs b/crates/squawk_linter/src/rules/renaming_table.rs index 46a59081..955b3498 100644 --- a/crates/squawk_linter/src/rules/renaming_table.rs +++ b/crates/squawk_linter/src/rules/renaming_table.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/require_concurrent_index_creation.rs b/crates/squawk_linter/src/rules/require_concurrent_index_creation.rs index 81e88528..ad8796f3 100644 --- a/crates/squawk_linter/src/rules/require_concurrent_index_creation.rs +++ b/crates/squawk_linter/src/rules/require_concurrent_index_creation.rs @@ -1,9 +1,9 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; -use crate::{text::trim_quotes, Linter, Rule, Violation}; +use crate::{Linter, Rule, Violation, text::trim_quotes}; use super::constraint_missing_not_valid::tables_created_in_transaction; diff --git a/crates/squawk_linter/src/rules/require_concurrent_index_deletion.rs b/crates/squawk_linter/src/rules/require_concurrent_index_deletion.rs index 77cb4ecb..899dd1dd 100644 --- a/crates/squawk_linter/src/rules/require_concurrent_index_deletion.rs +++ b/crates/squawk_linter/src/rules/require_concurrent_index_deletion.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/rules/transaction_nesting.rs b/crates/squawk_linter/src/rules/transaction_nesting.rs index 337f6a31..23e65b38 100644 --- a/crates/squawk_linter/src/rules/transaction_nesting.rs +++ b/crates/squawk_linter/src/rules/transaction_nesting.rs @@ -1,6 +1,6 @@ use squawk_syntax::{ - ast::{self, AstNode}, Parse, SourceFile, + ast::{self, AstNode}, }; use crate::{Linter, Rule, Violation}; diff --git a/crates/squawk_linter/src/version.rs b/crates/squawk_linter/src/version.rs index 13fe80e9..eca129b0 100644 --- a/crates/squawk_linter/src/version.rs +++ b/crates/squawk_linter/src/version.rs @@ -1,7 +1,7 @@ use std::num::ParseIntError; use std::str::FromStr; -use serde::{de::Error, Deserialize, Deserializer}; +use serde::{Deserialize, Deserializer, de::Error}; #[derive(Debug, PartialEq, PartialOrd, Clone, Copy)] pub struct Version { diff --git a/crates/squawk_linter/src/visitors.rs b/crates/squawk_linter/src/visitors.rs index 584f5f59..e7e0b368 100644 --- a/crates/squawk_linter/src/visitors.rs +++ b/crates/squawk_linter/src/visitors.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use squawk_syntax::ast; -use crate::{text::trim_quotes, Linter}; +use crate::{Linter, text::trim_quotes}; pub(crate) fn is_not_valid_int_type(ty: &ast::Type, invalid_type_names: &HashSet<&str>) -> bool { match ty { diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index b9ed84a3..4b61df08 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -1,8 +1,8 @@ +use crate::SyntaxKind; use crate::ast::AstNode; -use crate::ast::{support, AstChildren}; +use crate::ast::{AstChildren, support}; use crate::syntax_node::SyntaxNode; use crate::syntax_node::SyntaxToken; -use crate::SyntaxKind; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AddColumn { diff --git a/crates/squawk_syntax/src/ast/generated/tokens.rs b/crates/squawk_syntax/src/ast/generated/tokens.rs index a99d7002..fd14e662 100644 --- a/crates/squawk_syntax/src/ast/generated/tokens.rs +++ b/crates/squawk_syntax/src/ast/generated/tokens.rs @@ -1,4 +1,4 @@ -use crate::{ast::AstToken, SyntaxKind, SyntaxToken}; +use crate::{SyntaxKind, SyntaxToken, ast::AstToken}; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Null { diff --git a/crates/squawk_syntax/src/ast/traits.rs b/crates/squawk_syntax/src/ast/traits.rs index 715b19dc..35f10f86 100644 --- a/crates/squawk_syntax/src/ast/traits.rs +++ b/crates/squawk_syntax/src/ast/traits.rs @@ -1,7 +1,7 @@ // based on rust-analyzer's ast traits // https://github.com/rust-lang/rust-analyzer/blob/d8887c0758bbd2d5f752d5bd405d4491e90e7ed6/crates/syntax/src/ast/traits.rs use crate::ast; -use crate::ast::{support, AstNode}; +use crate::ast::{AstNode, support}; pub trait HasName: AstNode { fn name(&self) -> Option { diff --git a/crates/squawk_syntax/src/lib.rs b/crates/squawk_syntax/src/lib.rs index 543c8998..294c5dec 100644 --- a/crates/squawk_syntax/src/lib.rs +++ b/crates/squawk_syntax/src/lib.rs @@ -307,10 +307,12 @@ fn api_walkthrough() { .ancestors() .find_map(ast::CreateFunction::cast); assert_eq!(f, Some(func)); - assert!(param - .syntax() - .siblings_with_tokens(Direction::Next) - .any(|it| it.kind() == SyntaxKind::R_PAREN)); + assert!( + param + .syntax() + .siblings_with_tokens(Direction::Next) + .any(|it| it.kind() == SyntaxKind::R_PAREN) + ); assert_eq!( func_option_syntax.descendants_with_tokens().count(), 5, // 5 tokens `1`, ` `, `+`, ` `, `1` diff --git a/crates/squawk_syntax/src/syntax_node.rs b/crates/squawk_syntax/src/syntax_node.rs index 507f3bdf..13658cb9 100644 --- a/crates/squawk_syntax/src/syntax_node.rs +++ b/crates/squawk_syntax/src/syntax_node.rs @@ -26,7 +26,7 @@ use rowan::{GreenNode, GreenNodeBuilder, Language, TextSize}; -use crate::{syntax_error::SyntaxError, SyntaxKind}; +use crate::{SyntaxKind, syntax_error::SyntaxError}; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Sql {} diff --git a/crates/squawk_syntax/src/test.rs b/crates/squawk_syntax/src/test.rs index 55d77be9..5a90b7a2 100644 --- a/crates/squawk_syntax/src/test.rs +++ b/crates/squawk_syntax/src/test.rs @@ -1,6 +1,6 @@ // based on https://github.com/rust-lang/rust-analyzer/blob/d8887c0758bbd2d5f752d5bd405d4491e90e7ed6/crates/parser/src/tests.rs use camino::Utf8Path; -use dir_test::{dir_test, Fixture}; +use dir_test::{Fixture, dir_test}; use insta::{assert_snapshot, with_settings}; use crate::SourceFile; diff --git a/crates/squawk_syntax/src/validation.rs b/crates/squawk_syntax/src/validation.rs index e0e8b5b8..5ee45634 100644 --- a/crates/squawk_syntax/src/validation.rs +++ b/crates/squawk_syntax/src/validation.rs @@ -5,7 +5,7 @@ //! A failed validation emits a diagnostic. use crate::ast::AstNode; -use crate::{ast, match_ast, syntax_error::SyntaxError, SyntaxNode}; +use crate::{SyntaxNode, ast, match_ast, syntax_error::SyntaxError}; use rowan::{TextRange, TextSize}; use squawk_parser::SyntaxKind::*; pub(crate) fn validate(root: &SyntaxNode, errors: &mut Vec) { diff --git a/crates/xtask/src/keywords.rs b/crates/xtask/src/keywords.rs index 60b4fa50..62d1dbf5 100644 --- a/crates/xtask/src/keywords.rs +++ b/crates/xtask/src/keywords.rs @@ -1,6 +1,6 @@ use crate::path::project_root; use anyhow::{Context, Ok, Result}; -use enum_iterator::{all, Sequence}; +use enum_iterator::{Sequence, all}; use std::collections::{HashMap, HashSet}; struct KeywordMeta { diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs index 34448729..0880acf1 100644 --- a/crates/xtask/src/main.rs +++ b/crates/xtask/src/main.rs @@ -1,6 +1,6 @@ use anyhow::Result; // see: https://github.com/matklad/cargo-xtask -use clap::{arg, Args, Parser, Subcommand}; +use clap::{Args, Parser, Subcommand, arg}; use codegen::codegen; use new_rule::new_lint; use sync_kwlist::sync_kwlist;