Author: Nathan James Date: 2020-12-23T12:08:29Z New Revision: eb9483b21053656b885f13ccfe41bfa76eb3df45
URL: https://github.com/llvm/llvm-project/commit/eb9483b21053656b885f13ccfe41bfa76eb3df45 DIFF: https://github.com/llvm/llvm-project/commit/eb9483b21053656b885f13ccfe41bfa76eb3df45.diff LOG: [format] Add overload to parseConfiguration that accept llvm::MemoryBufferRef This overload should be used for better diagnostics when parsing configurations. Now a failure to parse will list the filename (or <command-line>) instead of just `YAML`. Reviewed By: MyDeveloperDay Differential Revision: https://reviews.llvm.org/D93633 Added: Modified: clang/include/clang/Format/Format.h clang/lib/Format/Format.cpp clang/test/Format/error-config.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index fd5c0e32c5c2..208fc105d4b6 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -2879,7 +2879,8 @@ struct FormatStyle { private: FormatStyleSet StyleSet; - friend std::error_code parseConfiguration(StringRef Text, FormatStyle *Style, + friend std::error_code parseConfiguration(llvm::MemoryBufferRef Config, + FormatStyle *Style, bool AllowUnknownOptions); }; @@ -2938,9 +2939,17 @@ bool getPredefinedStyle(StringRef Name, FormatStyle::LanguageKind Language, /// /// If AllowUnknownOptions is true, no errors are emitted if unknown /// format options are occured. -std::error_code parseConfiguration(StringRef Text, FormatStyle *Style, +std::error_code parseConfiguration(llvm::MemoryBufferRef Config, + FormatStyle *Style, bool AllowUnknownOptions = false); +/// Like above but accepts an unnamed buffer. +inline std::error_code parseConfiguration(StringRef Config, FormatStyle *Style, + bool AllowUnknownOptions = false) { + return parseConfiguration(llvm::MemoryBufferRef(Config, "YAML"), Style, + AllowUnknownOptions); +} + /// Gets configuration in a YAML string. std::string configurationAsText(const FormatStyle &Style); diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 23eee19b1640..55abc12c61c4 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1327,16 +1327,17 @@ bool getPredefinedStyle(StringRef Name, FormatStyle::LanguageKind Language, return true; } -std::error_code parseConfiguration(StringRef Text, FormatStyle *Style, +std::error_code parseConfiguration(llvm::MemoryBufferRef Config, + FormatStyle *Style, bool AllowUnknownOptions) { assert(Style); FormatStyle::LanguageKind Language = Style->Language; assert(Language != FormatStyle::LK_None); - if (Text.trim().empty()) + if (Config.getBuffer().trim().empty()) return make_error_code(ParseError::Error); Style->StyleSet.Clear(); std::vector<FormatStyle> Styles; - llvm::yaml::Input Input(Text); + llvm::yaml::Input Input(Config); // DocumentListTraits<vector<FormatStyle>> uses the context to get default // values for the fields, keys for which are missing from the configuration. // Mapping also uses the context to get the language to find the correct @@ -2864,8 +2865,9 @@ llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName, if (StyleName.startswith("{")) { // Parse YAML/JSON style from the command line. - if (std::error_code ec = - parseConfiguration(StyleName, &Style, AllowUnknownOptions)) + if (std::error_code ec = parseConfiguration( + llvm::MemoryBufferRef(StyleName, "<command-line>"), &Style, + AllowUnknownOptions)) return make_string_error("Error parsing -style: " + ec.message()); return Style; } @@ -2909,8 +2911,8 @@ llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName, FS->getBufferForFile(ConfigFile.str()); if (std::error_code EC = Text.getError()) return make_string_error(EC.message()); - if (std::error_code ec = parseConfiguration( - Text.get()->getBuffer(), &Style, AllowUnknownOptions)) { + if (std::error_code ec = + parseConfiguration(*Text.get(), &Style, AllowUnknownOptions)) { if (ec == ParseError::Unsuitable) { if (!UnsuitableConfigFiles.empty()) UnsuitableConfigFiles.append(", "); diff --git a/clang/test/Format/error-config.cpp b/clang/test/Format/error-config.cpp index 7fbc869f3a3c..9f73a9eb9507 100644 --- a/clang/test/Format/error-config.cpp +++ b/clang/test/Format/error-config.cpp @@ -1,10 +1,10 @@ // RUN: clang-format %s --Wno-error=unknown --style="{UnknownKey: true}" 2>&1 | FileCheck %s -check-prefix=CHECK // RUN: not clang-format %s --style="{UnknownKey: true}" 2>&1 | FileCheck %s -check-prefix=CHECK-FAIL -// CHECK: YAML:1:2: warning: unknown key 'UnknownKey' +// CHECK: <command-line>:1:2: warning: unknown key 'UnknownKey' // CHECK-NEXT: {UnknownKey: true} // CHECK-NEXT: ^~~~~~~~~~ -// CHECK-FAIL: YAML:1:2: error: unknown key 'UnknownKey' +// CHECK-FAIL: <command-line>:1:2: error: unknown key 'UnknownKey' // CHECK-FAIL-NEXT: {UnknownKey: true} // CHECK-FAIL-NEXT: ^~~~~~~~~~ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits