diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index ce0c603e..3ee0a496 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -20,6 +20,16 @@ jobs: with: paths_ignore: '["docs/**", "*.md"]' + lint_pre_job: + runs-on: ubuntu-22.04 + outputs: + should_skip_lint: ${{ steps.skip_check_lint.outputs.should_skip }} + steps: + - id: skip_check_lint + uses: fkirc/skip-duplicate-actions@c449d86cf33a2a6c7a4193264cc2578e2c3266d4 # pin@v4 + with: + paths: '["**/*.rs", "**/Cargo.toml", "Cargo.lock", "s/lint"]' + build: needs: pre_job if: needs.pre_job.outputs.should_skip != 'true' || startsWith(github.ref, 'refs/tags/') @@ -273,8 +283,8 @@ jobs: NETLIFY_SITE_ID: ${{ secrets.PLAYGROUND_NETLIFY_SITE_ID }} lint: - needs: pre_job - if: needs.pre_job.outputs.should_skip != 'true' + needs: lint_pre_job + if: needs.lint_pre_job.outputs.should_skip_lint != 'true' runs-on: ubuntu-22.04 diff --git a/.prettierignore b/.prettierignore index 13e10a6d..8261d96a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,3 +8,5 @@ coverage/ .pytest_cache/ target/ docs +squawk-vscode/.vscode-test/ +squawk-vscode/dist/ diff --git a/CHANGELOG.md b/CHANGELOG.md index adfae118..068fab1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 alter table t add column c timestamptz default now() - interval '100 years'; ``` - ## Fixed - parser: parse materialized views using a paren select (#651). diff --git a/crates/squawk/src/debug.rs b/crates/squawk/src/debug.rs index 023d2f45..0bbbda17 100644 --- a/crates/squawk/src/debug.rs +++ b/crates/squawk/src/debug.rs @@ -1,8 +1,6 @@ use std::{io, path::PathBuf}; -use annotate_snippets::{ - Annotation, AnnotationKind, Level, Renderer, Snippet, renderer::DecorStyle, -}; +use annotate_snippets::{AnnotationKind, Level, Renderer, Snippet, renderer::DecorStyle}; use anyhow::Result; use serde_json::json; use squawk_syntax::{ast::AstNode, syntax_error::SyntaxError}; diff --git a/crates/squawk/src/main.rs b/crates/squawk/src/main.rs index a531abcf..87e4e9ca 100644 --- a/crates/squawk/src/main.rs +++ b/crates/squawk/src/main.rs @@ -60,7 +60,7 @@ pub enum Command { /// Run the language server Server, /// Comment on a PR with Squawk's results. - UploadToGithub(UploadToGithubArgs), + UploadToGithub(Box), } #[derive(Debug, ValueEnum, Clone)] @@ -232,7 +232,7 @@ Please open an issue at https://github.com/sbdchd/squawk/issues/new with the log } Some(Command::UploadToGithub(args)) => { github::check_and_comment_on_pr( - args, + *args, &conf, is_stdin, opts.stdin_filepath, diff --git a/crates/squawk/src/reporter.rs b/crates/squawk/src/reporter.rs index fd40ef43..0aa1eae2 100644 --- a/crates/squawk/src/reporter.rs +++ b/crates/squawk/src/reporter.rs @@ -1,6 +1,4 @@ -use annotate_snippets::{ - Annotation, AnnotationKind, Level, Renderer, Snippet, renderer::DecorStyle, -}; +use annotate_snippets::{AnnotationKind, Level, Renderer, Snippet, renderer::DecorStyle}; use anyhow::Result; use console::style; use line_index::LineIndex; diff --git a/crates/squawk_github/src/app.rs b/crates/squawk_github/src/app.rs index c873904e..385b545e 100644 --- a/crates/squawk_github/src/app.rs +++ b/crates/squawk_github/src/app.rs @@ -40,7 +40,7 @@ fn create_access_token( install_id: i64, ) -> Result { Ok(reqwest::blocking::Client::new() - .post(&format!( + .post(format!( "{github_api_url}/app/installations/{install_id}/access_tokens", )) .header(AUTHORIZATION, format!("Bearer {jwt}")) @@ -66,7 +66,7 @@ pub(crate) fn create_comment( } let comment_body = CommentBody { body: comment.body }; reqwest::blocking::Client::new() - .post(&format!( + .post(format!( "{github_api_url}/repos/{owner}/{repo}/issues/{issue_number}/comments", owner = comment.owner, repo = comment.repo, @@ -89,7 +89,7 @@ pub struct GitHubAppInfo { /// Get the bot name for finding existing comments on a PR pub fn get_app_info(github_api_url: &str, jwt: &str) -> Result { Ok(reqwest::blocking::Client::new() - .get(&format!("{github_api_url}/app")) + .get(format!("{github_api_url}/app")) .header(AUTHORIZATION, format!("Bearer {jwt}")) .header(USER_AGENT, SQUAWK_USER_AGENT) .send()? @@ -173,7 +173,7 @@ pub(crate) fn list_comments( // TODO(sbdchd): use the next links to get _all_ the comments // see: https://developer.github.com/v3/guides/traversing-with-pagination/ Ok(reqwest::blocking::Client::new() - .get(&format!( + .get(format!( "{github_api_url}/repos/{owner}/{repo}/issues/{issue_number}/comments", owner = pr.owner, repo = pr.repo, @@ -205,7 +205,7 @@ pub(crate) fn update_comment( } reqwest::blocking::Client::new() - .patch(&format!( + .patch(format!( "{github_api_url}/repos/{owner}/{repo}/issues/comments/{comment_id}", )) .header(AUTHORIZATION, format!("Bearer {secret}")) diff --git a/crates/squawk_github/src/lib.rs b/crates/squawk_github/src/lib.rs index 68dcb78c..30ff3208 100644 --- a/crates/squawk_github/src/lib.rs +++ b/crates/squawk_github/src/lib.rs @@ -8,7 +8,7 @@ use std::error::Error; use log::info; use serde::{Deserialize, Serialize}; -pub(crate) const DEFAULT_GITHUB_API_URL: &'static str = "https://api.github.com"; +pub(crate) const DEFAULT_GITHUB_API_URL: &str = "https://api.github.com"; #[derive(Debug)] pub enum GithubError { diff --git a/crates/squawk_lexer/src/lib.rs b/crates/squawk_lexer/src/lib.rs index 8b6dc9c9..24a3ff75 100644 --- a/crates/squawk_lexer/src/lib.rs +++ b/crates/squawk_lexer/src/lib.rs @@ -530,7 +530,7 @@ mod tests { } } - fn lex(input: &str) -> Vec { + fn lex(input: &str) -> Vec> { let mut tokens = vec![]; let mut start = 0; diff --git a/crates/squawk_linter/src/lib.rs b/crates/squawk_linter/src/lib.rs index 85d09afb..ea9c24c2 100644 --- a/crates/squawk_linter/src/lib.rs +++ b/crates/squawk_linter/src/lib.rs @@ -272,8 +272,7 @@ impl Violation { let start = node .children_with_tokens() - .filter(|x| !x.kind().is_trivia()) - .next() + .find(|x| !x.kind().is_trivia()) .map(|x| x.text_range().start()) // Not sure we actually hit this, but just being safe .unwrap_or_else(|| range.start()); @@ -333,91 +332,91 @@ impl Linter { #[must_use] pub fn lint(&mut self, file: &Parse, text: &str) -> Vec { if self.rules.contains(&Rule::AddingFieldWithDefault) { - adding_field_with_default(self, &file); + adding_field_with_default(self, file); } if self.rules.contains(&Rule::AddingForeignKeyConstraint) { - adding_foreign_key_constraint(self, &file); + adding_foreign_key_constraint(self, file); } if self.rules.contains(&Rule::AddingNotNullableField) { - adding_not_null_field(self, &file); + adding_not_null_field(self, file); } if self.rules.contains(&Rule::AddingSerialPrimaryKeyField) { - adding_primary_key_constraint(self, &file); + adding_primary_key_constraint(self, file); } if self.rules.contains(&Rule::AddingRequiredField) { - adding_required_field(self, &file); + adding_required_field(self, file); } if self.rules.contains(&Rule::BanDropDatabase) { - ban_drop_database(self, &file); + ban_drop_database(self, file); } if self.rules.contains(&Rule::BanCharField) { - ban_char_field(self, &file); + ban_char_field(self, file); } if self .rules .contains(&Rule::BanConcurrentIndexCreationInTransaction) { - ban_concurrent_index_creation_in_transaction(self, &file); + ban_concurrent_index_creation_in_transaction(self, file); } if self.rules.contains(&Rule::BanDropColumn) { - ban_drop_column(self, &file); + ban_drop_column(self, file); } if self.rules.contains(&Rule::BanDropNotNull) { - ban_drop_not_null(self, &file); + ban_drop_not_null(self, file); } if self.rules.contains(&Rule::BanDropTable) { - ban_drop_table(self, &file); + ban_drop_table(self, file); } if self.rules.contains(&Rule::ChangingColumnType) { - changing_column_type(self, &file); + changing_column_type(self, file); } if self.rules.contains(&Rule::ConstraintMissingNotValid) { - constraint_missing_not_valid(self, &file); + constraint_missing_not_valid(self, file); } if self.rules.contains(&Rule::DisallowedUniqueConstraint) { - disallow_unique_constraint(self, &file); + disallow_unique_constraint(self, file); } if self.rules.contains(&Rule::PreferBigintOverInt) { - prefer_bigint_over_int(self, &file); + prefer_bigint_over_int(self, file); } if self.rules.contains(&Rule::PreferBigintOverSmallint) { - prefer_bigint_over_smallint(self, &file); + prefer_bigint_over_smallint(self, file); } if self.rules.contains(&Rule::PreferIdentity) { - prefer_identity(self, &file); + prefer_identity(self, file); } if self.rules.contains(&Rule::PreferRobustStmts) { - prefer_robust_stmts(self, &file); + prefer_robust_stmts(self, file); } if self.rules.contains(&Rule::PreferTextField) { - prefer_text_field(self, &file); + prefer_text_field(self, file); } if self.rules.contains(&Rule::PreferTimestampTz) { - prefer_timestamptz(self, &file); + prefer_timestamptz(self, file); } if self.rules.contains(&Rule::RenamingColumn) { - renaming_column(self, &file); + renaming_column(self, file); } if self.rules.contains(&Rule::RenamingTable) { - renaming_table(self, &file); + renaming_table(self, file); } if self.rules.contains(&Rule::RequireConcurrentIndexCreation) { - require_concurrent_index_creation(self, &file); + require_concurrent_index_creation(self, file); } if self.rules.contains(&Rule::RequireConcurrentIndexDeletion) { - require_concurrent_index_deletion(self, &file); + require_concurrent_index_deletion(self, file); } if self.rules.contains(&Rule::BanCreateDomainWithConstraint) { - ban_create_domain_with_constraint(self, &file); + ban_create_domain_with_constraint(self, file); } if self.rules.contains(&Rule::BanAlterDomainWithAddConstraint) { - ban_alter_domain_with_add_constraint(self, &file); + ban_alter_domain_with_add_constraint(self, file); } if self.rules.contains(&Rule::TransactionNesting) { - transaction_nesting(self, &file); + transaction_nesting(self, file); } if self.rules.contains(&Rule::BanTruncateCascade) { - ban_truncate_cascade(self, &file); + ban_truncate_cascade(self, file); } // xtask:new-rule:rule-call diff --git a/crates/squawk_linter/src/rules/ban_char_field.rs b/crates/squawk_linter/src/rules/ban_char_field.rs index f03088b2..23ff70e8 100644 --- a/crates/squawk_linter/src/rules/ban_char_field.rs +++ b/crates/squawk_linter/src/rules/ban_char_field.rs @@ -21,17 +21,17 @@ lazy_static! { } fn is_char_type(x: TokenText<'_>) -> bool { - CHAR_TYPES.contains(&Identifier::new(&x.to_string())) + CHAR_TYPES.contains(&Identifier::new(x.as_ref())) } fn create_fix(range: TextRange, args: Option) -> Fix { if let Some(args_list) = args { let end = args_list.syntax().text_range().start(); let edit = Edit::replace(TextRange::new(range.start(), end), "varchar"); - Fix::new(format!("Replace with `varchar`"), vec![edit]) + Fix::new("Replace with `varchar`".to_string(), vec![edit]) } else { let edit = Edit::replace(range, "text"); - Fix::new(format!("Replace with `text`"), vec![edit]) + Fix::new("Replace with `text`".to_string(), vec![edit]) } } diff --git a/crates/squawk_parser/src/input.rs b/crates/squawk_parser/src/input.rs index 0f960abe..2cdc30fb 100644 --- a/crates/squawk_parser/src/input.rs +++ b/crates/squawk_parser/src/input.rs @@ -81,7 +81,7 @@ impl Input { #[inline] fn push_impl(&mut self, kind: SyntaxKind, contextual_kind: SyntaxKind) { let idx = self.len(); - if idx % (bits::BITS as usize) == 0 { + if idx.is_multiple_of(bits::BITS as usize) { self.joint.push(0); } self.kind.push(kind); diff --git a/crates/squawk_server/src/ignore.rs b/crates/squawk_server/src/ignore.rs index c05db397..b52c74ac 100644 --- a/crates/squawk_server/src/ignore.rs +++ b/crates/squawk_server/src/ignore.rs @@ -61,7 +61,7 @@ pub(crate) fn ignore_file_edit( fn is_ignore_comment(token: &SyntaxToken) -> bool { assert_eq!(token.kind(), SyntaxKind::COMMENT); - squawk_linter::ignore::ignore_rule_info(&token).is_some() + squawk_linter::ignore::ignore_rule_info(token).is_some() } #[cfg(test)] diff --git a/crates/squawk_wasm/src/lib.rs b/crates/squawk_wasm/src/lib.rs index 92046a97..0d05b551 100644 --- a/crates/squawk_wasm/src/lib.rs +++ b/crates/squawk_wasm/src/lib.rs @@ -134,7 +134,7 @@ pub fn lint(text: String) -> Result { let edits = fix .edits .into_iter() - .filter_map(|edit| { + .map(|edit| { let start_pos = line_index.line_col(edit.text_range.start()); let end_pos = line_index.line_col(edit.text_range.end()); let start_wide = line_index @@ -144,13 +144,13 @@ pub fn lint(text: String) -> Result { .to_wide(line_index::WideEncoding::Utf16, end_pos) .unwrap(); - Some(TextEdit { + TextEdit { start_line_number: start_wide.line, start_column: start_wide.col, end_line_number: end_wide.line, end_column: end_wide.col, text: edit.text.unwrap_or_default(), - }) + } }) .collect(); diff --git a/s/lint b/s/lint index 5241ef6e..a4a98e3b 100755 --- a/s/lint +++ b/s/lint @@ -1,7 +1,7 @@ #!/bin/sh set -e -if [ -z "$CI" ]; then +if [ -n "$CI" ]; then cargo fmt -- --check cargo clippy --all-targets --all-features -- -D warnings else diff --git a/s/prettier b/s/prettier index 376ab15f..05be9f71 100755 --- a/s/prettier +++ b/s/prettier @@ -3,7 +3,7 @@ set -ex main() { - if [ -z "$CI" ]; then + if [ -n "$CI" ]; then ./node_modules/.bin/prettier --check '**/*.{js,md,yml,json}' else ./node_modules/.bin/prettier '**/*.{js,md,yml,json}' --write diff --git a/squawk-vscode/esbuild.js b/squawk-vscode/esbuild.js index 8a7e564b..f3d6c11b 100644 --- a/squawk-vscode/esbuild.js +++ b/squawk-vscode/esbuild.js @@ -13,11 +13,11 @@ const esbuildProblemMatcherPlugin = { build.onStart(() => { console.log("[watch] build started") }) - build.onEnd((result) => { + build.onEnd(result => { result.errors.forEach(({ text, location }) => { console.error(`✘ [ERROR] ${text}`) console.error( - ` ${location.file}:${location.line}:${location.column}:`, + ` ${location.file}:${location.line}:${location.column}:` ) }) console.log("[watch] build finished") @@ -50,7 +50,7 @@ async function main() { } } -main().catch((e) => { +main().catch(e => { console.error(e) process.exit(1) })