//===-- IncludeFixerContext.h - Include fixer context -----------*- 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 LLVM_CLANG_TOOLS_EXTRA_INCLUDE_FIXER_INCLUDEFIXERCONTEXT_H
#define LLVM_CLANG_TOOLS_EXTRA_INCLUDE_FIXER_INCLUDEFIXERCONTEXT_H

#include "find-all-symbols/SymbolInfo.h"
#include "clang/Tooling/Core/Replacement.h"
#include <string>
#include <vector>

namespace clang {
namespace include_fixer {

/// A context for a file being processed. It includes all query
/// information, e.g. symbols being queried in database, all header candidates.
class IncludeFixerContext {
public:
  struct HeaderInfo {
    /// The header where QualifiedName comes from.
    std::string Header;
    /// A symbol name with completed namespace qualifiers which will
    /// replace the original symbol.
    std::string QualifiedName;
  };

  struct QuerySymbolInfo {
    /// The raw symbol name being queried in database. This name might
    /// miss some namespace qualifiers, and will be replaced by a fully
    /// qualified one.
    std::string RawIdentifier;

    /// The qualifiers of the scope in which SymbolIdentifier lookup
    /// occurs. It is represented as a sequence of names and scope resolution
    /// operatiors ::, ending with a scope resolution operator (e.g. a::b::).
    /// Empty if SymbolIdentifier is not in a specific scope.
    std::string ScopedQualifiers;

    /// The replacement range of RawIdentifier.
    tooling::Range Range;
  };

  IncludeFixerContext() = default;
  IncludeFixerContext(StringRef FilePath,
                      std::vector<QuerySymbolInfo> QuerySymbols,
                      std::vector<find_all_symbols::SymbolInfo> Symbols);

  /// Get symbol name.
  llvm::StringRef getSymbolIdentifier() const {
    return QuerySymbolInfos.front().RawIdentifier;
  }

  /// Get replacement range of the symbol.
  tooling::Range getSymbolRange() const {
    return QuerySymbolInfos.front().Range;
  }

  /// Get the file path to the file being processed.
  StringRef getFilePath() const { return FilePath; }

  /// Get header information.
  const std::vector<HeaderInfo> &getHeaderInfos() const { return HeaderInfos; }

  /// Get information of symbols being querid.
  const std::vector<QuerySymbolInfo> &getQuerySymbolInfos() const {
    return QuerySymbolInfos;
  }

private:
  friend struct llvm::yaml::MappingTraits<IncludeFixerContext>;

  /// The file path to the file being processed.
  std::string FilePath;

  /// All instances of an unidentified symbol being queried.
  std::vector<QuerySymbolInfo> QuerySymbolInfos;

  /// The symbol candidates which match SymbolIdentifier. The symbols are
  /// sorted in a descending order based on the popularity info in SymbolInfo.
  std::vector<find_all_symbols::SymbolInfo> MatchedSymbols;

  /// The header information.
  std::vector<HeaderInfo> HeaderInfos;
};

} // namespace include_fixer
} // namespace clang

#endif // LLVM_CLANG_TOOLS_EXTRA_INCLUDE_FIXER_INCLUDEFIXERCONTEXT_H
