From ecf5d79e0108fae6aac09af158e6e145b967a8e4 Mon Sep 17 00:00:00 2001 From: Ashcon Partovi Date: Wed, 25 Sep 2024 10:31:38 -0700 Subject: [PATCH] `bun run clang-tidy` (#14162) --- .github/workflows/clang-format.yml | 9 +- .github/workflows/clang-tidy.yml | 60 +++++++++++++ .github/workflows/prettier-format.yml | 7 +- .github/workflows/zig-format.yml | 5 +- CMakeLists.txt | 3 + cmake/Globals.cmake | 6 ++ cmake/analysis/RunClangFormat.cmake | 34 +++++++ cmake/analysis/RunClangTidy.cmake | 65 ++++++++++---- cmake/analysis/RunPrettier.cmake | 123 ++++++++++++++++++++++++++ cmake/analysis/RunZigFormat.cmake | 31 +++++++ cmake/tools/SetupGit.cmake | 38 ++++++++ cmake/tools/SetupLLVM.cmake | 2 + package.json | 12 ++- 13 files changed, 367 insertions(+), 28 deletions(-) create mode 100644 .github/workflows/clang-tidy.yml create mode 100644 cmake/analysis/RunPrettier.cmake create mode 100644 cmake/tools/SetupGit.cmake diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index be3b7bf313175..193225603c6e2 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -48,11 +48,12 @@ jobs: - name: Install LLVM run: | curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- ${{ env.LLVM_VERSION_MAJOR }} all - sudo apt-get update - sudo apt-get install -y ninja-build ccache - - name: Format + - name: Clang Format + env: + ENABLE_CCACHE: OFF + LLVM_VERSION: ${{ env.LLVM_VERSION }} run: | - bun run clang-format -DLLVM_VERSION=${{ env.LLVM_VERSION }} + bun run clang-format:diff - name: Commit uses: stefanzweifel/git-auto-commit-action@v5 with: diff --git a/.github/workflows/clang-tidy.yml b/.github/workflows/clang-tidy.yml new file mode 100644 index 0000000000000..27441c7b5522d --- /dev/null +++ b/.github/workflows/clang-tidy.yml @@ -0,0 +1,60 @@ +name: clang-tidy + +permissions: + contents: write + +on: + workflow_call: + workflow_dispatch: + pull_request: + paths: + - ".github/workflows/clang-tidy.yml" + - ".clang-tidy" + - "package.json" + - "scripts/**" + - "cmake/**" + - "src/**/*.c" + - "src/**/*.cpp" + - "src/**/*.h" + - "packages/**/*.c" + - "packages/**/*.cpp" + - "packages/**/*.h" + +env: + BUN_VERSION: "1.1.27" + LLVM_VERSION: "18.1.8" + LLVM_VERSION_MAJOR: "18" + +jobs: + clang-tidy: + name: clang-tidy + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + .clang-tidy + package.json + scripts + cmake + src + packages + - name: Setup Bun + uses: ./.github/actions/setup-bun + with: + bun-version: ${{ env.BUN_VERSION }} + - name: Install LLVM + run: | + curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- ${{ env.LLVM_VERSION_MAJOR }} all + - name: Clang Tidy + env: + ENABLE_CCACHE: OFF + LLVM_VERSION: ${{ env.LLVM_VERSION }} + run: | + bun run clang-tidy:diff + - name: Commit + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "`bun run clang-tidy`" diff --git a/.github/workflows/prettier-format.yml b/.github/workflows/prettier-format.yml index 718c6fb5c502c..ef7a8fe69733e 100644 --- a/.github/workflows/prettier-format.yml +++ b/.github/workflows/prettier-format.yml @@ -37,9 +37,12 @@ jobs: - name: Setup Dependencies run: | bun install - - name: Format + - name: Prettier Format + env: + ENABLE_CCACHE: OFF + SKIP_LLVM: ON run: | - bun run prettier:extra + bun run prettier:diff - name: Commit uses: stefanzweifel/git-auto-commit-action@v5 with: diff --git a/.github/workflows/zig-format.yml b/.github/workflows/zig-format.yml index 0855fe0550b21..2f5ad915932f0 100644 --- a/.github/workflows/zig-format.yml +++ b/.github/workflows/zig-format.yml @@ -37,8 +37,11 @@ jobs: with: bun-version: ${{ env.BUN_VERSION }} - name: Zig Format + env: + ENABLE_CCACHE: OFF + SKIP_LLVM: ON run: | - bun run zig-format -DENABLE_CCACHE=OFF -DSKIP_LLVM=ON + bun run zig-format:diff - name: Commit uses: stefanzweifel/git-auto-commit-action@v5 with: diff --git a/CMakeLists.txt b/CMakeLists.txt index 20b999e2e19ac..3fe5cf20c133f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ include(CompilerFlags) # --- Tools --- +include(SetupGit) include(SetupBuildkite) include(SetupBun) include(SetupEsbuild) @@ -43,4 +44,6 @@ include(BuildBun) # --- Analysis --- include(RunClangFormat) +include(RunClangTidy) include(RunZigFormat) +include(RunPrettier) diff --git a/cmake/Globals.cmake b/cmake/Globals.cmake index 7e9655e6791b1..3b9714548bd15 100644 --- a/cmake/Globals.cmake +++ b/cmake/Globals.cmake @@ -123,6 +123,12 @@ optionx(CACHE_STRATEGY "read-write|read-only|write-only|none" "The strategy to u optionx(CI BOOL "If CI is enabled" DEFAULT OFF) +if(CI) + set(WARNING FATAL_ERROR) +else() + set(WARNING WARNING) +endif() + if(CI) set(DEFAULT_VENDOR_PATH ${CACHE_PATH}/vendor) else() diff --git a/cmake/analysis/RunClangFormat.cmake b/cmake/analysis/RunClangFormat.cmake index ef332742555b4..7586e68aeb56e 100644 --- a/cmake/analysis/RunClangFormat.cmake +++ b/cmake/analysis/RunClangFormat.cmake @@ -1,3 +1,5 @@ +# https://clang.llvm.org/docs/ClangFormat.html + find_command( VARIABLE CLANG_FORMAT_PROGRAM @@ -35,3 +37,35 @@ register_command( ${CLANG_FORMAT_SOURCES} ALWAYS_RUN ) + +if(GIT_CHANGED_SOURCES) + set(CLANG_FORMAT_CHANGED_SOURCES) + foreach(source ${CLANG_FORMAT_SOURCES}) + list(FIND GIT_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND CLANG_FORMAT_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(CLANG_FORMAT_CHANGED_SOURCES) + set(CLANG_FORMAT_DIFF_COMMAND ${CLANG_FORMAT_PROGRAM} + -i # edits files in-place + --verbose + ${CLANG_FORMAT_CHANGED_SOURCES} + ) +else() + set(CLANG_FORMAT_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for clang-format") +endif() + +register_command( + TARGET + clang-format-diff + COMMENT + "Running clang-format on changed files" + COMMAND + ${CLANG_FORMAT_DIFF_COMMAND} + CWD + ${BUILD_PATH} + ALWAYS_RUN +) diff --git a/cmake/analysis/RunClangTidy.cmake b/cmake/analysis/RunClangTidy.cmake index bac6cc5e75353..36f60306b9b22 100644 --- a/cmake/analysis/RunClangTidy.cmake +++ b/cmake/analysis/RunClangTidy.cmake @@ -11,46 +11,75 @@ find_command( OFF ) -set(CLANG_TIDY_COMMAND ${CLANG_TIDY_PROGRAM} ${BUN_CPP_SOURCES} +set(CLANG_TIDY_SOURCES ${BUN_C_SOURCES} ${BUN_CXX_SOURCES}) + +set(CLANG_TIDY_COMMAND ${CLANG_TIDY_PROGRAM} -p ${BUILD_PATH} --config-file=${CWD}/.clang-tidy - --fix - --fix-errors - --fix-notes ) if(CMAKE_COLOR_DIAGNOSTICS) list(APPEND CLANG_TIDY_COMMAND --use-color) endif() -# Extra clang-tidy checks that are normally disabled due to noise. -# e.g. JavaScriptCore/Lookup.h -set(CLANG_TIDY_EXTRA_COMMAND ${CLANG_TIDY_PROGRAM} - --checks=performance-* -) - register_command( TARGET clang-tidy COMMENT "Running clang-tidy" COMMAND - ${CLANG_TIDY_COMMAND} + ${CLANG_TIDY_COMMAND} + ${CLANG_TIDY_SOURCES} + --fix + --fix-errors + --fix-notes CWD ${BUILD_PATH} - TARGETS - ${bun} + ALWAYS_RUN ) register_command( TARGET - clang-tidy-extra + clang-tidy-check + COMMENT + "Checking clang-tidy" + COMMAND + ${CLANG_TIDY_COMMAND} + ${CLANG_TIDY_SOURCES} + CWD + ${BUILD_PATH} + ALWAYS_RUN +) + +if(GIT_CHANGED_SOURCES) + set(CLANG_TIDY_CHANGED_SOURCES) + foreach(source ${CLANG_TIDY_SOURCES}) + list(FIND GIT_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND CLANG_TIDY_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(CLANG_TIDY_CHANGED_SOURCES) + set(CLANG_TIDY_DIFF_COMMAND ${CLANG_TIDY_PROGRAM} + ${CLANG_TIDY_CHANGED_SOURCES} + --fix + --fix-errors + --fix-notes + ) +else() + set(CLANG_TIDY_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for clang-tidy") +endif() + +register_command( + TARGET + clang-tidy-diff COMMENT - "Running clang-tidy with extra checks" + "Running clang-tidy on changed files" COMMAND - ${CLANG_TIDY_EXTRA_COMMAND} + ${CLANG_TIDY_DIFF_COMMAND} CWD ${BUILD_PATH} - TARGETS - ${bun} + ALWAYS_RUN ) diff --git a/cmake/analysis/RunPrettier.cmake b/cmake/analysis/RunPrettier.cmake new file mode 100644 index 0000000000000..7d509af2d0138 --- /dev/null +++ b/cmake/analysis/RunPrettier.cmake @@ -0,0 +1,123 @@ +if(CMAKE_HOST_WIN32) + setx(PRETTIER_EXECUTABLE ${CWD}/node_modules/.bin/prettier.exe) +else() + setx(PRETTIER_EXECUTABLE ${CWD}/node_modules/.bin/prettier) +endif() + +set(PRETTIER_PATHS + ${CWD}/src + ${CWD}/packages/bun-error + ${CWD}/packages/bun-types + ${CWD}/packages/bun-inspector-protocol + ${CWD}/packages/bun-inspector-frontend + ${CWD}/packages/bun-debug-adapter-protocol + ${CWD}/packages/bun-vscode + ${CWD}/test + ${CWD}/bench + ${CWD}/.vscode + ${CWD}/.buildkite + ${CWD}/.github +) + +set(PRETTIER_EXTENSIONS + *.jsonc? + *.ya?ml + *.jsx? + *.tsx? + *.mjs + *.cjs + *.mts + *.cts +) + +set(PRETTIER_GLOBS) +foreach(path ${PRETTIER_PATHS}) + foreach(extension ${PRETTIER_EXTENSIONS}) + list(APPEND PRETTIER_GLOBS ${path}/${extension}) + endforeach() +endforeach() + +file(GLOB_RECURSE PRETTIER_SOURCES ${PRETTIER_GLOBS}) + +register_command( + COMMAND + ${BUN_EXECUTABLE} + install + --frozen-lockfile + SOURCES + ${CWD}/package.json + OUTPUTS + ${PRETTIER_EXECUTABLE} +) + +set(PRETTIER_COMMAND ${PRETTIER_EXECUTABLE} + --config=${CWD}/.prettierrc + --cache +) + +register_command( + TARGET + prettier + COMMENT + "Running prettier" + COMMAND + ${PRETTIER_COMMAND} + --write + ${PRETTIER_SOURCES} + ALWAYS_RUN +) + +register_command( + TARGET + prettier-extra + COMMENT + "Running prettier with extra plugins" + COMMAND + ${PRETTIER_COMMAND} + --write + --plugin=prettier-plugin-organize-imports + ${PRETTIER_SOURCES} + ALWAYS_RUN +) + +register_command( + TARGET + prettier-check + COMMENT + "Checking prettier" + COMMAND + ${PRETTIER_COMMAND} + --check + ${PRETTIER_SOURCES} + ALWAYS_RUN +) + +if(GIT_CHANGED_SOURCES) + set(PRETTIER_CHANGED_SOURCES) + foreach(source ${PRETTIER_SOURCES}) + list(FIND PRETTIER_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND PRETTIER_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(PRETTIER_CHANGED_SOURCES) + set(PRETTIER_DIFF_COMMAND ${PRETTIER_COMMAND} + --write + --plugin=prettier-plugin-organize-imports + ${PRETTIER_CHANGED_SOURCES} + ) +else() + set(PRETTIER_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for prettier") +endif() + +register_command( + TARGET + prettier-diff + COMMENT + "Running prettier on changed files" + COMMAND + ${PRETTIER_DIFF_COMMAND} + ALWAYS_RUN +) diff --git a/cmake/analysis/RunZigFormat.cmake b/cmake/analysis/RunZigFormat.cmake index 98d3ce670968e..0ff7c23865352 100644 --- a/cmake/analysis/RunZigFormat.cmake +++ b/cmake/analysis/RunZigFormat.cmake @@ -24,3 +24,34 @@ register_command( ${ZIG_FORMAT_SOURCES} ALWAYS_RUN ) + +if(GIT_CHANGED_SOURCES) + set(ZIG_FORMAT_CHANGED_SOURCES) + foreach(source ${ZIG_FORMAT_SOURCES}) + list(FIND GIT_CHANGED_SOURCES ${source} index) + if(NOT ${index} EQUAL -1) + list(APPEND ZIG_FORMAT_CHANGED_SOURCES ${source}) + endif() + endforeach() +endif() + +if(ZIG_FORMAT_CHANGED_SOURCES) + set(ZIG_FORMAT_DIFF_COMMAND ${ZIG_EXECUTABLE} + fmt + ${ZIG_FORMAT_CHANGED_SOURCES} + ) +else() + set(ZIG_FORMAT_DIFF_COMMAND ${CMAKE_COMMAND} -E echo "No changed files for zig-format") +endif() + +register_command( + TARGET + zig-format-diff + COMMENT + "Running zig fmt on changed files" + COMMAND + ${ZIG_FORMAT_DIFF_COMMAND} + CWD + ${BUILD_PATH} + ALWAYS_RUN +) diff --git a/cmake/tools/SetupGit.cmake b/cmake/tools/SetupGit.cmake new file mode 100644 index 0000000000000..33e11b55033bf --- /dev/null +++ b/cmake/tools/SetupGit.cmake @@ -0,0 +1,38 @@ +find_command( + VARIABLE + GIT_PROGRAM + COMMAND + git + REQUIRED + OFF +) + +if(NOT GIT_PROGRAM) + return() +endif() + +set(GIT_DIFF_COMMAND ${GIT_PROGRAM} diff --no-color --name-only --diff-filter=AMCR) + +execute_process( + COMMAND + ${GIT_DIFF_COMMAND} + WORKING_DIRECTORY + ${CWD} + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE + GIT_DIFF + ERROR_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE + GIT_DIFF_ERROR + RESULT_VARIABLE + GIT_DIFF_RESULT +) + +if(NOT GIT_DIFF_RESULT EQUAL 0) + message(${WARNING} "Command failed: ${GIT_DIFF_COMMAND} ${GIT_DIFF_ERROR}") + return() +endif() + +string(REPLACE "\n" ";" GIT_CHANGED_SOURCES "${GIT_DIFF}") +list(TRANSFORM GIT_CHANGED_SOURCES PREPEND ${CWD}/) +list(LENGTH GIT_CHANGED_SOURCES GIT_CHANGED_SOURCES_COUNT) diff --git a/cmake/tools/SetupLLVM.cmake b/cmake/tools/SetupLLVM.cmake index 7298415980d96..c01aaab822a93 100644 --- a/cmake/tools/SetupLLVM.cmake +++ b/cmake/tools/SetupLLVM.cmake @@ -1,3 +1,5 @@ +optionx(SKIP_LLVM BOOL "If LLVM setup should be skipped" DEFAULT OFF) + if(SKIP_LLVM) return() endif() diff --git a/package.json b/package.json index 12022404c5626..89d9f0f813da1 100644 --- a/package.json +++ b/package.json @@ -58,10 +58,16 @@ "cmake": "bun ./scripts/build.mjs -DCMAKE_BUILD_TYPE=Debug -B build/debug", "clang-format": "bun run cmake --target clang-format", "clang-format:check": "bun run cmake --target clang-format-check", + "clang-format:diff": "bun run cmake --target clang-format-diff", + "clang-tidy": "bun run cmake --target clang-tidy", + "clang-tidy:check": "bun run cmake --target clang-tidy-check", + "clang-tidy:diff": "bun run cmake --target clang-tidy-diff", "zig-format": "bun run cmake --target zig-format", "zig-format:check": "bun run cmake --target zig-format-check", - "prettier": "prettier --config=.prettierrc --write --cache './{.vscode,src,test,bench,packages/{bun-types,bun-inspector-*,bun-vscode,bun-debug-adapter-protocol}}/**/*.{mjs,ts,tsx,js,jsx}'", - "prettier:check": "bun run prettier --check", - "prettier:extra": "bun run prettier --plugin=prettier-plugin-organize-imports" + "zig-format:diff": "bun run cmake --target zig-format-diff", + "prettier": "bun run cmake --target prettier", + "prettier:check": "bun run cmake --target prettier-check", + "prettier:extra": "bun run cmake --target prettier-extra", + "prettier:diff": "bun run cmake --target prettier-diff" } }