Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--
5351
-rw-r--r--
44431
-rw-r--r--
14079
-rw-r--r--
1087
d---------
-rw-r--r--
39246
-rw-r--r--
33134
-rw-r--r--
2990
-rw-r--r--
12784
-rw-r--r--
19415
-rw-r--r--
3553
a id='n202' href='#n202'>202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
# Please make sure that the `needs` field for the `conclusion` job
# are updated when adding new jobs!

name: CI
on:
  pull_request:
  merge_group:

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

env:
  CARGO_INCREMENTAL: 0
  CARGO_NET_RETRY: 10
  CI: 1
  RUST_BACKTRACE: short
  RUSTFLAGS: "-D warnings -D elided_lifetimes_in_paths -D explicit_outlives_requirements -D unsafe_op_in_unsafe_fn -D unused_extern_crates -D unused_lifetimes -D unreachable_pub"
  RUSTUP_MAX_RETRIES: 10

jobs:
  changes:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    outputs:
      typescript: ${{ steps.filter.outputs.typescript }}
      proc_macros: ${{ steps.filter.outputs.proc_macros }}
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@1441771bbfdd59dcd748680ee64ebd8faab1a242
        id: filter
        with:
          filters: |
            typescript:
              - 'editors/code/**'
            proc_macros:
              - 'crates/tt/**'
              - 'crates/proc-macro-api/**'
              - 'crates/proc-macro-srv/**'
              - 'crates/proc-macro-srv-cli/**'

  proc-macro-srv:
    needs: changes
    if: github.repository == 'rust-lang/rust-analyzer' && needs.changes.outputs.proc_macros == 'true'
    name: proc-macro-srv
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Install Rust toolchain
        run: |
          rustup update --no-self-update nightly
          rustup default nightly
          rustup component add --toolchain nightly rust-src rustfmt
      # https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/rust.json
      - name: Install Rust Problem Matcher
        if: matrix.os == 'ubuntu-latest'
        run: echo "::add-matcher::.github/rust.json"

      - name: Cache Dependencies
        uses: Swatinem/rust-cache@9bdad043e88c75890e36ad3bbc8d27f0090dd609

      - name: Bump opt-level
        if: matrix.os == 'ubuntu-latest'
        run: sed -i '/\[profile.dev]/a opt-level=1' Cargo.toml

      - name: Test
        run: cargo test --features sysroot-abi -p rust-analyzer -p proc-macro-srv -p proc-macro-srv-cli -p proc-macro-api -- --quiet

  rust:
    if: github.repository == 'rust-lang/rust-analyzer'
    name: Rust
    runs-on: ${{ matrix.os }}
    env:
      CC: deny_c

    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Install Rust toolchain
        run: |
          rustup update --no-self-update stable
          rustup default stable
          rustup component add --toolchain stable rust-src
          # We always use a nightly rustfmt, regardless of channel, because we need
          # --file-lines.
          rustup toolchain install nightly --profile minimal --component rustfmt
      # https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/rust.json
      - name: Install Rust Problem Matcher
        if: matrix.os == 'ubuntu-latest'
        run: echo "::add-matcher::.github/rust.json"

      - name: Cache Dependencies
        uses: Swatinem/rust-cache@9bdad043e88c75890e36ad3bbc8d27f0090dd609

      - name: Bump opt-level
        if: matrix.os == 'ubuntu-latest'
        run: sed -i '/\[profile.dev]/a opt-level=1' Cargo.toml

      - name: Codegen checks (rust-analyzer)
        run: cargo codegen --check

      - name: Compile (tests)
        run: cargo test --no-run --locked

      # It's faster to `test` before `build` ¯\_(ツ)_/¯
      - name: Compile (rust-analyzer)
        if: matrix.os == 'ubuntu-latest'
        run: cargo build --quiet

      - name: Test
        if: matrix.os == 'ubuntu-latest' || matrix.os == 'windows-latest' || github.event_name == 'push'
        run: cargo test -- --quiet

      - name: Switch to stable toolchain
        run: |
          rustup update --no-self-update stable
          rustup component add --toolchain stable rust-src clippy
          rustup default stable

      - name: Run analysis-stats on rust-analyzer
        if: matrix.os == 'ubuntu-latest'
        run: target/${{ matrix.target }}/debug/rust-analyzer analysis-stats .

      - name: Run analysis-stats on the rust standard libraries
        if: matrix.os == 'ubuntu-latest'
        env:
          RUSTC_BOOTSTRAP: 1
        run: target/${{ matrix.target }}/debug/rust-analyzer analysis-stats --with-deps --no-sysroot --no-test $(rustc --print sysroot)/lib/rustlib/src/rust/library/

      - name: clippy
        if: matrix.os == 'windows-latest'
        run: cargo clippy --all-targets -- -D clippy::disallowed_macros -D clippy::dbg_macro -D clippy::todo -D clippy::print_stdout -D clippy::print_stderr

      - name: rustfmt
        if: matrix.os == 'ubuntu-latest'
        run: cargo fmt -- --check

  # Weird targets to catch non-portable code
  rust-cross:
    if: github.repository == 'rust-lang/rust-analyzer'
    name: Rust Cross
    runs-on: ubuntu-latest

    env:
      targets: "powerpc-unknown-linux-gnu x86_64-unknown-linux-musl"
      # The rust-analyzer binary is not expected to compile on WASM, but the IDE
      # crate should
      targets_ide: "wasm32-unknown-unknown"

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        run: |
          rustup update --no-self-update stable
          rustup target add ${{ env.targets }} ${{ env.targets_ide }}

      - name: Cache Dependencies
        uses: Swatinem/rust-cache@9bdad043e88c75890e36ad3bbc8d27f0090dd609

      - name: Check
        run: |
          for target in ${{ env.targets }}; do
            cargo check --target=$target --all-targets
          done
          for target in ${{ env.targets_ide }}; do
            cargo check -p ide --target=$target --all-targets
          done

  typescript:
    needs: changes
    if: github.repository == 'rust-lang/rust-analyzer' && needs.changes.outputs.typescript == 'true'
    name: TypeScript
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest]

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install Nodejs
        uses: actions/setup-node@v4
        with:
          node-version: 22

      - name: Install xvfb
        if: matrix.os == 'ubuntu-latest'
        run: sudo apt-get install -y xvfb

      - run: npm ci
        working-directory: ./editors/code

      #    - run: npm audit || { sleep 10 && npm audit; } || { sleep 30 && npm audit; }
      #      if: runner.os == 'Linux'
      #      working-directory: ./editors/code

      # If this steps fails, your code's type integrity might be wrong at some places at TypeScript level.
      - run: npm run typecheck
        working-directory: ./editors/code

      # You may fix the code automatically by running `npm run lint:fix` if this steps fails.
      - run: npm run lint
        working-directory: ./editors/code

      # To fix this steps, please run `npm run format`.
      - run: npm run format:check
        working-directory: ./editors/code

      - name: Run VS Code tests (Linux)
        if: matrix.os == 'ubuntu-latest'
        env:
          VSCODE_CLI: 1
        run: xvfb-run npm test
        working-directory: ./editors/code

      - name: Run VS Code tests (Windows)
        if: matrix.os == 'windows-latest'
        env:
          VSCODE_CLI: 1
        run: npm test
        working-directory: ./editors/code

      - run: npm run package --scripts-prepend-node-path
        working-directory: ./editors/code

  typo-check:
    name: Typo Check
    runs-on: ubuntu-latest
    timeout-minutes: 10
    env:
      FORCE_COLOR: 1
      TYPOS_VERSION: v1.28.3
    steps:
      - name: download typos
        run: curl -LsSf https://github.com/crate-ci/typos/releases/download/$TYPOS_VERSION/typos-$TYPOS_VERSION-x86_64-unknown-linux-musl.tar.gz | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin

      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: check for typos
        run: typos

  conclusion:
    needs: [rust, rust-cross, typescript, typo-check, proc-macro-srv]
    # We need to ensure this job does *not* get skipped if its dependencies fail,
    # because a skipped job is considered a success by GitHub. So we have to
    # overwrite `if:`. We use `!cancelled()` to ensure the job does still not get run
    # when the workflow is canceled manually.
    #
    # ALL THE PREVIOUS JOBS NEED TO BE ADDED TO THE `needs` SECTION OF THIS JOB!
    if: ${{ !cancelled() }}
    runs-on: ubuntu-latest
    steps:
      # Manually check the status of all dependencies. `if: failure()` does not work.
      - name: Conclusion
        run: |
          # Print the dependent jobs to see them in the CI log
          jq -C <<< '${{ toJson(needs) }}'
          # Check if all jobs that we depend on (in the needs array) were successful (or have been skipped).
          jq --exit-status 'all(.result == "success" or .result == "skipped")' <<< '${{ toJson(needs) }}'