llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-tools-extra

Author: None (4m4n-x-B4w4ne)

<details>
<summary>Changes</summary>

This Pull Request is to fix issue #<!-- -->24841.
I am also cherry-pick commit a3c7fca28faee679a59afd58c2e814025771ff63.
@<!-- -->LegalizeAdulthood @<!-- -->PiotrZSL 

---
Full diff: https://github.com/llvm/llvm-project/pull/124319.diff


7 Files Affected:

- (modified) clang-tools-extra/clang-tidy/modernize/CMakeLists.txt (+1) 
- (modified) clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp 
(+3) 
- (added) clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.cpp 
(+126) 
- (added) clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.h 
(+40) 
- (modified) clang-tools-extra/docs/ReleaseNotes.rst (+5) 
- (added) 
clang-tools-extra/docs/clang-tidy/checks/modernize/use-cpp-style-comments.rst 
(+38) 
- (added) 
clang-tools-extra/test/clang-tidy/checkers/modernize/use-cpp-style-comments.cpp 
(+68) 


``````````diff
diff --git a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt 
b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
index bab1167fb15ff2..f07dd5efecc58e 100644
--- a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
@@ -31,6 +31,7 @@ add_clang_library(clangTidyModernizeModule STATIC
   UseAutoCheck.cpp
   UseBoolLiteralsCheck.cpp
   UseConstraintsCheck.cpp
+  UseCppStyleCommentsCheck.cpp
   UseDefaultMemberInitCheck.cpp
   UseDesignatedInitializersCheck.cpp
   UseEmplaceCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp 
b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
index fc46c72982fdce..1917d562f7ce8d 100644
--- a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
@@ -32,6 +32,7 @@
 #include "UseAutoCheck.h"
 #include "UseBoolLiteralsCheck.h"
 #include "UseConstraintsCheck.h"
+#include "UseCppStyleCommentsCheck.h"
 #include "UseDefaultMemberInitCheck.h"
 #include "UseDesignatedInitializersCheck.h"
 #include "UseEmplaceCheck.h"
@@ -107,6 +108,8 @@ class ModernizeModule : public ClangTidyModule {
         "modernize-use-bool-literals");
     CheckFactories.registerCheck<UseConstraintsCheck>(
         "modernize-use-constraints");
+    CheckFactories.registerCheck<UseCppStyleCommentsCheck>(
+        "modernize-use-cpp-style-comments");
     CheckFactories.registerCheck<UseDefaultMemberInitCheck>(
         "modernize-use-default-member-init");
     CheckFactories.registerCheck<UseEmplaceCheck>("modernize-use-emplace");
diff --git 
a/clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.cpp 
b/clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.cpp
new file mode 100644
index 00000000000000..3c25c50bab759c
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.cpp
@@ -0,0 +1,126 @@
+//===--- UseCppStyleCommentsCheck.cpp - 
clang-tidy-------------------------===//
+
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "UseCppStyleCommentsCheck.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Lex/Preprocessor.h"
+#include <iostream>
+using namespace clang::ast_matchers;
+
+namespace clang::tidy::modernize {
+class UseCppStyleCommentsCheck::CStyleCommentHandler : public CommentHandler {
+public:
+  CStyleCommentHandler(UseCppStyleCommentsCheck &Check)
+      : Check(Check),
+        CStyleCommentMatch(
+                          "^[ \t]*/\\*+[ \t\r\n]*(.*[ \t\r\n]*)*[ 
\t\r\n]*\\*+/[ \t\r\n]*$"){}
+
+  std::string convertToCppStyleComment(const SourceManager &SM, const 
SourceRange &Range) {
+    StringRef CommentText = Lexer::getSourceText(
+        CharSourceRange::getTokenRange(Range), SM, LangOptions());
+
+    std::string InnerText = CommentText.str();
+    InnerText.erase(0, 2);
+    InnerText.erase(InnerText.size() - 2, 2);
+
+    std::string Result;
+    std::istringstream Stream(InnerText);
+    std::string Line;
+
+    if (std::getline(Stream, Line)) {
+      size_t startPos = Line.find_first_not_of(" \t");
+      if (startPos != std::string::npos) {
+          Line = Line.substr(startPos);
+      } else {
+          Line.clear();
+      }
+      Result += "// " + Line;
+    }
+
+    while (std::getline(Stream, Line)) {
+    size_t startPos = Line.find_first_not_of(" \t");
+      if (startPos != std::string::npos) {
+          Line = Line.substr(startPos);
+      } else {
+          Line.clear();
+      }
+      Result += "\n// " + Line;
+    }
+    return Result;
+  }
+
+  bool HandleComment(Preprocessor &PP, SourceRange Range) override {
+    const SourceManager &SM = PP.getSourceManager();
+
+    if (Range.getBegin().isMacroID() ||
+        SM.isInSystemHeader(Range.getBegin())) {
+        return false;
+    }
+
+    const StringRef Text =
+        Lexer::getSourceText(CharSourceRange::getCharRange(Range),
+                             SM, PP.getLangOpts());
+
+    SmallVector<StringRef> Matches;
+    if (!CStyleCommentMatch.match(Text, &Matches)) {
+        return false;
+    }
+
+    SourceLocation CommentStart = Range.getBegin();
+    SourceLocation CommentEnd = Range.getEnd();
+
+    unsigned StartLine = SM.getSpellingLineNumber(CommentStart);
+    unsigned EndLine = SM.getSpellingLineNumber(CommentEnd);
+
+   
+    if (StartLine == EndLine) {
+      SourceLocation LineBegin = SM.translateLineCol(
+          SM.getFileID(CommentStart), StartLine, 1);
+      SourceLocation LineEnd = SM.translateLineCol(SM.getFileID(CommentEnd), 
EndLine, std::numeric_limits<unsigned>::max());
+      StringRef LineContent =
+          Lexer::getSourceText(CharSourceRange::getCharRange(LineBegin, 
LineEnd),
+                              SM, PP.getLangOpts());
+      size_t CommentStartOffset = SM.getSpellingColumnNumber(CommentStart) - 1;
+      StringRef AfterComment = LineContent.drop_front(CommentStartOffset + 
Text.size());
+
+      if (!AfterComment.trim().empty()) {
+          return false;
+      }
+    }
+    
+    Check.diag(
+        Range.getBegin(),
+        "use C++ style comments '//' instead of C style comments '/*...*/'")
+        << clang::FixItHint::CreateReplacement(
+               Range, convertToCppStyleComment(SM, Range));
+
+    return false;
+}
+
+
+private:
+  UseCppStyleCommentsCheck &Check;
+  llvm::Regex CStyleCommentMatch;
+};
+
+UseCppStyleCommentsCheck::UseCppStyleCommentsCheck(StringRef Name,
+                                                   ClangTidyContext *Context)
+    : ClangTidyCheck(Name, Context),
+      Handler(std::make_unique<CStyleCommentHandler>(*this)) {}
+
+void UseCppStyleCommentsCheck::registerPPCallbacks(
+    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) 
{
+  PP->addCommentHandler(Handler.get());
+}
+
+void UseCppStyleCommentsCheck::check(const MatchFinder::MatchResult &Result) {}
+
+UseCppStyleCommentsCheck::~UseCppStyleCommentsCheck() = default;
+} // namespace clang::tidy::modernize
diff --git a/clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.h 
b/clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.h
new file mode 100644
index 00000000000000..3d604683de5a24
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/modernize/UseCppStyleCommentsCheck.h
@@ -0,0 +1,40 @@
+//===--- UseCppStyleCommentsCheck.h - 
clang-tidy---------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef 
LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USE_CPP_STYLE_COMMENTS_CHECK_H
+#define 
LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USE_CPP_STYLE_COMMENTS_CHECK_H
+
+#include "../ClangTidyCheck.h"
+#include <sstream>
+namespace clang::tidy::modernize {
+/// Detects C Style comments and suggests to use C++ style comments instead.
+///
+/// For the user-facing documentation see:
+/// 
http://clang.llvm.org/extra/clang-tidy/checks/modernize/use-cpp-style-comments.html
+class UseCppStyleCommentsCheck : public ClangTidyCheck {
+public:
+  UseCppStyleCommentsCheck(StringRef Name, ClangTidyContext *Context);
+
+  ~UseCppStyleCommentsCheck() override;
+
+  bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
+    return LangOpts.CPlusPlus;
+  }
+
+  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
+                           Preprocessor *ModuleExpanderPP) override;
+
+  void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+
+private:
+  class CStyleCommentHandler;
+  std::unique_ptr<CStyleCommentHandler> Handler;
+};
+} // namespace clang::tidy::modernize
+
+#endif // 
LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USE_CPP_STYLE_COMMENTS_CHECK_H
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index cc5f64a3f9fa32..a89cd1a8b80e50 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -173,6 +173,11 @@ New checks
 
   Replace comparisons between signed and unsigned integers with their safe
   C++20 ``std::cmp_*`` alternative, if available.
