From 4a58e978128c12d23e4305ee62a93f5c0e6c17ad Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Tue, 26 May 2026 13:14:37 +0200 Subject: [PATCH] Add git hooks Signed-off-by: CHatingPython --- .clang-tidy | 14 ++++++------- .clangd | 4 ++-- .githooks/pre-commit | 29 +++++++++++++++++++++++++++ .githooks/pre-push | 15 ++++++++++++++ furc/include/furc/ast/declaration.hpp | 16 --------------- furc/include/furc/ast/literal.hpp | 2 +- furc/include/furc/diag.hpp | 4 ++-- furc/include/furc/handle.hpp | 25 +++++++++++------------ furc/src/front/parser.cpp | 4 ++-- 9 files changed, 70 insertions(+), 43 deletions(-) create mode 100755 .githooks/pre-commit create mode 100755 .githooks/pre-push diff --git a/.clang-tidy b/.clang-tidy index 3109f61..0dec191 100755 --- a/.clang-tidy +++ b/.clang-tidy @@ -49,17 +49,17 @@ CheckOptions: # Types - key: readability-identifier-naming.StructCase - value: snake_case + value: lower_case - key: readability-identifier-naming.ClassCase - value: snake_case + value: lower_case - key: readability-identifier-naming.EnumCase - value: snake_case + value: lower_case # - key: readability-identifier-naming.AbstractClassPrefix # value: I # Functions - key: readability-identifier-naming.FunctionCase - value: snake_case + value: lower_case # Variables - key: readability-identifier-naming.VariableCase @@ -81,13 +81,13 @@ CheckOptions: # Static constexpr - key: readability-identifier-naming.StaticConstexprVariableCase - value: aNy_CaSe + value: aNy_CasE # Constants - key: readability-identifier-naming.ConstantCase - value: aNy_CaSe + value: aNy_CasE - key: readability-identifier-naming.StaticConstantCase - value: aNy_CaSe + value: aNy_CasE - key: readability-identifier-naming.EnumConstantCase value: CamelCase - key: readability-identifier-naming.ScopedEnumConstantCase diff --git a/.clangd b/.clangd index 356abbc..500c8c2 100755 --- a/.clangd +++ b/.clangd @@ -1,5 +1,5 @@ CompileFlags: - Add: [-std=c11, -Wall, -Werror, -Wpedantic] + Add: [-std=c++17, -Wall, -Werror, -Wpedantic] InlayHints: BlockEnd: true @@ -16,7 +16,7 @@ Hover: ShowAKA: true If: - PathMatch: (./.*\.c|./.*\.h) + PathMatch: (./.*\.cpp|./.*\.hpp) Diagnostics: UnusedIncludes: Strict MissingIncludes: Strict diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..a74fd90 --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -e + +BUILD_DIR="build" + +echo "Running clang-format..." + +FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(cpp|hpp)$' || true) + +if [ -z "$FILES" ]; then + echo "No C/C++ files to check" + exit 0 +fi + +for file in $FILES; do + clang-format -i "$file" + git add "$file" +done + +echo "Running clang-tidy..." + +for file in $FILES; do + clang-tidy \ + "$file" \ + -p "$BUILD_DIR" +done + +echo "pre-commit checks passed" \ No newline at end of file diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 0000000..2112ce5 --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -e + +BUILD_DIR="build" + +echo "Building..." + +cmake --build "$BUILD_DIR" + +echo "Running tests..." + +ctest --test-dir "$BUILD_DIR" --output-on-failure + +echo "pre-push checks passed" \ No newline at end of file diff --git a/furc/include/furc/ast/declaration.hpp b/furc/include/furc/ast/declaration.hpp index 28e69a1..56ef412 100644 --- a/furc/include/furc/ast/declaration.hpp +++ b/furc/include/furc/ast/declaration.hpp @@ -50,22 +50,6 @@ class function_definition_node : public function_declarartion_node { public: function_definition_node(front::token name, function_body_handle&& body) : function_declarartion_node(name), m_body(std::move(body)) {} - - ~function_definition_node() override = default; - - function_definition_node(function_definition_node&& other) noexcept - : function_declarartion_node(std::move(other)), m_body(std::move(other.m_body)) {} - - function_definition_node(const function_definition_node&) = delete; - - function_definition_node& operator=(function_definition_node&& other) noexcept { - if (this == &other) return *this; - function_declarartion_node::operator=(std::move(other)); - m_body = std::move(other.m_body); - return *this; - } - - function_definition_node& operator=(const function_definition_node&) = delete; public: declaration_node_t declaration_type() const override { return declaration_node_t::FunctionDefinition; } diff --git a/furc/include/furc/ast/literal.hpp b/furc/include/furc/ast/literal.hpp index d22e12a..47f7b1b 100644 --- a/furc/include/furc/ast/literal.hpp +++ b/furc/include/furc/ast/literal.hpp @@ -32,7 +32,7 @@ public: const handle& value() const { return m_value; } public: std::ostream& print(std::ostream& os) const override { - if (m_value.has_error()) return os << (std::string)m_value; + if (m_value.has_error()) return os << m_value.error(); return os << "string literal (" << *m_value << ")"; } private: diff --git a/furc/include/furc/diag.hpp b/furc/include/furc/diag.hpp index f3de0e7..2e99fb5 100644 --- a/furc/include/furc/diag.hpp +++ b/furc/include/furc/diag.hpp @@ -8,8 +8,8 @@ namespace furc { struct location { std::string_view filename; - std::size_t line; - std::size_t column; + std::size_t line = 0; + std::size_t column = 0; }; static inline std::ostream& operator<<(std::ostream& os, const location& location) { diff --git a/furc/include/furc/handle.hpp b/furc/include/furc/handle.hpp index 38c26c4..8bc52ac 100644 --- a/furc/include/furc/handle.hpp +++ b/furc/include/furc/handle.hpp @@ -75,13 +75,10 @@ public: Error error() const { return m_error; } - operator reference() { return *m_value; } - operator const_reference() const { return *m_value; } - - reference operator*() { return *m_value; } - const_reference operator*() const { return *m_value; } - pointer operator->() { return &*m_value; } - const_pointer operator->() const { return &*m_value; } + reference operator*() { return m_value.value(); } // NOLINT(bugprone-unchecked-optional-access) + const_reference operator*() const { return m_value.value(); } // NOLINT(bugprone-unchecked-optional-access) + pointer operator->() { return &m_value.value(); } // NOLINT(bugprone-unchecked-optional-access) + const_pointer operator->() const { return &m_value.value(); } // NOLINT(bugprone-unchecked-optional-access) public: bool operator==(const T& rhs) const { return m_value.has_value() && *m_value == rhs; } public: @@ -119,7 +116,7 @@ public: template >> handle(location location, std::shared_ptr value) - : m_data(data(location, value)) {} + : m_data(data(location, std::move(value))) {} template || std::is_base_of_v>> @@ -196,16 +193,18 @@ private: template >> data(struct location location, std::shared_ptr value) - : location(location), value(value) {} + : location(location), value(std::move(value)) {} template || std::is_base_of_v>> - data(handle&& other) // NOLINT - : location(other.m_data->location) { + data(handle&& other) // NOLINT + : location(other.m_data->location) { // NOLINT(bugprone-unchecked-optional-access) if constexpr (std::is_base_of_v) { - value = std::static_pointer_cast(std::move(other.m_data->value)); + value = std::static_pointer_cast( + std::move(other.m_data->value)); // NOLINT(bugprone-unchecked-optional-access) } else { - value = std::dynamic_pointer_cast(std::move(other.m_data->value)); + value = std::dynamic_pointer_cast( + std::move(other.m_data->value)); // NOLINT(bugprone-unchecked-optional-access) } } diff --git a/furc/src/front/parser.cpp b/furc/src/front/parser.cpp index 0a04afb..2a30283 100644 --- a/furc/src/front/parser.cpp +++ b/furc/src/front/parser.cpp @@ -58,12 +58,12 @@ ast::node_handle parser::parse_declaration() { if (body.has_error()) return body; return ast::node_handle{ first.location(), m_arena, - name, + *name, std::move(body) }; } case token_t::Semicolon: { m_peekBuffer.clear(); - return ast::node_handle{ first.location(), m_arena, name }; + return ast::node_handle{ first.location(), m_arena, *name }; } default: return { tok.location(), "unexpected token "s + tok->type }; }