ykfre created this revision.
ykfre added a reviewer: clang-tools-extra.
ykfre added a project: clang-tools-extra.
Herald added subscribers: cfe-commits, arphaman.
Herald added a project: clang.

add  ConfigurationsFilesToImport option - to make it possible to import another 
configurations files from .clang-tidy, So there will be no need
to duplicate anymore the configuration file among projects, and it will be 
possible to just point the configuration file to some config in a share.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D72940

Files:
  clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
  clang-tools-extra/clang-tidy/ClangTidyOptions.h
  clang-tools-extra/docs/clang-tidy/index.rst


Index: clang-tools-extra/docs/clang-tidy/index.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/index.rst
+++ clang-tools-extra/docs/clang-tidy/index.rst
@@ -242,7 +242,9 @@
   Configuration files:
     clang-tidy attempts to read configuration for each source file from a
     .clang-tidy file located in the closest parent directory of the source
-    file. If any configuration options have a corresponding command-line
+    file. This file can also imports configuration from another configuration 
file,
+    using ConfigurationsFilesToImport option.
+    If any configuration options have a corresponding command-line
     option, command-line option takes precedence. The effective
     configuration can be inspected using -dump-config:
 
@@ -251,6 +253,7 @@
       Checks:          '-*,some-check'
       WarningsAsErrors: ''
       HeaderFilterRegex: ''
+      ConfigurationsFilesToImport: ['yaml1FilePath', 'yaml2FilePath']
       FormatStyle:     none
       User:            user
       CheckOptions:
Index: clang-tools-extra/clang-tidy/ClangTidyOptions.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyOptions.h
+++ clang-tools-extra/clang-tidy/ClangTidyOptions.h
@@ -73,6 +73,9 @@
   /// Output warnings from system headers matching \c HeaderFilterRegex.
   llvm::Optional<bool> SystemHeaders;
 
+  /// Clang tidy configurations files to import.
+  llvm::Optional<std::vector<std::string>> ConfigurationsFilesToImport;
+
   /// Format code around applied fixes with clang-format using this
   /// style.
   ///
Index: clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
+++ clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
@@ -92,6 +92,7 @@
     IO.mapOptional("CheckOptions", NOpts->Options);
     IO.mapOptional("ExtraArgs", Options.ExtraArgs);
     IO.mapOptional("ExtraArgsBefore", Options.ExtraArgsBefore);
+    IO.mapOptional("ConfigurationsFilesToImport", 
Options.ConfigurationsFilesToImport);
   }
 };
 
@@ -325,12 +326,34 @@
 }
 
 llvm::ErrorOr<ClangTidyOptions> parseConfiguration(StringRef Config) {
-  llvm::yaml::Input Input(Config);
-  ClangTidyOptions Options;
-  Input >> Options;
-  if (Input.error())
-    return Input.error();
-  return Options;
+       ClangTidyOptions Options;
+       llvm::yaml::Input Input(Config);
+
+       Input >> Options;
+       if (Input.error())
+               return Input.error();
+       if (!Options.ConfigurationsFilesToImport.hasValue()) {
+               return Options;
+       }
+       for (const auto& file : *Options.ConfigurationsFilesToImport)
+       {
+               llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text = 
llvm::MemoryBuffer::getFile(file);
+        if (std::error_code EC = Text.getError()) {
+            llvm::errs() << "Can't read " << file << ": " << EC.message()
+                << "\n";
+            return EC;
+        }
+               Config = Text->get()->getBuffer();
+               auto ReturnedOptions = parseConfiguration(Config);
+               if (ReturnedOptions)
+               {
+                       Options = ReturnedOptions->mergeWith(Options);
+               }
+               else {
+                       return ReturnedOptions;
+               }
+       }
+       return Options;
 }
 
 std::string configurationAsText(const ClangTidyOptions &Options) {


Index: clang-tools-extra/docs/clang-tidy/index.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/index.rst
+++ clang-tools-extra/docs/clang-tidy/index.rst
@@ -242,7 +242,9 @@
   Configuration files:
     clang-tidy attempts to read configuration for each source file from a
     .clang-tidy file located in the closest parent directory of the source
-    file. If any configuration options have a corresponding command-line
+    file. This file can also imports configuration from another configuration file,
+    using ConfigurationsFilesToImport option.
+    If any configuration options have a corresponding command-line
     option, command-line option takes precedence. The effective
     configuration can be inspected using -dump-config:
 
@@ -251,6 +253,7 @@
       Checks:          '-*,some-check'
       WarningsAsErrors: ''
       HeaderFilterRegex: ''
+      ConfigurationsFilesToImport: ['yaml1FilePath', 'yaml2FilePath']
       FormatStyle:     none
       User:            user
       CheckOptions:
Index: clang-tools-extra/clang-tidy/ClangTidyOptions.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyOptions.h
+++ clang-tools-extra/clang-tidy/ClangTidyOptions.h
@@ -73,6 +73,9 @@
   /// Output warnings from system headers matching \c HeaderFilterRegex.
   llvm::Optional<bool> SystemHeaders;
 
+  /// Clang tidy configurations files to import.
+  llvm::Optional<std::vector<std::string>> ConfigurationsFilesToImport;
+
   /// Format code around applied fixes with clang-format using this
   /// style.
   ///
Index: clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
+++ clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
@@ -92,6 +92,7 @@
     IO.mapOptional("CheckOptions", NOpts->Options);
     IO.mapOptional("ExtraArgs", Options.ExtraArgs);
     IO.mapOptional("ExtraArgsBefore", Options.ExtraArgsBefore);
+    IO.mapOptional("ConfigurationsFilesToImport", Options.ConfigurationsFilesToImport);
   }
 };
 
@@ -325,12 +326,34 @@
 }
 
 llvm::ErrorOr<ClangTidyOptions> parseConfiguration(StringRef Config) {
-  llvm::yaml::Input Input(Config);
-  ClangTidyOptions Options;
-  Input >> Options;
-  if (Input.error())
-    return Input.error();
-  return Options;
+	ClangTidyOptions Options;
+	llvm::yaml::Input Input(Config);
+
+	Input >> Options;
+	if (Input.error())
+		return Input.error();
+	if (!Options.ConfigurationsFilesToImport.hasValue()) {
+		return Options;
+	}
+	for (const auto& file : *Options.ConfigurationsFilesToImport)
+	{
+		llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text = llvm::MemoryBuffer::getFile(file);
+        if (std::error_code EC = Text.getError()) {
+            llvm::errs() << "Can't read " << file << ": " << EC.message()
+                << "\n";
+            return EC;
+        }
+		Config = Text->get()->getBuffer();
+		auto ReturnedOptions = parseConfiguration(Config);
+		if (ReturnedOptions)
+		{
+			Options = ReturnedOptions->mergeWith(Options);
+		}
+		else {
+			return ReturnedOptions;
+		}
+	}
+	return Options;
 }
 
 std::string configurationAsText(const ClangTidyOptions &Options) {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D72940: Add a su... ido via Phabricator via cfe-commits

Reply via email to