+  
+- New :doc:`modernize-use-cpp-style-comments
+  <clang-tidy/checks/modernize/use-cpp-style-comments>` check.
+
+  Detects C Style comments and suggests to use C++ style comments instead.
 
 - New :doc:`portability-template-virtual-member-function
   <clang-tidy/checks/portability/template-virtual-member-function>` check.
diff --git 
a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-cpp-style-comments.rst 
b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-cpp-style-comments.rst
new file mode 100644
index 00000000000000..5eaf759a3db6d6
--- /dev/null
+++ 
b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-cpp-style-comments.rst
@@ -0,0 +1,38 @@
+.. title:: clang-tidy - use-cpp-style-comments
+
+modernize-use-cpp-style-comments
+=======================
+
+Replace C-style comments with C++-style comments.
+C-style comments (`/* ... */`) are inherited from C, while C++ introduces 
+`//` as a more concise, readable, and less error-prone alternative. Modern C++ 
+guidelines recommend using C++-style comments for consistency and 
+maintainability. This check identifies and replaces C-style comments with 
+equivalent C++-style comments.
+
+Examples:
+
+Input:
+.. code-block::c++
+    /* This is a single-line comment */
+    int x = 42;  /* Inline comment */
+
+    /* This is a
+    multi-line comment */
+
+
+Output:
+.. code-block::c++
+    // This is a single-line comment
+    int x = 42;  // Inline comment
+
+    // This is a
+    // multi-line comment
+
+.. note::
+
+    Inline Comments are neither fixed nor warned.
+    Example:
+    .. code-block:: c++
+        int a = /* this is a comment */ 5;
+
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-cpp-style-comments.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-cpp-style-comments.cpp
new file mode 100644
index 00000000000000..f56750591e035f
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-cpp-style-comments.cpp
@@ -0,0 +1,68 @@
+// RUN: %check_clang_tidy -std=c++11 %s modernize-use-cpp-style-comments %t -- 
--
+
+// Single-line full C-style comment
+static const int CONSTANT = 42; /* Important constant value */
+// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+// CHECK-FIXES: static const int CONSTANT = 42; // Important constant value
+
+// Inline comment that should NOT be transformed
+int a = /* inline comment */ 5;
+
+// Multiline full-line comment
+/* This is a multiline comment
+   that spans several lines
+   and should be converted to C++ style */
+// CHECK-MESSAGES: :[[@LINE-3]]:1: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+// CHECK-FIXES: // This is a multiline comment
+// CHECK-FIXES: // that spans several lines
+// CHECK-FIXES: // and should be converted to C++ style
+void fnWithSomeBools(bool A,bool B) {}
+// Function with parameter inline comments
+void processData(int data /* input data */, 
+                 bool validate /* perform validation */) {
+    // These inline comments should NOT be transformed
+    fnWithSomeBools(/*ControlsA=*/ true, /*ControlsB=*/ false);
+}
+
+// Multiline comment with asterisk styling
+/*******************************
+ * Block comment with asterisks
+ * Should be converted to C++ style
+ *******************************/
+// CHECK-MESSAGES: :[[@LINE-4]]:1: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+// CHECK-FIXES: // ******************************
+// CHECK-FIXES: // * Block comment with asterisks
+// CHECK-FIXES: // * Should be converted to C++ style
+// CHECK-FIXES: // ******************************
+int calculateSomething() { return 1;}
+// Comment at end of complex line
+int complexCalculation = calculateSomething(); /* Result of complex 
calculation */
+// CHECK-MESSAGES: :[[@LINE-1]]:48: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+// CHECK-FIXES: int complexCalculation = calculateSomething(); // Result of 
complex calculation
+
+// Nested comments and edge cases
+void edgeCaseFunction() {
+    int x = 10 /* First value */ + 20 /* Second value */;  // Inline comments 
should not transform
+    
+    /* Comment with special characters !@#$%^&*()_+ */
+    // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+    // CHECK-FIXES: // Comment with special characters !@#$%^&*()_+
+}
+
+// Multiline comment with various indentations
+    /* This comment is indented
+       and should preserve indentation when converted */
+// CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+// CHECK-FIXES:     // This comment is indented
+// CHECK-FIXES:     // and should preserve indentation when converted
+
+// Complex function with mixed comment types
+void complexFunction() {
+    /* Full line comment at start of block */
+    // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+    // CHECK-FIXES: // Full line comment at start of block
+    
+    int x = 10; /* Inline comment not to be transformed */
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use C++ style comments '//' 
instead of C style comments '/*...*/' [modernize-use-cpp-style-comments]
+    // CHECK-FIXES: int x = 10; // Inline comment not to be transformed
+}
\ No newline at end of file

``````````

</details>


https://github.com/llvm/llvm-project/pull/124319
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to