Concrete where Eq<T> constraints
#6053
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [master] | |
| tags: | |
| - v* | |
| pull_request: | |
| env: | |
| CARGO_TERM_COLOR: always | |
| CARGO_INCREMENTAL: 0 | |
| CARGO_PROFILE_TEST_DEBUG: 0 | |
| RUST_BACKTRACE: full | |
| SOLC_VERSION: v0.8.30 | |
| FOUNDRY_VERSION: v1.5.1 | |
| jobs: | |
| lint: | |
| runs-on: ubuntu-latest | |
| env: | |
| RUSTFLAGS: "-D warnings" | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Install rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: stable | |
| components: rustfmt, clippy | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 | |
| - name: Generate tree-sitter parser | |
| working-directory: crates/tree-sitter-fe | |
| run: | | |
| # Install only the pinned tree-sitter CLI (skip the root package's | |
| # Node-addon build, which the Rust build doesn't use), then generate | |
| # parser.c and friends from grammar.js. | |
| npm ci --ignore-scripts | |
| npm rebuild tree-sitter-cli | |
| npx tree-sitter generate --abi=14 | |
| - name: Cache Dependencies | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Validate release notes entry | |
| run: ./newsfragments/validate_files.py | |
| - name: Lint with rustfmt | |
| run: cargo fmt --all -- --check | |
| - name: Lint with clippy | |
| run: cargo clippy --locked --workspace --all-targets --all-features -- -D clippy::all | |
| test: | |
| # Build & Test runs on all platforms | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| - os: macOS-latest | |
| - os: windows-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Install rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: stable | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 | |
| - name: Generate tree-sitter parser | |
| working-directory: crates/tree-sitter-fe | |
| shell: bash | |
| run: | | |
| # Install only the pinned tree-sitter CLI (skip the root package's | |
| # Node-addon build, which the Rust build doesn't use), then generate | |
| # parser.c and friends from grammar.js. | |
| npm ci --ignore-scripts | |
| npm rebuild tree-sitter-cli | |
| npx tree-sitter generate --abi=14 | |
| - name: Cache solc | |
| id: solc-cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ runner.os == 'Windows' && format('{0}\\solc-{1}.exe', runner.temp, env.SOLC_VERSION) || format('{0}/solc-{1}', runner.temp, env.SOLC_VERSION) }} | |
| key: solc-${{ runner.os }}-${{ env.SOLC_VERSION }} | |
| - name: Download solc (Linux/macOS) | |
| if: steps.solc-cache.outputs.cache-hit != 'true' && runner.os != 'Windows' | |
| run: | | |
| set -euo pipefail | |
| if [ "${{ runner.os }}" = "Linux" ]; then | |
| url="https://github.com/ethereum/solidity/releases/download/${SOLC_VERSION}/solc-static-linux" | |
| else | |
| url="https://github.com/ethereum/solidity/releases/download/${SOLC_VERSION}/solc-macos" | |
| fi | |
| curl -Ls "$url" -o "$RUNNER_TEMP/solc-${SOLC_VERSION}" | |
| chmod +x "$RUNNER_TEMP/solc-${SOLC_VERSION}" | |
| - name: Download solc (Windows) | |
| if: steps.solc-cache.outputs.cache-hit != 'true' && runner.os == 'Windows' | |
| shell: pwsh | |
| run: | | |
| $url = "https://github.com/ethereum/solidity/releases/download/$env:SOLC_VERSION/solc-windows.exe" | |
| $output = "$env:RUNNER_TEMP\solc-$env:SOLC_VERSION.exe" | |
| Invoke-WebRequest -Uri $url -OutFile $output | |
| - name: Install Foundry | |
| uses: foundry-rs/foundry-toolchain@v1 | |
| with: | |
| version: ${{ env.FOUNDRY_VERSION }} | |
| - name: Install cargo-nextest | |
| uses: taiki-e/install-action@nextest | |
| - name: Cache Dependencies | |
| uses: Swatinem/rust-cache@v2 | |
| with: | |
| cache-workspace-crates: true | |
| - name: Build | |
| run: cargo test --release --workspace --all-features --no-run --locked --exclude fe-language-server --exclude fe-bench | |
| - name: Run tests | |
| env: | |
| FE_SOLC_PATH: ${{ runner.os == 'Windows' && format('{0}\\solc-{1}.exe', runner.temp, env.SOLC_VERSION) || format('{0}/solc-{1}', runner.temp, env.SOLC_VERSION) }} | |
| run: cargo nextest run --release --workspace --all-features --no-fail-fast --locked --exclude fe-language-server --exclude fe-bench | |
| wasm-wasi-check: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Install rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: stable | |
| - name: Install WASM targets | |
| run: | | |
| rustup target add wasm32-unknown-unknown | |
| rustup target add wasm32-wasip1 | |
| - name: Cache Dependencies | |
| uses: Swatinem/rust-cache@v2 | |
| - name: Check core crates for wasm32-unknown-unknown | |
| run: cargo check --locked -p fe-common -p fe-parser -p fe-hir --target wasm32-unknown-unknown | |
| - name: Check filesystem crates for wasm32-wasip1 | |
| run: cargo check --locked -p fe-driver -p fe-resolver --target wasm32-wasip1 | |
| release: | |
| # Only run this when we push a tag | |
| if: startsWith(github.ref, 'refs/tags/') | |
| runs-on: ${{ matrix.os }} | |
| needs: [lint, test, wasm-wasi-check] | |
| permissions: | |
| contents: write | |
| strategy: | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| BIN_FILE: fe_linux_amd64 | |
| EXT: "" | |
| EXTRA_FEATURES: "" | |
| STRIP: strip | |
| - os: ubuntu-latest | |
| target: aarch64-unknown-linux-gnu | |
| BIN_FILE: fe_linux_arm64 | |
| EXT: "" | |
| EXTRA_FEATURES: "" | |
| STRIP: aarch64-linux-gnu-strip | |
| - os: macOS-latest | |
| target: aarch64-apple-darwin | |
| BIN_FILE: fe_mac_arm64 | |
| EXT: "" | |
| EXTRA_FEATURES: "" | |
| STRIP: strip | |
| - os: macOS-latest | |
| target: x86_64-apple-darwin | |
| BIN_FILE: fe_mac_amd64 | |
| EXT: "" | |
| EXTRA_FEATURES: "" | |
| STRIP: strip | |
| - os: windows-latest | |
| target: x86_64-pc-windows-msvc | |
| BIN_FILE: fe_windows_amd64.exe | |
| EXT: ".exe" | |
| EXTRA_FEATURES: "" | |
| STRIP: "" | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Install cross-compilation toolchain (Linux ARM64) | |
| if: matrix.target == 'aarch64-unknown-linux-gnu' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y gcc-aarch64-linux-gnu | |
| - name: Install rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| toolchain: stable | |
| targets: ${{ matrix.target }} | |
| - name: Build | |
| env: | |
| CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc | |
| run: cargo build --locked --release --target ${{ matrix.target }} ${{ matrix.EXTRA_FEATURES }} | |
| - name: Strip binary (Unix) | |
| if: runner.os != 'Windows' | |
| run: ${{ matrix.STRIP }} target/${{ matrix.target }}/release/fe | |
| - name: Rename binary | |
| shell: bash | |
| run: mv target/${{ matrix.target }}/release/fe${{ matrix.EXT }} target/${{ matrix.target }}/release/${{ matrix.BIN_FILE }} | |
| - name: Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| files: target/${{ matrix.target }}/release/${{ matrix.BIN_FILE }} | |
| prerelease: true | |
| docs: | |
| if: startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, '-') | |
| runs-on: ubuntu-latest | |
| needs: [release] | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Download fe binary from release | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| gh release download "$GITHUB_REF_NAME" --pattern 'fe_linux_amd64' --dir /tmp | |
| chmod +x /tmp/fe_linux_amd64 | |
| - name: Generate documentation | |
| run: | | |
| mkdir -p /tmp/docs-out | |
| timeout 300 /tmp/fe_linux_amd64 doc --builtins -o /tmp/docs-out json | |
| /tmp/fe_linux_amd64 doc -o /tmp/docs-out bundle --with-css | |
| python3 -c " | |
| import json, sys | |
| with open('/tmp/docs-out/docs.json') as f: | |
| d = json.load(f) | |
| sv = d.get('schema_version') | |
| cv = d.get('compiler_version') | |
| if not sv or not cv: | |
| print(f'ERROR: missing schema_version={sv} or compiler_version={cv}', file=sys.stderr) | |
| sys.exit(1) | |
| print(f'docs.json: schema v{sv}, compiler v{cv}, {len(d[\"index\"][\"items\"])} items') | |
| " | |
| - name: Deploy to doc site | |
| uses: actions/checkout@v5 | |
| with: | |
| repository: fe-lang/fe-docs | |
| token: ${{ secrets.DOC_DEPLOY_TOKEN }} | |
| path: fe-docs | |
| ref: main | |
| - name: Deploy docs | |
| run: | | |
| cd fe-docs | |
| make deploy VERSION="${GITHUB_REF_NAME#v}" OUTDIR=/tmp/docs-out | |
| - name: Push doc site | |
| run: | | |
| cd fe-docs | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git add versions.json fe-web.js fe-highlight.css styles.css "${GITHUB_REF_NAME#v}/" | |
| if git diff-index --quiet HEAD; then | |
| echo "No changes to deploy" | |
| exit 0 | |
| fi | |
| git commit -m "Deploy docs for $GITHUB_REF_NAME" | |
| for attempt in 1 2 3; do | |
| if git push; then | |
| exit 0 | |
| fi | |
| echo "Push failed (attempt $attempt), rebasing..." | |
| git pull --rebase | |
| done | |
| echo "ERROR: Failed to push after 3 attempts" >&2 | |
| exit 1 |