//===-- CommandCompletions.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 LLDB_INTERPRETER_COMMANDCOMPLETIONS_H
#define LLDB_INTERPRETER_COMMANDCOMPLETIONS_H

#include <set>

#include "lldb/Core/FileSpecList.h"
#include "lldb/Core/SearchFilter.h"
#include "lldb/Utility/CompletionRequest.h"
#include "lldb/Utility/RegularExpression.h"
#include "lldb/lldb-private.h"

#include "llvm/ADT/Twine.h"

namespace lldb_private {
class TildeExpressionResolver;
class CommandCompletions {
public:
  enum CommonCompletionTypes {
    eNoCompletion = 0u,
    eSourceFileCompletion = (1u << 0),
    eDiskFileCompletion = (1u << 1),
    eDiskDirectoryCompletion = (1u << 2),
    eSymbolCompletion = (1u << 3),
    eModuleCompletion = (1u << 4),
    eSettingsNameCompletion = (1u << 5),
    ePlatformPluginCompletion = (1u << 6),
    eArchitectureCompletion = (1u << 7),
    eVariablePathCompletion = (1u << 8),
    eRegisterCompletion = (1u << 9),
    eBreakpointCompletion = (1u << 10),
    eProcessPluginCompletion = (1u << 11),
    eDisassemblyFlavorCompletion = (1u << 12),
    eTypeLanguageCompletion = (1u << 13),
    eFrameIndexCompletion = (1u << 14),
    eModuleUUIDCompletion = (1u << 15),
    eStopHookIDCompletion = (1u << 16),
    eThreadIndexCompletion = (1u << 17),
    eWatchPointIDCompletion = (1u << 18),
    eBreakpointNameCompletion = (1u << 19),
    eProcessIDCompletion = (1u << 20),
    eProcessNameCompletion = (1u << 21),
    eRemoteDiskFileCompletion = (1u << 22),
    eRemoteDiskDirectoryCompletion = (1u << 23),
    eTypeCategoryNameCompletion = (1u << 24),
    // This item serves two purposes.  It is the last element in the enum, so
    // you can add custom enums starting from here in your Option class. Also
    // if you & in this bit the base code will not process the option.
    eCustomCompletion = (1u << 24)
  };

  static bool InvokeCommonCompletionCallbacks(
      CommandInterpreter &interpreter, uint32_t completion_mask,
      lldb_private::CompletionRequest &request, SearchFilter *searcher);

  // These are the generic completer functions:
  static void DiskFiles(CommandInterpreter &interpreter,
                        CompletionRequest &request, SearchFilter *searcher);

  static void DiskFiles(const llvm::Twine &partial_file_name,
                        StringList &matches, TildeExpressionResolver &Resolver);

  static void DiskDirectories(CommandInterpreter &interpreter,
                              CompletionRequest &request,
                              SearchFilter *searcher);

  static void DiskDirectories(const llvm::Twine &partial_file_name,
                              StringList &matches,
                              TildeExpressionResolver &Resolver);

  static void RemoteDiskFiles(CommandInterpreter &interpreter,
                              CompletionRequest &request,
                              SearchFilter *searcher);

  static void RemoteDiskDirectories(CommandInterpreter &interpreter,
                                    CompletionRequest &request,
                                    SearchFilter *searcher);

  static void SourceFiles(CommandInterpreter &interpreter,
                          CompletionRequest &request, SearchFilter *searcher);

  static void Modules(CommandInterpreter &interpreter,
                      CompletionRequest &request, SearchFilter *searcher);

  static void ModuleUUIDs(CommandInterpreter &interpreter,
                          CompletionRequest &request, SearchFilter *searcher);

  static void Symbols(CommandInterpreter &interpreter,
                      CompletionRequest &request, SearchFilter *searcher);

  static void SettingsNames(CommandInterpreter &interpreter,
                            CompletionRequest &request, SearchFilter *searcher);

  static void PlatformPluginNames(CommandInterpreter &interpreter,
                                  CompletionRequest &request,
                                  SearchFilter *searcher);

  static void ArchitectureNames(CommandInterpreter &interpreter,
                                CompletionRequest &request,
                                SearchFilter *searcher);

  static void VariablePath(CommandInterpreter &interpreter,
                           CompletionRequest &request, SearchFilter *searcher);

  static void Registers(CommandInterpreter &interpreter,
                        CompletionRequest &request, SearchFilter *searcher);

  static void Breakpoints(CommandInterpreter &interpreter,
                          CompletionRequest &request, SearchFilter *searcher);

  static void BreakpointNames(CommandInterpreter &interpreter,
                              CompletionRequest &request,
                              SearchFilter *searcher);

  static void ProcessPluginNames(CommandInterpreter &interpreter,
                                 CompletionRequest &request,
                                 SearchFilter *searcher);

  static void ProcessIDs(CommandInterpreter &interpreter,
                         CompletionRequest &request, SearchFilter *searcher);

  static void ProcessNames(CommandInterpreter &interpreter,
                           CompletionRequest &request, SearchFilter *searcher);

  static void DisassemblyFlavors(CommandInterpreter &interpreter,
                                 CompletionRequest &request,
                                 SearchFilter *searcher);

  static void TypeLanguages(CommandInterpreter &interpreter,
                            CompletionRequest &request, SearchFilter *searcher);

  static void FrameIndexes(CommandInterpreter &interpreter,
                           CompletionRequest &request, SearchFilter *searcher);

  static void StopHookIDs(CommandInterpreter &interpreter,
                          CompletionRequest &request, SearchFilter *searcher);

  static void ThreadIndexes(CommandInterpreter &interpreter,
                            CompletionRequest &request, SearchFilter *searcher);

  static void WatchPointIDs(CommandInterpreter &interpreter,
                            CompletionRequest &request, SearchFilter *searcher);

  static void TypeCategoryNames(CommandInterpreter &interpreter,
                                CompletionRequest &request,
                                SearchFilter *searcher);
};

} // namespace lldb_private

#endif // LLDB_INTERPRETER_COMMANDCOMPLETIONS_H
