//===--- CodeComplete.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 // //===----------------------------------------------------------------------===// // // Code completion provides suggestions for what the user might type next. // After "std::string S; S." we might suggest members of std::string. // Signature help describes the parameters of a function as you type them. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_CODECOMPLETE_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_CODECOMPLETE_H #include "ASTSignals.h" #include "Compiler.h" #include "Protocol.h" #include "Quality.h" #include "index/Index.h" #include "index/Symbol.h" #include "index/SymbolOrigin.h" #include "support/Markup.h" #include "support/Path.h" #include "clang/Sema/CodeCompleteConsumer.h" #include "clang/Sema/CodeCompleteOptions.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include <functional> #include <future> #include <optional> #include <utility> namespace clang { class NamedDecl; namespace clangd { struct PreambleData; struct CodeCompletion; struct CodeCompleteOptions { … }; // Semi-structured representation of a code-complete suggestion for our C++ API. // We don't use the LSP structures here (unlike most features) as we want // to expose more data to allow for more precise testing and evaluation. struct CodeCompletion { … }; raw_ostream &operator<<(raw_ostream &, const CodeCompletion &); struct CodeCompleteResult { … }; raw_ostream &operator<<(raw_ostream &, const CodeCompleteResult &); /// A speculative and asynchronous fuzzy find index request (based on cached /// request) that can be sent before parsing sema. This would reduce completion /// latency if the speculation succeeds. struct SpeculativeFuzzyFind { … }; /// Gets code completions at a specified \p Pos in \p FileName. /// /// If \p Preamble is nullptr, this runs code completion without compiling the /// code. /// /// If \p SpecFuzzyFind is set, a speculative and asynchronous fuzzy find index /// request (based on cached request) will be run before parsing sema. In case /// the speculative result is used by code completion (e.g. speculation failed), /// the speculative result is not consumed, and `SpecFuzzyFind` is only /// destroyed when the async request finishes. CodeCompleteResult codeComplete(PathRef FileName, Position Pos, const PreambleData *Preamble, const ParseInputs &ParseInput, CodeCompleteOptions Opts, SpeculativeFuzzyFind *SpecFuzzyFind = nullptr); /// Get signature help at a specified \p Pos in \p FileName. SignatureHelp signatureHelp(PathRef FileName, Position Pos, const PreambleData &Preamble, const ParseInputs &ParseInput, MarkupKind DocumentationFormat); // For index-based completion, we only consider: // * symbols in namespaces or translation unit scopes (e.g. no class // members, no locals) // * enum constants (both scoped and unscoped) // * primary templates (no specializations) // For the other cases, we let Clang do the completion because it does not // need any non-local information and it will be much better at following // lookup rules. Other symbols still appear in the index for other purposes, // like workspace/symbols or textDocument/definition, but are not used for code // completion. bool isIndexedForCodeCompletion(const NamedDecl &ND, ASTContext &ASTCtx); // Text immediately before the completion point that should be completed. // This is heuristically derived from the source code, and is used when: // - semantic analysis fails // - semantic analysis may be slow, and we speculatively query the index struct CompletionPrefix { … }; // Heuristically parses before Offset to determine what should be completed. CompletionPrefix guessCompletionPrefix(llvm::StringRef Content, unsigned Offset); // Whether it makes sense to complete at the point based on typed characters. // For instance, we implicitly trigger at `a->^` but not at `a>^`. bool allowImplicitCompletion(llvm::StringRef Content, unsigned Offset); } // namespace clangd } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_CODECOMPLETE_H