From ef31f62fb43613f4ede0e391f6b296c87a96ac2f Mon Sep 17 00:00:00 2001 From: Martin Asquino Date: Fri, 11 Dec 2020 18:59:02 -0300 Subject: [PATCH] Use github actions instead of travis and circle --- .circleci/config.yml | 21 ------ .github/CONTRIBUTING.md | 6 +- .github/workflows/ci.yml | 127 ++++++++++++++++++++++++++++++++ .github/workflows/release.yml | 94 +++++++++++++++++++++++ .travis.yml | 56 -------------- Makefile | 3 - README.md | 2 +- ci/Dockerfile | 16 ---- ci/before_deploy.sh | 55 -------------- ci/cleanup-binary-tags.py | 37 ---------- ci/install.sh | 47 ------------ ci/script.sh | 18 ----- src/config/mod.rs | 2 +- src/config/server_command.rs | 1 + src/extensions/gopls.rs | 7 +- src/language_server_protocol.rs | 23 +++--- src/rpchandler.rs | 5 +- src/utils.rs | 5 +- 18 files changed, 243 insertions(+), 282 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml delete mode 100644 .travis.yml delete mode 100644 ci/Dockerfile delete mode 100644 ci/before_deploy.sh delete mode 100755 ci/cleanup-binary-tags.py delete mode 100644 ci/install.sh delete mode 100755 ci/script.sh diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index fd72c1190..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: 2 -general: - branches: - ignore: - - /binary-.*/ - -jobs: - build: - docker: - - image: autozimu/languageclientneovim - steps: - - checkout - - run: make ci - -workflows: - version: 2 - dev: - jobs: - - build - -# vim: tabstop=2 diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 252bfc1c2..a7922bb16 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -59,8 +59,8 @@ Please submit pull request to `dev` branch. This is to avoid mismatch between vimscript and rust binary run by end user. # Release -1. Update [CHANGELOG](../CHANGELOG.md). -1. Issue command `cargo release patch`. Note you will need [`cargo-release`][cargo-release] installed. This will create a commit with updated version metadata, tag it, push to GitHub remote, which will then trigger Travis workflow to generate binaries. -1. Once Travis workflow is finished successfully, rebase `dev` branch onto `next` branch. +1. Issue command `cargo release patch`. Note you will need [`cargo-release`][cargo-release] installed. This will create a commit with updated version metadata, tag it, push to GitHub remote. +1. Create a release on github UI from the tag you created on the previous step. This will trigger a github workflow to create the binaries and upload them to the release. +1. Once the github release workflow has finished, rebase next to dev (`git rebase dev`). [cargo-release]: https://github.com/sunng87/cargo-release diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..f84dc093f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,127 @@ +name: CI +on: + pull_request: + push: + branches: + - dev + - next + +jobs: + test-integration: + name: Integration tests + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 20 + + - name: Install Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: rustfmt, clippy + + - name: Install other dependencies + run: | + sudo apt-get update + sudo apt-get install --yes --no-install-recommends neovim curl git python3-pip python3-pytest mypy flake8 npm make + sudo apt-get clean + sudo rm -rf /var/lib/apt/lists/* + python3 -m pip install neovim vim-vint + sudo curl -L https://github.com/rust-analyzer/rust-analyzer/releases/latest/download/rust-analyzer-linux -o /usr/local/bin/rust-analyzer + sudo chmod +x /usr/local/bin/rust-analyzer + + - name: Test + run: make integration-test + + test-unit: + name: Unit tests + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 20 + + - name: Install Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: rustfmt, clippy + + - name: Compile + run: cargo test --no-run --locked + + - name: Test + run: cargo test + + lint-rust: + name: Lint rust + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 20 + + - name: Install Rust toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + components: rustfmt, clippy + + - name: Format + run: cargo fmt -- --check + + - name: Check + run: cargo clippy -- -D warnings + + lint-vimscript: + name: Lint VimL + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install --yes --no-install-recommends python3-pip python3-pytest python3-setuptools make + sudo apt-get clean + sudo rm -rf /var/lib/apt/lists/* + sudo python3 -m pip install neovim vim-vint + + - name: Lint + run: make vim-lint + + lint-python: + name: Lint Python + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install --yes --no-install-recommends python3-pip python3-pytest mypy flake8 make + sudo apt-get clean + sudo rm -rf /var/lib/apt/lists/* + + - name: Lint + run: make python-lint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..929658922 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,94 @@ +name: Build and upload binaries to release + +on: + release: + types: [created] + +jobs: + build: + name: Build + runs-on: ubuntu-latest + strategy: + matrix: + include: + - target: x86_64-unknown-linux-musl + binary: languageclient + asset_name: languageclient-${{ github.event.release.tag_name }}-x86_64-unknown-linux-musl + - target: aarch64-unknown-linux-musl + binary: languageclient + asset_name: languageclient-${{ github.event.release.tag_name }}-aarch64-unknown-linux-musl + - target: i686-unknown-linux-musl + binary: languageclient + asset_name: languageclient-${{ github.event.release.tag_name }}-i686-unknown-linux-musl + - target: x86_64-pc-windows-gnu + binary: languageclient.exe + asset_name: languageclient-${{ github.event.release.tag_name }}-x86_64-pc-windows-gnu.exe + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set output + id: vars + run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} + + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Install cross + run: cargo install cross + + - name: Compile + run: cross build --release --locked --target=${{ matrix.target }} + + - name: Hash + run: cp target/${{ matrix.target }}/release/${{ matrix.binary }} bin/${{ matrix.binary }} && sha256sum bin/${{ matrix.binary }} | tee bin/languageclient.sha256 + + - name: Upload binary to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: target/${{ matrix.target }}/release/${{ matrix.binary }} + asset_name: ${{ matrix.asset_name }} + tag: ${{ github.ref }} + + - name: Upload sha to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: bin/languageclient.sha256 + asset_name: ${{ matrix.asset_name }}.sha256 + tag: ${{ github.ref }} + + build-mac: + name: Build mac + runs-on: macos-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Compile + run: cargo build --release --locked + + - name: Hash + run: cp target/release/languageclient bin/languageclient && openssl sha256 bin/languageclient | awk '{print $2 " bin/languageclient"}' > bin/languageclient.sha256 + + - name: Upload binary to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: target/release/languageclient + asset_name: languageclient-${{ github.event.release.tag_name }}-x86_64-apple-darwin + tag: ${{ github.ref }} + + - name: Upload sha to release + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: bin/languageclient.sha256 + asset_name: languageclient-${{ github.event.release.tag_name }}-x86_64-apple-darwin.sha256 + tag: ${{ github.ref }} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 22b8cc2c8..000000000 --- a/.travis.yml +++ /dev/null @@ -1,56 +0,0 @@ -# Based on the "trust" template v0.1.1 -# https://github.com/japaric/trust/tree/v0.1.1 - -dist: trusty -sudo: required -services: docker -language: rust - -env: - global: - - CRATE_NAME=languageclient - - secure: eWJeA/cgx+RqY6jny1wtw4LErLy5leXYFvcfmGzwn8jGzDuUYt9S86GpMWamhKXsWZnUq3tdaCUFEThqd72nbQDd5tXhlKDAHQO6imo7zkszERv2mBRbDJwufYnj9J41OSyXk2MrJKerOTkD0HX5RmHXpY/wZf5ESSY5KamWBrqEOCLHdkT0QFD8Yqa9oCrfX3pI16b70rbZF60TSL5sE4neU9ai771fWyl0cGgO6QrpmW+J2fzC+gEtvDuBVoOUsfLlUBAEdylO6FIEEZy7i+HFFBCXYKtJIffdlMWKg9nogDU2ZqEtcPCgbc6HbhTCMPNPm/JlXUPw2zwb6tCO/IlMe3heLMPs+dfzbUdSCxTWicPzdzbZCjA4iUvDE2/vailVdKm72jSbm9ja7Vr9H5Y+IQpH3uncAAyE/q6fpKUh6uVRgKPA/5bULgzOwM0EuwWpyMC2iJvu/SGmrsUYZzztuB61p+G+TGlqrKFw9IfzfzrKlRDkMHYRbbSGQuB7NEYRV2Qn+4VavLjw+bshiK+8BqfjfFBdp/v1u8D06MhE1f4NnK9jh7NUm7qipfTU+HgZUauYN54T8CeljtyaynUeTDy2FNnK+zoA8WfxxZSnN7z8XOeAQESZWCRx3gG6ES6hChkwNxsyub9cU+VGCKvPgikXQzaWZ2EvOzGrpz8= - -matrix: - include: - # Linux - - env: TARGETS=i686-unknown-linux-musl:x86_64-unknown-linux-musl:aarch64-unknown-linux-musl:x86_64-pc-windows-gnu - - # OSX - - env: TARGETS=x86_64-apple-darwin - os: osx - -if: tag IS present - -branches: - except: - - /binary-.*/ - -script: - - true - -deploy: - # - Create a `public_repo` GitHub token. Go to: https://github.com/settings/tokens/new - # - Encrypt it: `travis encrypt 0123456789012345678901234567890123456789 - # - Paste the output down here - api_key: - secure: Dr/oCr65KsSjcDk21+CS7cZ/UR/ktncwDLsQIF/UyFC0bCP5MFbQ76Cz7Dy460hMtjCiy/X4QukxtiF0oeaOvi1szbo29s1KYjc9xPVhI1roQUyGghkGzo+V5Ncum3pwKF1Mb/kotikh2QSFQJYA3o32HhMNVb+1bApD+bwyAsGlnlAYYWQy+EcIDByhG9B4HB2pScoblyPmbgQPftc/E3ldKkm4iPNiNNa9T/rlXazNOkuiAqbRR/qBI4sSVAFFvfzvEcva4k5X8wzWfdsiDk9HKnNL7iDzdMMExSOoIKoet6jK3E3f2VbwD7tRw+We2cB+EBrW7xtkcck/BbEtnXhiWpt+Gg4qxXjZ6RVXgVw9tH0CGp2FjZ6B2DQ/chtgzIzLE+iuhJwhRqJ+7IW7LgNrnEsi6QelCiNKsm0aqXEpU5BVoBXxBegJHgHhunkKPpqmhYps5KsH4RPzrduqk2LHlYriwaGumcEnOVXzoJJs0NE6RaFzwl5cxmiKxC8tl1/dE4w2WmYM8n3yMmfbCd520bTQbvOe68k/8iV7gqZmOnWX//PLJ6Zf+v7T0yhaFC8Oj8ueWUCCSd7TAC3rHxd52BVZnQF1xXosiiN2PyWGZGbxaO1Qh7UbF1Xk+ot2pwEsP5Q8h155DlYJ/3mMzLvSi6Cp+78YKsoFlpfDy6w= - file_glob: true - file: bin/$CRATE_NAME-$TRAVIS_TAG-* - overwrite: true - on: - tags: true - provider: releases - skip_cleanup: true - -before_deploy: - - bash ci/install.sh - - bash ci/before_deploy.sh - -cache: - cargo: true -before_cache: - # Travis can't cache files that are not readable by "others" - - chmod -R a+r $HOME/.cargo - -# vim: tabstop=2 diff --git a/Makefile b/Makefile index b5c0449d1..ca5acd897 100644 --- a/Makefile +++ b/Makefile @@ -54,9 +54,6 @@ integration-test-docker: integration-test-docker-debug: docker run --interactive --tty --volume ${CURDIR}:/root/.config/nvim autozimu/languageclientneovim -cleanup-binary-tags: - ci/cleanup-binary-tags.py - clean: cargo clean rm -rf bin/languageclient diff --git a/README.md b/README.md index 591d396ee..f184d50d0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # LanguageClient-neovim -[![CircleCI](https://circleci.com/gh/autozimu/LanguageClient-neovim.svg?style=svg)](https://circleci.com/gh/autozimu/LanguageClient-neovim) [![Join the chat at https://gitter.im/LanguageClient-neovim/LanguageClient-neovim](https://badges.gitter.im/LanguageClient-neovim/LanguageClient-neovim.svg)](https://gitter.im/LanguageClient-neovim/LanguageClient-neovim?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Join the chat at https://gitter.im/LanguageClient-neovim/LanguageClient-neovim](https://badges.gitter.im/LanguageClient-neovim/LanguageClient-neovim.svg)](https://gitter.im/LanguageClient-neovim/LanguageClient-neovim?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [Language Server Protocol](LSP) support for [vim] and [neovim]. diff --git a/ci/Dockerfile b/ci/Dockerfile deleted file mode 100644 index 0df6a322e..000000000 --- a/ci/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM rust:1.46-slim - -RUN apt-get update \ - && apt-get install --yes --no-install-recommends neovim curl git python3-pip python3-pytest mypy flake8 npm make \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -RUN python3 -m pip install neovim vim-vint - -RUN rustup component add rustfmt clippy && rustup show -RUN curl -L https://github.com/rust-analyzer/rust-analyzer/releases/latest/download/rust-analyzer-linux -o /usr/local/bin/rust-analyzer \ - && chmod +x /usr/local/bin/rust-analyzer - -ENV CARGO_TARGET_DIR=/tmp - -CMD ["/bin/bash"] diff --git a/ci/before_deploy.sh b/ci/before_deploy.sh deleted file mode 100644 index 6f5fa875b..000000000 --- a/ci/before_deploy.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -set -o nounset -set -o errexit -set -o xtrace - -package() { - BIN_NAME_TAG=$CRATE_NAME-$TRAVIS_TAG-$TARGET - if [[ $TARGET =~ .*windows.* ]]; then - BIN_NAME_TAG=$BIN_NAME_TAG.exe - fi - - cp -f target/$TARGET/release/$BIN_NAME bin/$BIN_NAME_TAG - sha256sum "bin/$BIN_NAME_TAG" | tee "bin/$BIN_NAME_TAG.sha256" -} - -release_tag() { - cp -f target/$TARGET/release/$BIN_NAME bin/ - - git config --global user.email "travis@travis-ci.org" - git config --global user.name "Travis CI" - - git add --force bin/$BIN_NAME - SHA=$(git rev-parse --short HEAD) - git commit --message "Add binary. $SHA. $TRAVIS_TAG-$TARGET." - tagname="binary-$TRAVIS_TAG-$TARGET" - git tag --force "$tagname" - git push --force https://${GITHUB_TOKEN}@github.com/autozimu/LanguageClient-neovim.git "$tagname" - - git reset --hard HEAD^ -} - -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" -fi - -TARGETS=(${TARGETS//:/ }) -for TARGET in "${TARGETS[@]}"; do - BIN_NAME=$CRATE_NAME - if [[ $TARGET =~ .*windows.* ]]; then - BIN_NAME=$BIN_NAME.exe - fi - - cross build --release --target $TARGET - release_tag - package -done - -if [[ $TRAVIS_OS_NAME == 'linux' ]]; then - sudo apt-get update - sudo apt-get install --yes python3-pip - sudo pip3 install semver - - ci/cleanup-binary-tags.py -fi diff --git a/ci/cleanup-binary-tags.py b/ci/cleanup-binary-tags.py deleted file mode 100755 index 0b940e9e5..000000000 --- a/ci/cleanup-binary-tags.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 - -import os -import subprocess -import semver - - -def tag_to_version(tag): - return tag.split('-')[1].lstrip('v') - - -subprocess.check_call('git fetch --tags', shell=True) -tags = subprocess.check_output( - 'git tag --list | grep binary', shell=True).decode('UTF-8').splitlines() -versions = sorted(list(set([tag_to_version(tag) for tag in tags])), - key=semver.parse_version_info) -versions_to_delete = versions[:-3] - -cmd_delete_local = 'git tag --delete' -cmd_delete_remote = 'git push --delete ' -GITHUB_TOKEN = os.environ.get('GITHUB_TOKEN') -if GITHUB_TOKEN: - cmd_delete_remote += ( - 'https://{}@github.com/autozimu/LanguageClient-neovim.git' - .format(GITHUB_TOKEN)) -else: - cmd_delete_remote += 'origin' -for tag in tags: - if tag_to_version(tag) in versions_to_delete: - cmd_delete_local += ' ' + tag - cmd_delete_remote += ' ' + tag - -if not cmd_delete_local.endswith('delete'): - subprocess.check_call(cmd_delete_local, shell=True) -if not (cmd_delete_remote.endswith('origin') or - cmd_delete_remote.endswith('.git')): - subprocess.check_call(cmd_delete_remote, shell=True) diff --git a/ci/install.sh b/ci/install.sh deleted file mode 100644 index 80e18e472..000000000 --- a/ci/install.sh +++ /dev/null @@ -1,47 +0,0 @@ -set -ex - -main() { - local target= - if [ $TRAVIS_OS_NAME = linux ]; then - target=x86_64-unknown-linux-musl - sort=sort - else - target=x86_64-apple-darwin - sort=gsort # for `sort --sort-version`, from brew's coreutils. - fi - - # Builds for iOS are done on OSX, but require the specific target to be - # installed. - case $TARGET in - aarch64-apple-ios) - rustup target install aarch64-apple-ios - ;; - armv7-apple-ios) - rustup target install armv7-apple-ios - ;; - armv7s-apple-ios) - rustup target install armv7s-apple-ios - ;; - i386-apple-ios) - rustup target install i386-apple-ios - ;; - x86_64-apple-ios) - rustup target install x86_64-apple-ios - ;; - esac - - # This fetches latest stable release - local tag=$(git ls-remote --tags --refs --exit-code https://github.com/japaric/cross \ - | cut -d/ -f3 \ - | grep -E '^v[0.1.0-9.]+$' \ - | $sort --version-sort \ - | tail -n1) - curl -LSfs https://japaric.github.io/trust/install.sh | \ - sh -s -- \ - --force \ - --git japaric/cross \ - --tag $tag \ - --target $target -} - -main diff --git a/ci/script.sh b/ci/script.sh deleted file mode 100755 index 03fac0e32..000000000 --- a/ci/script.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -set -o nounset -set -o errexit -set -o xtrace - -function main() { - make test - - if command -v docker > /dev/null ; then - make integration-test-docker - fi -} - -# we don't run the "test phase" when doing deploys -if [ -z $TRAVIS_TAG ]; then - main -fi diff --git a/src/config/mod.rs b/src/config/mod.rs index 96998abc8..208211bb5 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -198,7 +198,7 @@ impl Config { auto_start: res.auto_start == 1, server_commands: res.server_commands, selection_ui, - trace: trace(&res.trace.unwrap_or("off".to_string()))?, + trace: trace(&res.trace.unwrap_or_else(|| "off".to_string()))?, settings_path: res.settings_path, load_settings: res.load_settings == 1, root_markers: res.root_markers, diff --git a/src/config/server_command.rs b/src/config/server_command.rs index dfe5d4882..2c2bc8ec0 100644 --- a/src/config/server_command.rs +++ b/src/config/server_command.rs @@ -76,6 +76,7 @@ mod test { } #[test] + #[cfg(not(target_os = "windows"))] fn test_name_from_command_handles_binary_path() { let name = ServerCommand::name_from_command(&vec!["/path/to/gopls".into()]); assert_eq!(name.as_str(), "gopls"); diff --git a/src/extensions/gopls.rs b/src/extensions/gopls.rs index 27d4e5541..6476f631a 100644 --- a/src/extensions/gopls.rs +++ b/src/extensions/gopls.rs @@ -18,7 +18,8 @@ impl LanguageClient { if let Some(args) = &cmd.arguments { if let Some(file) = args.get(0) { let file = String::deserialize(file)?; - let path = parse_package_path(file.as_str()).unwrap_or("./...".into()); + let path = + parse_package_path(file.as_str()).unwrap_or_else(|| "./...".into()); let run = >>::deserialize( args.get(1).unwrap_or(&Value::Null), )?; @@ -30,10 +31,10 @@ impl LanguageClient { let run = run.unwrap_or_default(); let bench = bench.unwrap_or_default(); - if run.len() > 0 { + if !run.is_empty() { let cmd = format!("term go test -run '{}' {}", run.join("|"), path); self.vim()?.command(cmd)?; - } else if bench.len() > 0 { + } else if !bench.is_empty() { let cmd = format!("term go test -bench '{}' {}", bench.join("|"), path); self.vim()?.command(cmd)?; } else { diff --git a/src/language_server_protocol.rs b/src/language_server_protocol.rs index e3a319556..bca46b874 100644 --- a/src/language_server_protocol.rs +++ b/src/language_server_protocol.rs @@ -98,7 +98,7 @@ impl LanguageClient { self.update_state(|state| { state .logger - .update_settings(config.logging_level.clone(), config.logging_file.clone()) + .update_settings(config.logging_level, config.logging_file.clone()) })?; let semantic_highlight_language_ids: Vec = @@ -981,13 +981,10 @@ impl LanguageClient { .server_info .as_ref() .map(|info| info.name.clone()); - match (server_name, initialization_options) { - (Some(name), Some(options)) => { - state.initialization_options = state - .initialization_options - .combine(&json!({ name: options })); - } - _ => {} + if let (Some(name), Some(options)) = (server_name, initialization_options) { + state.initialization_options = state + .initialization_options + .combine(&json!({ name: options })); } state @@ -1301,7 +1298,7 @@ impl LanguageClient { if actions.len() > 1 { return Err(anyhow!("Too many code actions found with kind {}", kind)); } - if actions.len() == 0 { + if actions.is_empty() { return Err(anyhow!("No code actions found with kind {}", kind)); } @@ -2063,7 +2060,7 @@ impl LanguageClient { let uri = filename.to_url()?; - self.get_client(&Some(language_id.clone()))?.notify( + self.get_client(&Some(language_id))?.notify( lsp_types::notification::DidSaveTextDocument::METHOD, DidSaveTextDocumentParams { text: None, @@ -2592,7 +2589,7 @@ impl LanguageClient { let language_id = self.vim()?.get_language_id(&filename, params)?; let _: () = self - .get_client(&Some(language_id.clone()))? + .get_client(&Some(language_id))? .call(lsp_types::request::Shutdown::METHOD, Value::Null)?; self.vim()? @@ -3080,7 +3077,7 @@ impl LanguageClient { let code_lenses: Vec = self.get_state(|state| match state.code_lens.get(filename) { Some(cls) => cls - .into_iter() + .iter() .filter(|cl| viewport.overlaps(cl.range)) .cloned() .collect(), @@ -3622,7 +3619,7 @@ impl LanguageClient { (None, reader, writer) } else { let command: Vec<_> = command - .into_iter() + .iter() .map(|cmd| match shellexpand::full(&cmd) { Ok(cmd) => cmd.as_ref().into(), Err(err) => { diff --git a/src/rpchandler.rs b/src/rpchandler.rs index caace4233..af0541dd0 100644 --- a/src/rpchandler.rs +++ b/src/rpchandler.rs @@ -7,10 +7,7 @@ use lsp_types::request::{self, Request}; use serde_json::Value; fn is_content_modified_error(err: &anyhow::Error) -> bool { - match err.downcast_ref::() { - Some(err) if err == &LSError::ContentModified => true, - _ => false, - } + matches!(err.downcast_ref::(), Some(err) if err == &LSError::ContentModified) } impl LanguageClient { diff --git a/src/utils.rs b/src/utils.rs index bc0fe9265..22a0c0176 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -117,10 +117,7 @@ where } fn has_extension(path: &Path, ext: &str) -> bool { - match path.extension().and_then(|e| e.to_str()) { - Some(path_ext) if path_ext == ext => true, - _ => false, - } + matches!(path.extension().and_then(|e| e.to_str()), Some(path_ext) if path_ext == ext) } fn traverse_up<'a, F>(path: &'a Path, predicate: F) -> Result<&'a Path>