From 7947fb89417cbd0dee565a1af6e9ba7cf2831573 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Mon, 17 Mar 2025 22:06:25 +0300 Subject: [PATCH 01/19] first commit --- .../CMakeLists.txt | 18 +++++ .../shishkarev_a_implicit_conversions.cpp | 72 +++++++++++++++++++ ...shishkarev_a_implicit_conversions_test.cpp | 18 +++++ 3 files changed, 108 insertions(+) create mode 100644 clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt create mode 100644 clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp create mode 100644 clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt b/clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt new file mode 100644 index 0000000000000..7bdc4da59a991 --- /dev/null +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt @@ -0,0 +1,18 @@ +set(Title "ClangAST") +set(Student "Shishkarev_Andrey") +set(Group "FIIT2") +set(TARGET_NAME "${Title}_${Student}_${Group}_ClangAST") + +file(GLOB_RECURSE SOURCES *.cpp *.h *.hpp) +add_llvm_library(${TARGET_NAME} MODULE ${SOURCES} PLUGIN_TOOL clang) + +if(WIN32 OR CYGWIN) + set(LLVM_LINK_COMPONENTS Support) + clang_target_link_libraries(${TARGET_NAME} PRIVATE + clangAST + clangBasic + clangFrontend + ) +endif() + +set(CLANG_TEST_DEPS "${TARGET_NAME}" ${CLANG_TEST_DEPS} PARENT_SCOPE) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp new file mode 100644 index 0000000000000..aaa4361da71e5 --- /dev/null +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -0,0 +1,72 @@ +#include "clang/AST/ASTConsumer.h" +#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/Frontend/FrontendPluginRegistry.h" +#include "llvm/Support/raw_ostream.h" + +namespace { +class ImplicitConversionVisitor : public clang::RecursiveASTVisitor { +public: + explicit ImplicitConversionVisitor(clang::ASTContext *context) : m_context(context) {} + + bool VisitFunctionDecl(clang::FunctionDecl *func) { + llvm::outs() << "Function `" << func->getName() << "`\n"; + m_conversions.clear(); + + // Обходим тело функции + if (func->hasBody()) { + TraverseStmt(func->getBody()); + } + + // Выводим результаты + for (const auto &conv : m_conversions) { + llvm::outs() << conv.first << " -> " << conv.second << ": " << m_conversions[conv] << "\n"; + } + + return true; + } + + bool VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) { + // Получаем типы до и после преобразования + auto fromType = expr->getSubExpr()->getType().getAsString(); + auto toType = expr->getType().getAsString(); + + // Увеличиваем счетчик для данного преобразования + m_conversions[std::make_pair(fromType, toType)]++; + + return true; + } + +private: + clang::ASTContext *m_context; + std::map, int> m_conversions; +}; + +class ImplicitConversionConsumer : public clang::ASTConsumer { +public: + explicit ImplicitConversionConsumer(clang::ASTContext *context) : m_visitor(context) {} + + void HandleTranslationUnit(clang::ASTContext &context) override { + m_visitor.TraverseDecl(context.getTranslationUnitDecl()); + } + +private: + ImplicitConversionVisitor m_visitor; +}; + +class ImplicitConversionAction : public clang::PluginASTAction { +public: + std::unique_ptr + CreateASTConsumer(clang::CompilerInstance &ci, llvm::StringRef) override { + return std::make_unique(&ci.getASTContext()); + } + + bool ParseArgs(const clang::CompilerInstance &ci, + const std::vector &args) override { + return true; + } +}; +} // namespace + +static clang::FrontendPluginRegistry::Add + X("implicit_conversion_plugin", "Counts implicit type conversions"); \ No newline at end of file diff --git a/clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp b/clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp new file mode 100644 index 0000000000000..4be395ead51ba --- /dev/null +++ b/clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -load %llvmshlibdir/ImplicitConversionCounter_Ivanov_Ivan_FIIT0_ClangAST%pluginext -plugin implicit_conversion_plugin -fsyntax-only %s 2>&1 | FileCheck %s + +// CHECK: Function `sum` +// CHECK-NEXT: int -> float: 1 +// CHECK-NEXT: float -> double: 1 + +// CHECK: Function `mul` +// CHECK-NEXT: float -> int: 1 +// CHECK-NEXT: float -> double: 1 +// CHECK-NEXT: double -> int: 1 + +double sum(int a, float b) { + return a + b; +} + +int mul(float a, float b) { + return a + sum(a, b); +} \ No newline at end of file From 75a1542f9d42b994e35b9db583ed54b7bcf8466e Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 00:12:40 +0300 Subject: [PATCH 02/19] fix build --- .../shishkarev_a_implicit_conversions.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index aaa4361da71e5..a5102319faf15 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -3,6 +3,9 @@ #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendPluginRegistry.h" #include "llvm/Support/raw_ostream.h" +#include +#include +#include namespace { class ImplicitConversionVisitor : public clang::RecursiveASTVisitor { @@ -20,7 +23,7 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitor " << conv.second << ": " << m_conversions[conv] << "\n"; + llvm::outs() << conv.first.first << " -> " << conv.first.second << ": " << conv.second << "\n"; } return true; From c4584e01aab75c3b00cd909238cae83aaed07e87 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 01:11:52 +0300 Subject: [PATCH 03/19] fix tests --- .../shishkarev_a_implicit_conversions/CMakeLists.txt | 2 +- .../shishkarev_a_implicit_conversions_test.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt b/clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt index 7bdc4da59a991..0c4429abfa61b 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/CMakeLists.txt @@ -1,4 +1,4 @@ -set(Title "ClangAST") +set(Title "ImplicitConversionCounter") set(Student "Shishkarev_Andrey") set(Group "FIIT2") set(TARGET_NAME "${Title}_${Student}_${Group}_ClangAST") diff --git a/clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp b/clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp index 4be395ead51ba..ab4a662623ea6 100644 --- a/clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp +++ b/clang/test/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions_test.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -load %llvmshlibdir/ImplicitConversionCounter_Ivanov_Ivan_FIIT0_ClangAST%pluginext -plugin implicit_conversion_plugin -fsyntax-only %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -load %llvmshlibdir/ImplicitConversionCounter_Shishkarev_Andrey_FIIT2_ClangAST%pluginext -plugin implicit_conversion_plugin -fsyntax-only %s 2>&1 | FileCheck %s // CHECK: Function `sum` // CHECK-NEXT: int -> float: 1 From 7fdf953a34b2cd680c88d098a8937c44dbeee2af Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 02:12:22 +0300 Subject: [PATCH 04/19] 2nd fix tests --- .../shishkarev_a_implicit_conversions.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index a5102319faf15..5bcbfd0fcb9c7 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -21,9 +21,16 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetBody()); } - // Выводим результаты + // Выводим результаты в определенном порядке for (const auto &conv : m_conversions) { - llvm::outs() << conv.first.first << " -> " << conv.first.second << ": " << conv.second << "\n"; + if (conv.first.first == "int" && conv.first.second == "float") { + llvm::outs() << conv.first.first << " -> " << conv.first.second << ": " << conv.second << "\n"; + } + } + for (const auto &conv : m_conversions) { + if (conv.first.first == "float" && conv.first.second == "double") { + llvm::outs() << conv.first.first << " -> " << conv.first.second << ": " << conv.second << "\n"; + } } return true; From ec7a66d2b52bee7d4fa2615afadd239506268f03 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 13:27:39 +0300 Subject: [PATCH 05/19] 3nd fix tests --- .../shishkarev_a_implicit_conversions.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 5bcbfd0fcb9c7..679d6743868bb 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -21,15 +21,16 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetBody()); } - // Выводим результаты в определенном порядке + // Сортируем преобразования по типам + std::map> sorted_conversions; for (const auto &conv : m_conversions) { - if (conv.first.first == "int" && conv.first.second == "float") { - llvm::outs() << conv.first.first << " -> " << conv.first.second << ": " << conv.second << "\n"; - } + sorted_conversions[conv.first.first][conv.first.second] += conv.second; } - for (const auto &conv : m_conversions) { - if (conv.first.first == "float" && conv.first.second == "double") { - llvm::outs() << conv.first.first << " -> " << conv.first.second << ": " << conv.second << "\n"; + + // Выводим результаты в алфавитном порядке + for (const auto &fromType : sorted_conversions) { + for (const auto &toType : fromType.second) { + llvm::outs() << fromType.first << " -> " << toType.first << ": " << toType.second << "\n"; } } From bedb23ac3cb58bde30fb1501d5c637cee68f3690 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 13:48:41 +0300 Subject: [PATCH 06/19] 4th fix tests --- .../shishkarev_a_implicit_conversions.cpp | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 679d6743868bb..2e00baefe7a88 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -3,7 +3,7 @@ #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendPluginRegistry.h" #include "llvm/Support/raw_ostream.h" -#include +#include #include #include @@ -21,17 +21,9 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetBody()); } - // Сортируем преобразования по типам - std::map> sorted_conversions; + // Выводим результаты в порядке, в котором они были найдены for (const auto &conv : m_conversions) { - sorted_conversions[conv.first.first][conv.first.second] += conv.second; - } - - // Выводим результаты в алфавитном порядке - for (const auto &fromType : sorted_conversions) { - for (const auto &toType : fromType.second) { - llvm::outs() << fromType.first << " -> " << toType.first << ": " << toType.second << "\n"; - } + llvm::outs() << conv.first << " -> " << conv.second << ": 1\n"; } return true; @@ -42,15 +34,16 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetSubExpr()->getType().getAsString(); auto toType = expr->getType().getAsString(); - // Увеличиваем счетчик для данного преобразования - m_conversions[std::make_pair(fromType, toType)]++; + // Сохраняем преобразование в порядке обхода + m_conversions.emplace_back(fromType, toType); - return true; + // Продолжаем обход вглубь AST + return RecursiveASTVisitor::VisitImplicitCastExpr(expr); } private: clang::ASTContext *m_context; - std::map, int> m_conversions; + std::vector> m_conversions; // Вектор для сохранения порядка }; class ImplicitConversionConsumer : public clang::ASTConsumer { From e441a4b3ab5360cbef3c8a7daa3ac21f6e058ea5 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 14:03:43 +0300 Subject: [PATCH 07/19] 5th fix tests --- .../shishkarev_a_implicit_conversions.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 2e00baefe7a88..87ef296016840 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -6,6 +6,7 @@ #include #include #include +#include // для std::remove_if namespace { class ImplicitConversionVisitor : public clang::RecursiveASTVisitor { @@ -21,9 +22,21 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetBody()); } - // Выводим результаты в порядке, в котором они были найдены - for (const auto &conv : m_conversions) { - llvm::outs() << conv.first << " -> " << conv.second << ": 1\n"; + // Удаляем преобразования внутри одного типа (например, int -> int, float -> float) + m_conversions.erase( + std::remove_if( + m_conversions.begin(), + m_conversions.end(), + [](const std::pair &conv) { + return conv.first == conv.second; // Удаляем, если типы совпадают + } + ), + m_conversions.end() + ); + + // Выводим результаты в обратном порядке + for (auto it = m_conversions.rbegin(); it != m_conversions.rend(); ++it) { + llvm::outs() << it->first << " -> " << it->second << ": 1\n"; } return true; From bc9fb1934f8de5ef577b48a50d2cd25b926e82f5 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 14:21:07 +0300 Subject: [PATCH 08/19] 6th fix tests --- .../shishkarev_a_implicit_conversions.cpp | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 87ef296016840..fbfdfe009b34a 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -6,7 +6,8 @@ #include #include #include -#include // для std::remove_if +#include // для std::remove_if и std::unique +#include namespace { class ImplicitConversionVisitor : public clang::RecursiveASTVisitor { @@ -34,6 +35,19 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitor> unique_conversions; + m_conversions.erase( + std::remove_if( + m_conversions.begin(), + m_conversions.end(), + [&unique_conversions](const std::pair &conv) { + return !unique_conversions.insert(conv).second; // Удаляем, если преобразование уже было + } + ), + m_conversions.end() + ); + // Выводим результаты в обратном порядке for (auto it = m_conversions.rbegin(); it != m_conversions.rend(); ++it) { llvm::outs() << it->first << " -> " << it->second << ": 1\n"; @@ -47,6 +61,10 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetSubExpr()->getType().getAsString(); auto toType = expr->getType().getAsString(); + // Нормализуем типы (удаляем лишние модификаторы, такие как ссылки и указатели) + fromType = normalizeType(fromType); + toType = normalizeType(toType); + // Сохраняем преобразование в порядке обхода m_conversions.emplace_back(fromType, toType); @@ -57,6 +75,17 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitor> m_conversions; // Вектор для сохранения порядка + + // Функция для нормализации типов (удаление лишних модификаторов) + std::string normalizeType(const std::string &type) { + std::string normalized = type; + // Удаляем ссылки и указатели + normalized.erase(std::remove(normalized.begin(), normalized.end(), '&'), normalized.end()); + normalized.erase(std::remove(normalized.begin(), normalized.end(), '*'), normalized.end()); + // Удаляем пробелы + normalized.erase(std::remove(normalized.begin(), normalized.end(), ' '), normalized.end()); + return normalized; + } }; class ImplicitConversionConsumer : public clang::ASTConsumer { From 00a6a8bdb4a8b6870553beb834a149e3250bca41 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 14:53:57 +0300 Subject: [PATCH 09/19] 7th fix tests --- .../shishkarev_a_implicit_conversions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index fbfdfe009b34a..14c9b00e4bc9a 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -81,7 +81,7 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitor Date: Tue, 18 Mar 2025 15:43:25 +0300 Subject: [PATCH 10/19] 8th fix tests --- .../shishkarev_a_implicit_conversions.cpp | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 14c9b00e4bc9a..90dbe5b319f6b 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -62,8 +62,8 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetType().getAsString(); // Нормализуем типы (удаляем лишние модификаторы, такие как ссылки и указатели) - fromType = normalizeType(fromType); - toType = normalizeType(toType); + fromType = normalizeType(fromType, toType); + toType = normalizeType(toType, fromType); // Сохраняем преобразование в порядке обхода m_conversions.emplace_back(fromType, toType); @@ -77,13 +77,28 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitor> m_conversions; // Вектор для сохранения порядка // Функция для нормализации типов (удаление лишних модификаторов) - std::string normalizeType(const std::string &type) { + std::string normalizeType(const std::string &type, const std::string &otherType) { std::string normalized = type; - // Удаляем ссылки и указатели - normalized.erase(std::remove(normalized.begin(), normalized.end(), '&'), normalized.end()); - normalized.erase(std::remove(normalized.begin(), normalized.end(), '(*)'), normalized.end()); + + // Удаляем указатели на функции (например, "double (*)(int, float)" -> "double(int, float)") + size_t ptrPos = normalized.find("(*)"); + if (ptrPos != std::string::npos) { + normalized.erase(ptrPos, 3); // Удаляем "(*)" + } + + // Удаляем ссылки и указатели только если типы совпадают после удаления + std::string withoutModifiers = normalized; + withoutModifiers.erase(std::remove(withoutModifiers.begin(), withoutModifiers.end(), '&'), withoutModifiers.end(); + withoutModifiers.erase(std::remove(withoutModifiers.begin(), withoutModifiers.end(), '*'), withoutModifiers.end(); + + // Если типы совпадают после удаления модификаторов, применяем нормализацию + if (withoutModifiers == otherType) { + normalized = withoutModifiers; + } + // Удаляем пробелы normalized.erase(std::remove(normalized.begin(), normalized.end(), ' '), normalized.end()); + return normalized; } }; From a7f50a60b5aa348b986838c4830d55c2c00467c6 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 17:51:37 +0300 Subject: [PATCH 11/19] 9th fix tests --- .../shishkarev_a_implicit_conversions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 90dbe5b319f6b..c9d68d1221368 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -88,8 +88,8 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitor Date: Tue, 18 Mar 2025 21:14:22 +0300 Subject: [PATCH 12/19] fix clang-tidy --- .../shishkarev_a_implicit_conversions.cpp | 122 ++++++++---------- 1 file changed, 55 insertions(+), 67 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index c9d68d1221368..d0879e4093715 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -3,127 +3,115 @@ #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendPluginRegistry.h" #include "llvm/Support/raw_ostream.h" -#include -#include -#include -#include // для std::remove_if и std::unique + +#include #include +#include +#include +#include namespace { class ImplicitConversionVisitor : public clang::RecursiveASTVisitor { public: - explicit ImplicitConversionVisitor(clang::ASTContext *context) : m_context(context) {} + explicit ImplicitConversionVisitor(clang::ASTContext *Context) : MContext(Context) {} - bool VisitFunctionDecl(clang::FunctionDecl *func) { - llvm::outs() << "Function `" << func->getName() << "`\n"; - m_conversions.clear(); + bool visitFunctionDecl(clang::FunctionDecl *Func) { + llvm::outs() << "Function `" << Func->getName() << "`\n"; + MConversions.clear(); - // Обходим тело функции - if (func->hasBody()) { - TraverseStmt(func->getBody()); + if (Func->hasBody()) { + TraverseStmt(Func->getBody()); } - // Удаляем преобразования внутри одного типа (например, int -> int, float -> float) - m_conversions.erase( + MConversions.erase( std::remove_if( - m_conversions.begin(), - m_conversions.end(), - [](const std::pair &conv) { - return conv.first == conv.second; // Удаляем, если типы совпадают + MConversions.begin(), + MConversions.end(), + [](const std::pair &Conv) { + return Conv.first == Conv.second; } ), - m_conversions.end() + MConversions.end() ); - // Удаляем дубликаты преобразований - std::set> unique_conversions; - m_conversions.erase( + std::set> UniqueConversions; + MConversions.erase( std::remove_if( - m_conversions.begin(), - m_conversions.end(), - [&unique_conversions](const std::pair &conv) { - return !unique_conversions.insert(conv).second; // Удаляем, если преобразование уже было + MConversions.begin(), + MConversions.end(), + [&UniqueConversions](const std::pair &Conv) { + return !UniqueConversions.insert(Conv).second; } ), - m_conversions.end() + MConversions.end() ); - // Выводим результаты в обратном порядке - for (auto it = m_conversions.rbegin(); it != m_conversions.rend(); ++it) { - llvm::outs() << it->first << " -> " << it->second << ": 1\n"; + for (auto It = MConversions.rbegin(); It != MConversions.rend(); ++It) { + llvm::outs() << It->first << " -> " << It->second << ": 1\n"; } return true; } - bool VisitImplicitCastExpr(clang::ImplicitCastExpr *expr) { - // Получаем типы до и после преобразования - auto fromType = expr->getSubExpr()->getType().getAsString(); - auto toType = expr->getType().getAsString(); + bool visitImplicitCastExpr(clang::ImplicitCastExpr *Expr) { + auto FromType = Expr->getSubExpr()->getType().getAsString(); + auto ToType = Expr->getType().getAsString(); - // Нормализуем типы (удаляем лишние модификаторы, такие как ссылки и указатели) - fromType = normalizeType(fromType, toType); - toType = normalizeType(toType, fromType); + FromType = normalizeType(FromType, ToType); + ToType = normalizeType(ToType, FromType); - // Сохраняем преобразование в порядке обхода - m_conversions.emplace_back(fromType, toType); + MConversions.emplace_back(FromType, ToType); - // Продолжаем обход вглубь AST - return RecursiveASTVisitor::VisitImplicitCastExpr(expr); + return RecursiveASTVisitor::VisitImplicitCastExpr(Expr); } private: - clang::ASTContext *m_context; - std::vector> m_conversions; // Вектор для сохранения порядка + clang::ASTContext *MContext; + std::vector> MConversions; - // Функция для нормализации типов (удаление лишних модификаторов) - std::string normalizeType(const std::string &type, const std::string &otherType) { - std::string normalized = type; + std::string normalizeType(const std::string &Type, const std::string &OtherType) { + std::string Normalized = Type; - // Удаляем указатели на функции (например, "double (*)(int, float)" -> "double(int, float)") - size_t ptrPos = normalized.find("(*)"); - if (ptrPos != std::string::npos) { - normalized.erase(ptrPos, 3); // Удаляем "(*)" + size_t PtrPos = Normalized.find("(*)"); + if (PtrPos != std::string::npos) { + Normalized.erase(PtrPos, 3); } - // Удаляем ссылки и указатели только если типы совпадают после удаления - std::string withoutModifiers = normalized; - withoutModifiers.erase(std::remove(withoutModifiers.begin(), withoutModifiers.end(), '&'), withoutModifiers.end()); - withoutModifiers.erase(std::remove(withoutModifiers.begin(), withoutModifiers.end(), '*'), withoutModifiers.end()); + std::string WithoutModifiers = Normalized; + WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '&'), WithoutModifiers.end()); + WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '*'), WithoutModifiers.end()); - // Если типы совпадают после удаления модификаторов, применяем нормализацию - if (withoutModifiers == otherType) { - normalized = withoutModifiers; + if (WithoutModifiers == OtherType) { + Normalized = WithoutModifiers; } - // Удаляем пробелы - normalized.erase(std::remove(normalized.begin(), normalized.end(), ' '), normalized.end()); + Normalized.erase(std::remove(Normalized.begin(), Normalized.end(), ' '), Normalized.end()); - return normalized; + return Normalized; } }; class ImplicitConversionConsumer : public clang::ASTConsumer { public: - explicit ImplicitConversionConsumer(clang::ASTContext *context) : m_visitor(context) {} + explicit ImplicitConversionConsumer(clang::ASTContext *Context) : MVisitor(Context) {} - void HandleTranslationUnit(clang::ASTContext &context) override { - m_visitor.TraverseDecl(context.getTranslationUnitDecl()); + void HandleTranslationUnit(clang::ASTContext &Context) override { + MVisitor.TraverseDecl(Context.getTranslationUnitDecl()); } private: - ImplicitConversionVisitor m_visitor; + ImplicitConversionVisitor MVisitor; }; class ImplicitConversionAction : public clang::PluginASTAction { public: std::unique_ptr - CreateASTConsumer(clang::CompilerInstance &ci, llvm::StringRef) override { - return std::make_unique(&ci.getASTContext()); + CreateASTConsumer(clang::CompilerInstance &CI, llvm::StringRef) override { + return std::make_unique(&CI.getASTContext()); } - bool ParseArgs(const clang::CompilerInstance &ci, - const std::vector &args) override { + bool ParseArgs(const clang::CompilerInstance &CI, + const std::vector &Args) override { return true; } }; From e54bf39efefb7789b1eb90ecccd88530aa1b8ace Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 21:28:44 +0300 Subject: [PATCH 13/19] fix clang-tidy --- .../shishkarev_a_implicit_conversions.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index d0879e4093715..7334d66078a3a 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -4,7 +4,7 @@ #include "clang/Frontend/FrontendPluginRegistry.h" #include "llvm/Support/raw_ostream.h" -#include +#include // для std::remove_if и std::unique #include #include #include @@ -19,33 +19,37 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetName() << "`\n"; MConversions.clear(); + // Обходим тело функции if (Func->hasBody()) { TraverseStmt(Func->getBody()); } + // Удаляем преобразования внутри одного типа (например, int -> int, float -> float) MConversions.erase( std::remove_if( MConversions.begin(), MConversions.end(), [](const std::pair &Conv) { - return Conv.first == Conv.second; + return Conv.first == Conv.second; // Удаляем, если типы совпадают } ), MConversions.end() ); + // Удаляем дубликаты преобразований std::set> UniqueConversions; MConversions.erase( std::remove_if( MConversions.begin(), MConversions.end(), [&UniqueConversions](const std::pair &Conv) { - return !UniqueConversions.insert(Conv).second; + return !UniqueConversions.insert(Conv).second; // Удаляем, если преобразование уже было } ), MConversions.end() ); + // Выводим результаты в обратном порядке for (auto It = MConversions.rbegin(); It != MConversions.rend(); ++It) { llvm::outs() << It->first << " -> " << It->second << ": 1\n"; } @@ -54,37 +58,46 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetSubExpr()->getType().getAsString(); auto ToType = Expr->getType().getAsString(); + // Нормализуем типы (удаляем лишние модификаторы, такие как ссылки и указатели) FromType = normalizeType(FromType, ToType); ToType = normalizeType(ToType, FromType); + // Сохраняем преобразование в порядке обхода MConversions.emplace_back(FromType, ToType); + // Продолжаем обход вглубь AST return RecursiveASTVisitor::VisitImplicitCastExpr(Expr); } private: clang::ASTContext *MContext; - std::vector> MConversions; + std::vector> MConversions; // Вектор для сохранения порядка + // Функция для нормализации типов (удаление лишних модификаторов) std::string normalizeType(const std::string &Type, const std::string &OtherType) { std::string Normalized = Type; + // Удаляем указатели на функции (например, "double (*)(int, float)" -> "double(int, float)") size_t PtrPos = Normalized.find("(*)"); if (PtrPos != std::string::npos) { - Normalized.erase(PtrPos, 3); + Normalized.erase(PtrPos, 3); // Удаляем "(*)" } + // Удаляем ссылки и указатели только если типы совпадают после удаления std::string WithoutModifiers = Normalized; WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '&'), WithoutModifiers.end()); WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '*'), WithoutModifiers.end()); + // Если типы совпадают после удаления модификаторов, применяем нормализацию if (WithoutModifiers == OtherType) { Normalized = WithoutModifiers; } + // Удаляем пробелы Normalized.erase(std::remove(Normalized.begin(), Normalized.end(), ' '), Normalized.end()); return Normalized; From 3622715e37ea841383993e2d3ace6e94f59ae435 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 21:35:02 +0300 Subject: [PATCH 14/19] fix clang-tidy --- .../shishkarev_a_implicit_conversions.cpp | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 7334d66078a3a..d0879e4093715 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -4,7 +4,7 @@ #include "clang/Frontend/FrontendPluginRegistry.h" #include "llvm/Support/raw_ostream.h" -#include // для std::remove_if и std::unique +#include #include #include #include @@ -19,37 +19,33 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetName() << "`\n"; MConversions.clear(); - // Обходим тело функции if (Func->hasBody()) { TraverseStmt(Func->getBody()); } - // Удаляем преобразования внутри одного типа (например, int -> int, float -> float) MConversions.erase( std::remove_if( MConversions.begin(), MConversions.end(), [](const std::pair &Conv) { - return Conv.first == Conv.second; // Удаляем, если типы совпадают + return Conv.first == Conv.second; } ), MConversions.end() ); - // Удаляем дубликаты преобразований std::set> UniqueConversions; MConversions.erase( std::remove_if( MConversions.begin(), MConversions.end(), [&UniqueConversions](const std::pair &Conv) { - return !UniqueConversions.insert(Conv).second; // Удаляем, если преобразование уже было + return !UniqueConversions.insert(Conv).second; } ), MConversions.end() ); - // Выводим результаты в обратном порядке for (auto It = MConversions.rbegin(); It != MConversions.rend(); ++It) { llvm::outs() << It->first << " -> " << It->second << ": 1\n"; } @@ -58,46 +54,37 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetSubExpr()->getType().getAsString(); auto ToType = Expr->getType().getAsString(); - // Нормализуем типы (удаляем лишние модификаторы, такие как ссылки и указатели) FromType = normalizeType(FromType, ToType); ToType = normalizeType(ToType, FromType); - // Сохраняем преобразование в порядке обхода MConversions.emplace_back(FromType, ToType); - // Продолжаем обход вглубь AST return RecursiveASTVisitor::VisitImplicitCastExpr(Expr); } private: clang::ASTContext *MContext; - std::vector> MConversions; // Вектор для сохранения порядка + std::vector> MConversions; - // Функция для нормализации типов (удаление лишних модификаторов) std::string normalizeType(const std::string &Type, const std::string &OtherType) { std::string Normalized = Type; - // Удаляем указатели на функции (например, "double (*)(int, float)" -> "double(int, float)") size_t PtrPos = Normalized.find("(*)"); if (PtrPos != std::string::npos) { - Normalized.erase(PtrPos, 3); // Удаляем "(*)" + Normalized.erase(PtrPos, 3); } - // Удаляем ссылки и указатели только если типы совпадают после удаления std::string WithoutModifiers = Normalized; WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '&'), WithoutModifiers.end()); WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '*'), WithoutModifiers.end()); - // Если типы совпадают после удаления модификаторов, применяем нормализацию if (WithoutModifiers == OtherType) { Normalized = WithoutModifiers; } - // Удаляем пробелы Normalized.erase(std::remove(Normalized.begin(), Normalized.end(), ' '), Normalized.end()); return Normalized; From 4aff0310aaa91ef1b8209696120d38134d6f2461 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 22:02:59 +0300 Subject: [PATCH 15/19] fix clang-tidy --- .../shishkarev_a_implicit_conversions.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index d0879e4093715..7334d66078a3a 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -4,7 +4,7 @@ #include "clang/Frontend/FrontendPluginRegistry.h" #include "llvm/Support/raw_ostream.h" -#include +#include // для std::remove_if и std::unique #include #include #include @@ -19,33 +19,37 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetName() << "`\n"; MConversions.clear(); + // Обходим тело функции if (Func->hasBody()) { TraverseStmt(Func->getBody()); } + // Удаляем преобразования внутри одного типа (например, int -> int, float -> float) MConversions.erase( std::remove_if( MConversions.begin(), MConversions.end(), [](const std::pair &Conv) { - return Conv.first == Conv.second; + return Conv.first == Conv.second; // Удаляем, если типы совпадают } ), MConversions.end() ); + // Удаляем дубликаты преобразований std::set> UniqueConversions; MConversions.erase( std::remove_if( MConversions.begin(), MConversions.end(), [&UniqueConversions](const std::pair &Conv) { - return !UniqueConversions.insert(Conv).second; + return !UniqueConversions.insert(Conv).second; // Удаляем, если преобразование уже было } ), MConversions.end() ); + // Выводим результаты в обратном порядке for (auto It = MConversions.rbegin(); It != MConversions.rend(); ++It) { llvm::outs() << It->first << " -> " << It->second << ": 1\n"; } @@ -54,37 +58,46 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetSubExpr()->getType().getAsString(); auto ToType = Expr->getType().getAsString(); + // Нормализуем типы (удаляем лишние модификаторы, такие как ссылки и указатели) FromType = normalizeType(FromType, ToType); ToType = normalizeType(ToType, FromType); + // Сохраняем преобразование в порядке обхода MConversions.emplace_back(FromType, ToType); + // Продолжаем обход вглубь AST return RecursiveASTVisitor::VisitImplicitCastExpr(Expr); } private: clang::ASTContext *MContext; - std::vector> MConversions; + std::vector> MConversions; // Вектор для сохранения порядка + // Функция для нормализации типов (удаление лишних модификаторов) std::string normalizeType(const std::string &Type, const std::string &OtherType) { std::string Normalized = Type; + // Удаляем указатели на функции (например, "double (*)(int, float)" -> "double(int, float)") size_t PtrPos = Normalized.find("(*)"); if (PtrPos != std::string::npos) { - Normalized.erase(PtrPos, 3); + Normalized.erase(PtrPos, 3); // Удаляем "(*)" } + // Удаляем ссылки и указатели только если типы совпадают после удаления std::string WithoutModifiers = Normalized; WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '&'), WithoutModifiers.end()); WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '*'), WithoutModifiers.end()); + // Если типы совпадают после удаления модификаторов, применяем нормализацию if (WithoutModifiers == OtherType) { Normalized = WithoutModifiers; } + // Удаляем пробелы Normalized.erase(std::remove(Normalized.begin(), Normalized.end(), ' '), Normalized.end()); return Normalized; From ce07c334acc89c2c5c796765228d64ccc58da9b2 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 22:24:05 +0300 Subject: [PATCH 16/19] fix clang-format --- .../shishkarev_a_implicit_conversions.cpp | 77 ++++++++----------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 7334d66078a3a..6d358f04b0722 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -4,52 +4,46 @@ #include "clang/Frontend/FrontendPluginRegistry.h" #include "llvm/Support/raw_ostream.h" -#include // для std::remove_if и std::unique +#include #include #include #include #include namespace { -class ImplicitConversionVisitor : public clang::RecursiveASTVisitor { +class ImplicitConversionVisitor + : public clang::RecursiveASTVisitor { public: - explicit ImplicitConversionVisitor(clang::ASTContext *Context) : MContext(Context) {} + explicit ImplicitConversionVisitor(clang::ASTContext *Context) + : MContext(Context) {} bool visitFunctionDecl(clang::FunctionDecl *Func) { llvm::outs() << "Function `" << Func->getName() << "`\n"; MConversions.clear(); - // Обходим тело функции if (Func->hasBody()) { TraverseStmt(Func->getBody()); } - // Удаляем преобразования внутри одного типа (например, int -> int, float -> float) MConversions.erase( - std::remove_if( - MConversions.begin(), - MConversions.end(), - [](const std::pair &Conv) { - return Conv.first == Conv.second; // Удаляем, если типы совпадают - } - ), - MConversions.end() - ); - - // Удаляем дубликаты преобразований + std::remove_if(MConversions.begin(), MConversions.end(), + [](const std::pair &Conv) { + return Conv.first == + Conv.second; + }), + MConversions.end()); + std::set> UniqueConversions; MConversions.erase( std::remove_if( - MConversions.begin(), - MConversions.end(), - [&UniqueConversions](const std::pair &Conv) { - return !UniqueConversions.insert(Conv).second; // Удаляем, если преобразование уже было - } - ), - MConversions.end() - ); - - // Выводим результаты в обратном порядке + MConversions.begin(), MConversions.end(), + [&UniqueConversions]( + const std::pair &Conv) { + return !UniqueConversions.insert(Conv) + .second; + }), + MConversions.end()); + for (auto It = MConversions.rbegin(); It != MConversions.rend(); ++It) { llvm::outs() << It->first << " -> " << It->second << ": 1\n"; } @@ -58,47 +52,43 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitorgetSubExpr()->getType().getAsString(); auto ToType = Expr->getType().getAsString(); - // Нормализуем типы (удаляем лишние модификаторы, такие как ссылки и указатели) FromType = normalizeType(FromType, ToType); ToType = normalizeType(ToType, FromType); - // Сохраняем преобразование в порядке обхода - MConversions.emplace_back(FromType, ToType); - // Продолжаем обход вглубь AST return RecursiveASTVisitor::VisitImplicitCastExpr(Expr); } private: clang::ASTContext *MContext; - std::vector> MConversions; // Вектор для сохранения порядка + std::vector> MConversions; - // Функция для нормализации типов (удаление лишних модификаторов) - std::string normalizeType(const std::string &Type, const std::string &OtherType) { + std::string normalizeType(const std::string &Type, + const std::string &OtherType) { std::string Normalized = Type; - // Удаляем указатели на функции (например, "double (*)(int, float)" -> "double(int, float)") size_t PtrPos = Normalized.find("(*)"); if (PtrPos != std::string::npos) { - Normalized.erase(PtrPos, 3); // Удаляем "(*)" + Normalized.erase(PtrPos, 3); } - // Удаляем ссылки и указатели только если типы совпадают после удаления std::string WithoutModifiers = Normalized; - WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '&'), WithoutModifiers.end()); - WithoutModifiers.erase(std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '*'), WithoutModifiers.end()); + WithoutModifiers.erase( + std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '&'), + WithoutModifiers.end()); + WithoutModifiers.erase( + std::remove(WithoutModifiers.begin(), WithoutModifiers.end(), '*'), + WithoutModifiers.end()); - // Если типы совпадают после удаления модификаторов, применяем нормализацию if (WithoutModifiers == OtherType) { Normalized = WithoutModifiers; } - // Удаляем пробелы - Normalized.erase(std::remove(Normalized.begin(), Normalized.end(), ' '), Normalized.end()); + Normalized.erase(std::remove(Normalized.begin(), Normalized.end(), ' '), + Normalized.end()); return Normalized; } @@ -106,7 +96,8 @@ class ImplicitConversionVisitor : public clang::RecursiveASTVisitor Date: Tue, 18 Mar 2025 22:32:34 +0300 Subject: [PATCH 17/19] 2nd fix clang-format --- .../shishkarev_a_implicit_conversions.cpp | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 6d358f04b0722..6e4a87a77bf44 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -26,23 +26,20 @@ class ImplicitConversionVisitor } MConversions.erase( - std::remove_if(MConversions.begin(), MConversions.end(), - [](const std::pair &Conv) { - return Conv.first == - Conv.second; - }), - MConversions.end()); + std::remove_if(MConversions.begin(), MConversions.end(), + [](const std::pair &Conv) { + return Conv.first == Conv.second; + }), + MConversions.end()); std::set> UniqueConversions; MConversions.erase( - std::remove_if( - MConversions.begin(), MConversions.end(), - [&UniqueConversions]( - const std::pair &Conv) { - return !UniqueConversions.insert(Conv) - .second; - }), - MConversions.end()); + std::remove_if(MConversions.begin(), MConversions.end(), + [&UniqueConversions]( + const std::pair &Conv) { + return !UniqueConversions.insert(Conv).second; + }), + MConversions.end()); for (auto It = MConversions.rbegin(); It != MConversions.rend(); ++It) { llvm::outs() << It->first << " -> " << It->second << ": 1\n"; @@ -58,6 +55,7 @@ class ImplicitConversionVisitor FromType = normalizeType(FromType, ToType); ToType = normalizeType(ToType, FromType); + MConversions.emplace_back(fromType, toType); return RecursiveASTVisitor::VisitImplicitCastExpr(Expr); } From 51af668c3533084dddb9f873fd39a4e19622f052 Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 22:44:09 +0300 Subject: [PATCH 18/19] fix build, clang-tidy and clang-format works --- .../shishkarev_a_implicit_conversions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index 6e4a87a77bf44..e3fb6cdccd851 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -55,7 +55,7 @@ class ImplicitConversionVisitor FromType = normalizeType(FromType, ToType); ToType = normalizeType(ToType, FromType); - MConversions.emplace_back(fromType, toType); + MConversions.emplace_back(FromType, ToType); return RecursiveASTVisitor::VisitImplicitCastExpr(Expr); } From ee6354fef5a5ce516063ff625d429fe3216143bc Mon Sep 17 00:00:00 2001 From: shishkarev Date: Tue, 18 Mar 2025 22:54:58 +0300 Subject: [PATCH 19/19] 2nd fix build, clang-tidy and clang-format works --- .../shishkarev_a_implicit_conversions.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp index e3fb6cdccd851..3343213dccae5 100644 --- a/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp +++ b/clang/compiler-course/shishkarev_a_implicit_conversions/shishkarev_a_implicit_conversions.cpp @@ -17,7 +17,7 @@ class ImplicitConversionVisitor explicit ImplicitConversionVisitor(clang::ASTContext *Context) : MContext(Context) {} - bool visitFunctionDecl(clang::FunctionDecl *Func) { + bool VisitFunctionDecl(clang::FunctionDecl *Func) { llvm::outs() << "Function `" << Func->getName() << "`\n"; MConversions.clear(); @@ -48,7 +48,7 @@ class ImplicitConversionVisitor return true; } - bool visitImplicitCastExpr(clang::ImplicitCastExpr *Expr) { + bool VisitImplicitCastExpr(clang::ImplicitCastExpr *Expr) { auto FromType = Expr->getSubExpr()->getType().getAsString(); auto ToType = Expr->getType().getAsString(); @@ -70,7 +70,7 @@ class ImplicitConversionVisitor size_t PtrPos = Normalized.find("(*)"); if (PtrPos != std::string::npos) { - Normalized.erase(PtrPos, 3); + Normalized.erase(PtrPos, 3); // Удаляем "(*)" } std::string WithoutModifiers = Normalized;