[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
//===--- Hover.h - Information about code at the cursor location -*- 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_CLANGD_HOVER_H
|
|
|
|
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_HOVER_H
|
|
|
|
|
|
|
|
#include "ParsedAST.h"
|
|
|
|
#include "Protocol.h"
|
2020-05-02 20:53:47 +08:00
|
|
|
#include "support/Markup.h"
|
2019-12-03 02:34:03 +08:00
|
|
|
#include "clang/Index/IndexSymbol.h"
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace clangd {
|
|
|
|
|
|
|
|
/// Contains detailed information about a Symbol. Especially useful when
|
|
|
|
/// generating hover responses. It can be rendered as a hover panel, or
|
|
|
|
/// embedding clients can use the structured information to provide their own
|
|
|
|
/// UI.
|
|
|
|
struct HoverInfo {
|
|
|
|
/// Represents parameters of a function, a template or a macro.
|
|
|
|
/// For example:
|
|
|
|
/// - void foo(ParamType Name = DefaultValue)
|
|
|
|
/// - #define FOO(Name)
|
|
|
|
/// - template <ParamType Name = DefaultType> class Foo {};
|
|
|
|
struct Param {
|
|
|
|
/// The pretty-printed parameter type, e.g. "int", or "typename" (in
|
[clangd] Store index::SymbolKind in HoverInfo
Summary:
LSP's SymbolKind has some shortcomings when it comes to C++ types,
index::SymbolKind has more detailed info like Destructor, Parameter, MACRO etc.
We are planning to make use of that information in our new Hover response, and
it would be nice to display the Symbol type in full detail, rather than some
approximation.
Reviewers: sammccall
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70723
2019-11-27 01:06:17 +08:00
|
|
|
/// TemplateParameters), might be None for macro parameters.
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
llvm::Optional<std::string> Type;
|
|
|
|
/// None for unnamed parameters.
|
|
|
|
llvm::Optional<std::string> Name;
|
|
|
|
/// None if no default is provided.
|
|
|
|
llvm::Optional<std::string> Default;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// For a variable named Bar, declared in clang::clangd::Foo::getFoo the
|
|
|
|
/// following fields will hold:
|
|
|
|
/// - NamespaceScope: clang::clangd::
|
|
|
|
/// - LocalScope: Foo::getFoo::
|
|
|
|
/// - Name: Bar
|
|
|
|
|
|
|
|
/// Scopes might be None in cases where they don't make sense, e.g. macros and
|
|
|
|
/// auto/decltype.
|
|
|
|
/// Contains all of the enclosing namespaces, empty string means global
|
|
|
|
/// namespace.
|
|
|
|
llvm::Optional<std::string> NamespaceScope;
|
|
|
|
/// Remaining named contexts in symbol's qualified name, empty string means
|
|
|
|
/// symbol is not local.
|
|
|
|
std::string LocalScope;
|
|
|
|
/// Name of the symbol, does not contain any "::".
|
|
|
|
std::string Name;
|
|
|
|
llvm::Optional<Range> SymRange;
|
2019-12-03 02:34:03 +08:00
|
|
|
index::SymbolKind Kind = index::SymbolKind::Unknown;
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
std::string Documentation;
|
|
|
|
/// Source code containing the definition of the symbol.
|
|
|
|
std::string Definition;
|
|
|
|
|
2020-05-28 00:17:07 +08:00
|
|
|
/// Access specifier for declarations inside class/struct/unions, empty for
|
|
|
|
/// others.
|
|
|
|
std::string AccessSpecifier;
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
/// Pretty-printed variable type.
|
|
|
|
/// Set only for variables.
|
|
|
|
llvm::Optional<std::string> Type;
|
2020-04-05 14:28:11 +08:00
|
|
|
/// Set for functions and lambdas.
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
llvm::Optional<std::string> ReturnType;
|
|
|
|
/// Set for functions, lambdas and macros with parameters.
|
|
|
|
llvm::Optional<std::vector<Param>> Parameters;
|
|
|
|
/// Set for all templates(function, class, variable).
|
|
|
|
llvm::Optional<std::vector<Param>> TemplateParameters;
|
|
|
|
/// Contains the evaluated value of the symbol if available.
|
|
|
|
llvm::Optional<std::string> Value;
|
2020-04-03 09:07:10 +08:00
|
|
|
/// Contains the byte-size of fields and types where it's interesting.
|
|
|
|
llvm::Optional<uint64_t> Size;
|
|
|
|
/// Contains the offset of fields within the enclosing class.
|
|
|
|
llvm::Optional<uint64_t> Offset;
|
[clangd] Improve hover on arguments to function call
Summary:
In cases like:
foo(a, ^b);
We now additionally show the name and type of the parameter to foo that
corresponds that "b" is passed as.
The name should help with understanding what it's used for and type can
be useful to find out if call to foo() can mutate variable "b" or not
(i.e. if it is pass by value, reference, const reference, etc).
Patch By: adamcz@ !
Reviewers: kadircet
Reviewed By: kadircet
Subscribers: nridge, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D81169
2020-07-03 17:20:22 +08:00
|
|
|
// Set when symbol is inside function call. Contains information extracted
|
|
|
|
// from the callee definition about the argument this is passed as.
|
|
|
|
llvm::Optional<Param> CalleeArgInfo;
|
|
|
|
struct PassType {
|
|
|
|
// How the variable is passed to callee.
|
|
|
|
enum PassMode { Ref, ConstRef, Value };
|
|
|
|
PassMode PassBy = Ref;
|
|
|
|
// True if type conversion happened. This includes calls to implicit
|
|
|
|
// constructor, as well as built-in type conversions. Casting to base class
|
|
|
|
// is not considered conversion.
|
|
|
|
bool Converted = false;
|
|
|
|
};
|
|
|
|
// Set only if CalleeArgInfo is set.
|
|
|
|
llvm::Optional<PassType> CallPassType;
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
|
|
|
|
/// Produce a user-readable information.
|
2019-12-10 17:28:37 +08:00
|
|
|
markup::Document present() const;
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
};
|
2020-03-24 19:30:51 +08:00
|
|
|
|
[clangd] Improve hover on arguments to function call
Summary:
In cases like:
foo(a, ^b);
We now additionally show the name and type of the parameter to foo that
corresponds that "b" is passed as.
The name should help with understanding what it's used for and type can
be useful to find out if call to foo() can mutate variable "b" or not
(i.e. if it is pass by value, reference, const reference, etc).
Patch By: adamcz@ !
Reviewers: kadircet
Reviewed By: kadircet
Subscribers: nridge, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D81169
2020-07-03 17:20:22 +08:00
|
|
|
inline bool operator==(const HoverInfo::PassType &LHS,
|
|
|
|
const HoverInfo::PassType &RHS) {
|
|
|
|
return std::tie(LHS.PassBy, LHS.Converted) ==
|
|
|
|
std::tie(RHS.PassBy, RHS.Converted);
|
|
|
|
}
|
|
|
|
|
2020-03-24 19:30:51 +08:00
|
|
|
// Try to infer structure of a documentation comment (e.g. line breaks).
|
2020-04-30 16:49:32 +08:00
|
|
|
// FIXME: move to another file so CodeComplete doesn't depend on Hover.
|
2020-03-24 19:30:51 +08:00
|
|
|
void parseDocumentation(llvm::StringRef Input, markup::Document &Output);
|
|
|
|
|
[clangd] Untangle Hover from XRefs, move into own file.
Summary:
This is mostly mechanical, with a few exceptions:
- getDeducedType moved into AST.h where it belongs. It now takes
ASTContext instead of ParsedAST, and avoids using the preprocessor.
- hover now uses SelectionTree directly rather than via
getDeclAtPosition helper
- hover on 'auto' used to find the decl that contained the 'auto' and
use that to set Kind and documentation for the hover result.
Now we use targetDecl() to find the decl matching the deduced type instead.
This changes tests, e.g. 'variable' -> class for auto on lambdas.
I think this is better, but the motivation was to avoid depending on
the internals of DeducedTypeVisitor. This functionality is removed
from the visitor.
Reviewers: kadircet
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D70357
2019-11-17 00:00:19 +08:00
|
|
|
llvm::raw_ostream &operator<<(llvm::raw_ostream &, const HoverInfo::Param &);
|
|
|
|
inline bool operator==(const HoverInfo::Param &LHS,
|
|
|
|
const HoverInfo::Param &RHS) {
|
|
|
|
return std::tie(LHS.Type, LHS.Name, LHS.Default) ==
|
|
|
|
std::tie(RHS.Type, RHS.Name, RHS.Default);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get the hover information when hovering at \p Pos.
|
|
|
|
llvm::Optional<HoverInfo> getHover(ParsedAST &AST, Position Pos,
|
|
|
|
format::FormatStyle Style,
|
|
|
|
const SymbolIndex *Index);
|
|
|
|
|
|
|
|
} // namespace clangd
|
|
|
|
} // namespace clang
|
|
|
|
|
|
|
|
#endif
|