diff options
Diffstat (limited to 'lldb/source/Plugins/ExpressionParser/Clang/CppModuleConfiguration.h')
| -rw-r--r-- | lldb/source/Plugins/ExpressionParser/Clang/CppModuleConfiguration.h | 84 | 
1 files changed, 84 insertions, 0 deletions
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/CppModuleConfiguration.h b/lldb/source/Plugins/ExpressionParser/Clang/CppModuleConfiguration.h new file mode 100644 index 000000000000..8e892e37d0de --- /dev/null +++ b/lldb/source/Plugins/ExpressionParser/Clang/CppModuleConfiguration.h @@ -0,0 +1,84 @@ +//===-- CppModuleConfiguration.h --------------------------------*- C++ -*-===// +// +// 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 liblldb_CppModuleConfiguration_h_ +#define liblldb_CppModuleConfiguration_h_ + +#include <lldb/Core/FileSpecList.h> +#include <llvm/Support/Regex.h> + +namespace lldb_private { + +/// A Clang configuration when importing C++ modules. +/// +/// Includes a list of include paths that should be used when importing +/// and a list of modules that can be imported. Currently only used when +/// importing the 'std' module and its dependencies. +class CppModuleConfiguration { +  /// Utility class for a path that can only be set once. +  class SetOncePath { +    std::string m_path; +    bool m_valid = false; +    /// True iff this path hasn't been set yet. +    bool m_first = true; + +  public: +    /// Try setting the path. Returns true if the path was set and false if +    /// the path was already set. +    LLVM_NODISCARD bool TrySet(llvm::StringRef path); +    /// Return the path if there is one. +    std::string Get() const { +      assert(m_valid && "Called Get() on an invalid SetOncePath?"); +      return m_path; +    } +    /// Returns true iff this path was set exactly once so far. +    bool Valid() const { return m_valid; } +  }; + +  /// If valid, the include path used for the std module. +  SetOncePath m_std_inc; +  /// If valid, the include path to the C library (e.g. /usr/include). +  SetOncePath m_c_inc; +  /// The Clang resource include path for this configuration. +  std::string m_resource_inc; + +  std::vector<std::string> m_include_dirs; +  std::vector<std::string> m_imported_modules; + +  /// Analyze a given source file to build the current configuration. +  /// Returns false iff there was a fatal error that makes analyzing any +  /// further files pointless as the configuration is now invalid. +  bool analyzeFile(const FileSpec &f); + +public: +  /// Creates a configuraiton by analyzing the given list of used source files. +  /// +  /// Currently only looks at the used paths and doesn't actually access the +  /// files on the disk. +  explicit CppModuleConfiguration(const FileSpecList &support_files); +  /// Creates an empty and invalid configuration. +  CppModuleConfiguration() {} + +  /// Returns true iff this is a valid configuration that can be used to +  /// load and compile modules. +  bool hasValidConfig(); + +  /// Returns a list of include directories that should be used when using this +  /// configuration (e.g. {"/usr/include", "/usr/include/c++/v1"}). +  llvm::ArrayRef<std::string> GetIncludeDirs() const { return m_include_dirs; } + +  /// Returns a list of (top level) modules that should be imported when using +  /// this configuration (e.g. {"std"}). +  llvm::ArrayRef<std::string> GetImportedModules() const { +    return m_imported_modules; +  } +}; + +} // namespace lldb_private + +#endif  | 
