diff options
Diffstat (limited to 'Source/cmListFileCache.h')
| -rw-r--r-- | Source/cmListFileCache.h | 74 | 
1 files changed, 37 insertions, 37 deletions
diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h index 5d45027..0553989 100644 --- a/Source/cmListFileCache.h +++ b/Source/cmListFileCache.h @@ -12,6 +12,7 @@  #include <cm/optional> +#include "cmConstStack.h"  #include "cmSystemTools.h"  /** \class cmListFileCache @@ -51,9 +52,9 @@ struct cmListFileArgument  class cmListFileFunction  {  public: -  cmListFileFunction(std::string name, long line, +  cmListFileFunction(std::string name, long line, long lineEnd,                       std::vector<cmListFileArgument> args) -    : Impl{ std::make_shared<Implementation>(std::move(name), line, +    : Impl{ std::make_shared<Implementation>(std::move(name), line, lineEnd,                                               std::move(args)) }    {    } @@ -69,6 +70,7 @@ public:    }    long Line() const noexcept { return this->Impl->Line; } +  long LineEnd() const noexcept { return this->Impl->LineEnd; }    std::vector<cmListFileArgument> const& Arguments() const noexcept    { @@ -78,11 +80,12 @@ public:  private:    struct Implementation    { -    Implementation(std::string name, long line, +    Implementation(std::string name, long line, long lineEnd,                     std::vector<cmListFileArgument> args)        : OriginalName{ std::move(name) }        , LowerCaseName{ cmSystemTools::LowerCase(this->OriginalName) }        , Line{ line } +      , LineEnd{ lineEnd }        , Arguments{ std::move(args) }      {      } @@ -90,6 +93,7 @@ private:      std::string OriginalName;      std::string LowerCaseName;      long Line = 0; +    long LineEnd = 0;      std::vector<cmListFileArgument> Arguments;    }; @@ -106,16 +110,22 @@ public:    cm::optional<std::string> DeferId;    cmListFileContext() = default; -  cmListFileContext(cmListFileContext&& /*other*/) = default; +  // This move constructor is marked `noexcept` yet `clang-tidy` 14 reports it +  // as being able to throw an exception. Suppress the warning as there doesn't +  // seem to be any way for this to happen given the member types. +  // NOLINTNEXTLINE(bugprone-exception-escape) +  cmListFileContext(cmListFileContext&& /*other*/) noexcept = default;    cmListFileContext(const cmListFileContext& /*other*/) = default;    cmListFileContext& operator=(const cmListFileContext& /*other*/) = default;  #if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) -  cmListFileContext& operator=(cmListFileContext&& /*other*/) = default; +  cmListFileContext& operator=(cmListFileContext&& /*other*/) noexcept = +    default;  #else    // The move assignment operators for several STL classes did not become    // noexcept until C++17, which causes some tools to warn about this move    // assignment operator throwing an exception when it shouldn't. -  cmListFileContext& operator=(cmListFileContext&& /*other*/) = delete; +  cmListFileContext& operator=(cmListFileContext&& /*other*/) noexcept = +    delete;  #endif    cmListFileContext(std::string name, std::string filePath, long line) @@ -125,6 +135,17 @@ public:    {    } +  static cmListFileContext FromListFilePath(std::string const& filePath) +  { +    // We are entering a file-level scope but have not yet reached +    // any specific line or command invocation within it.  This context +    // is useful to print when it is at the top but otherwise can be +    // skipped during call stack printing. +    cmListFileContext lfc; +    lfc.FilePath = filePath; +    return lfc; +  } +    static cmListFileContext FromListFileFunction(      cmListFileFunction const& lff, std::string const& fileName,      cm::optional<std::string> deferId = {}) @@ -143,38 +164,16 @@ bool operator<(const cmListFileContext& lhs, const cmListFileContext& rhs);  bool operator==(cmListFileContext const& lhs, cmListFileContext const& rhs);  bool operator!=(cmListFileContext const& lhs, cmListFileContext const& rhs); -// Represent a backtrace (call stack).  Provide value semantics -// but use efficient reference-counting underneath to avoid copies. +// Represent a backtrace (call stack) with efficient value semantics.  class cmListFileBacktrace +  : public cmConstStack<cmListFileContext, cmListFileBacktrace>  { -public: -  // Default-constructed backtrace is empty. -  cmListFileBacktrace() = default; - -  // Get a backtrace with the given file scope added to the top. -  cmListFileBacktrace Push(std::string const& file) const; - -  // Get a backtrace with the given call context added to the top. -  cmListFileBacktrace Push(cmListFileContext const& lfc) const; - -  // Get a backtrace with the top level removed. -  // May not be called until after a matching Push. -  cmListFileBacktrace Pop() const; - -  // Get the context at the top of the backtrace. -  // This may be called only if Empty() would return false. -  cmListFileContext const& Top() const; - -  // Return true if this backtrace is empty. -  bool Empty() const; - -private: -  struct Entry; -  std::shared_ptr<Entry const> TopEntry; -  cmListFileBacktrace(std::shared_ptr<Entry const> parent, -                      cmListFileContext const& lfc); -  cmListFileBacktrace(std::shared_ptr<Entry const> top); +  using cmConstStack::cmConstStack; +  friend class cmConstStack<cmListFileContext, cmListFileBacktrace>;  }; +#ifndef cmListFileCache_cxx +extern template class cmConstStack<cmListFileContext, cmListFileBacktrace>; +#endif  // Wrap type T as a value with a backtrace.  For purposes of  // ordering and equality comparison, only the original value is @@ -230,9 +229,10 @@ public:    friend bool operator==(T const& l, BTs<T> const& r) { return l == r.Value; }  }; -std::vector<BT<std::string>> ExpandListWithBacktrace( +std::vector<BT<std::string>> cmExpandListWithBacktrace(    std::string const& list, -  cmListFileBacktrace const& bt = cmListFileBacktrace()); +  cmListFileBacktrace const& bt = cmListFileBacktrace(), +  bool emptyArgs = false);  struct cmListFile  {  | 
