//===- CodeCompleteConsumer.h - Code Completion Interface -------*- 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 // //===----------------------------------------------------------------------===// // // This file defines the CodeCompleteConsumer class. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_SEMA_CODECOMPLETECONSUMER_H #define LLVM_CLANG_SEMA_CODECOMPLETECONSUMER_H #include "clang-c/Index.h" #include "clang/AST/Type.h" #include "clang/Basic/LLVM.h" #include "clang/Lex/MacroInfo.h" #include "clang/Sema/CodeCompleteOptions.h" #include "clang/Sema/DeclSpec.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/type_traits.h" #include <cassert> #include <memory> #include <optional> #include <string> #include <utility> namespace clang { class ASTContext; class Decl; class DeclContext; class FunctionDecl; class FunctionTemplateDecl; class IdentifierInfo; class LangOptions; class NamedDecl; class NestedNameSpecifier; class Preprocessor; class RawComment; class Sema; class UsingShadowDecl; /// Default priority values for code-completion results based /// on their kind. enum { … }; /// Priority value deltas that are added to code-completion results /// based on the context of the result. enum { … }; /// Priority value factors by which we will divide or multiply the /// priority of a code-completion result. enum { … }; /// A simplified classification of types used when determining /// "similar" types for code completion. enum SimplifiedTypeClass { … }; /// Determine the simplified type class of the given canonical type. SimplifiedTypeClass getSimplifiedTypeClass(CanQualType T); /// Determine the type that this declaration will have if it is used /// as a type or in an expression. QualType getDeclUsageType(ASTContext &C, const NamedDecl *ND); /// Determine the priority to be given to a macro code completion result /// with the given name. /// /// \param MacroName The name of the macro. /// /// \param LangOpts Options describing the current language dialect. /// /// \param PreferredTypeIsPointer Whether the preferred type for the context /// of this macro is a pointer type. unsigned getMacroUsagePriority(StringRef MacroName, const LangOptions &LangOpts, bool PreferredTypeIsPointer = false); /// Determine the libclang cursor kind associated with the given /// declaration. CXCursorKind getCursorKindForDecl(const Decl *D); /// The context in which code completion occurred, so that the /// code-completion consumer can process the results accordingly. class CodeCompletionContext { … }; /// Get string representation of \p Kind, useful for debugging. llvm::StringRef getCompletionKindString(CodeCompletionContext::Kind Kind); /// A "string" used to describe how code completion can /// be performed for an entity. /// /// A code completion string typically shows how a particular entity can be /// used. For example, the code completion string for a function would show /// the syntax to call it, including the parentheses, placeholders for the /// arguments, etc. class CodeCompletionString { … }; /// An allocator used specifically for the purpose of code completion. class CodeCompletionAllocator : public llvm::BumpPtrAllocator { … }; /// Allocator for a cached set of global code completions. class GlobalCodeCompletionAllocator : public CodeCompletionAllocator { … }; class CodeCompletionTUInfo { … }; } // namespace clang namespace clang { /// A builder class used to construct new code-completion strings. class CodeCompletionBuilder { … }; /// Captures a result of code completion. class CodeCompletionResult { … }; bool operator<(const CodeCompletionResult &X, const CodeCompletionResult &Y); inline bool operator>(const CodeCompletionResult &X, const CodeCompletionResult &Y) { … } inline bool operator<=(const CodeCompletionResult &X, const CodeCompletionResult &Y) { … } inline bool operator>=(const CodeCompletionResult &X, const CodeCompletionResult &Y) { … } /// Abstract interface for a consumer of code-completion /// information. class CodeCompleteConsumer { … }; /// Get the documentation comment used to produce /// CodeCompletionString::BriefComment for RK_Declaration. const RawComment *getCompletionComment(const ASTContext &Ctx, const NamedDecl *Decl); /// Get the documentation comment used to produce /// CodeCompletionString::BriefComment for RK_Pattern. const RawComment *getPatternCompletionComment(const ASTContext &Ctx, const NamedDecl *Decl); /// Get the documentation comment used to produce /// CodeCompletionString::BriefComment for OverloadCandidate. const RawComment * getParameterComment(const ASTContext &Ctx, const CodeCompleteConsumer::OverloadCandidate &Result, unsigned ArgIndex); /// A simple code-completion consumer that prints the results it /// receives in a simple format. class PrintingCodeCompleteConsumer : public CodeCompleteConsumer { … }; } // namespace clang #endif // LLVM_CLANG_SEMA_CODECOMPLETECONSUMER_H