name: nvim-treesitter parser tests

on:
  pull_request:
    paths:
      - 'crates/cli/**'
      - 'crates/config/**'
      - 'crates/generate/**'
      - 'crates/loader/**'
      - '.github/workflows/nvim_ts.yml'
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  check_compilation:
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        type: [generate, build]
    name: ${{ matrix.os }} - ${{ matrix.type }}
    runs-on: ${{ matrix.os }}
    env:
      NVIM: ${{ matrix.os == 'windows-latest' && 'nvim-win64\\bin\\nvim.exe' || 'nvim' }}
      NVIM_TS_DIR: nvim-treesitter
    steps:
      - uses: actions/checkout@v6

      - uses: actions/checkout@v6
        with:
          repository: nvim-treesitter/nvim-treesitter
          path: ${{ env.NVIM_TS_DIR }}
          ref: main

      - if: runner.os != 'Windows'
        run: echo ${{ github.workspace }}/target/release >> $GITHUB_PATH

      - if: runner.os == 'Windows'
        run: echo ${{ github.workspace }}/target/release >> $env:GITHUB_PATH

      - uses: actions-rust-lang/setup-rust-toolchain@v1
      - run: cargo build --release
      - uses: ilammy/msvc-dev-cmd@v1

      - name: Install and prepare Neovim
        run: bash ./scripts/ci-install.sh
        working-directory: ${{ env.NVIM_TS_DIR }}

      - if: matrix.type == 'generate'
        name: Generate and compile parsers
        run: $NVIM -l ./scripts/install-parsers.lua --generate --max-jobs=2
        working-directory: ${{ env.NVIM_TS_DIR }}
        shell: bash

      - if: matrix.type == 'build'
        name: Compile parsers
        run: $NVIM -l ./scripts/install-parsers.lua --max-jobs=10
        working-directory: ${{ env.NVIM_TS_DIR }}
        shell: bash

      - if: "!cancelled()"
        name: Check query files
        run: $NVIM -l ./scripts/check-queries.lua
        working-directory: ${{ env.NVIM_TS_DIR }}
        shell: bash
