[PATCH] D65433: [clangd] DefineInline action availability checks
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 18 03:30:19 PDT 2019
hokein added inline comments.
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:65
+const FunctionDecl *getSelectedFunction(const SelectionTree::Node *SelNode) {
+ const ast_type_traits::DynTypedNode &AstNode = SelNode->ASTNode;
+ if (const FunctionDecl *FD = AstNode.get<FunctionDecl>())
----------------
nit: maybe use `auto`?
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:78
+// function decl. Skips local symbols.
+llvm::DenseSet<const Decl *> getNonLocalDeclRefs(const FunctionDecl *FD,
+ ParsedAST &AST) {
----------------
thinking this a bit more, the function is non-trivial, we probably want unit test for it.
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:105
+ Opts.SystemSymbolFilter =
+ index::IndexingOptions::SystemSymbolFilterKind::None;
+
----------------
IIUC, I believe this function relies on the flag "Opts.IndexFunctionLocals"? could we spell it explicitly in the code even its default value `false` fits our use case.
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:113
+// Checks the decls mentioned in Source are visible in the context of Target.
+// Achives that by performing lookups in Target's DeclContext.
+// Unfortunately these results need to be post-filtered since the AST we get is
----------------
hmm, looks like we don't use TargetContext in the implemenation at all. Is the comment out-of-date now?
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:141
+ // same class.
+ if (!SM.isBeforeInTranslationUnit(D->getLocation(),
+ Target->getLocation())) {
----------------
we are distinguishing two cases here: normal functions and the class methods. Could we make the code handle these two cases separately? e.g.
```
if (Class) {
// check whether they are in the same class;
} else { // handle normal function
// call isBeforeInTranslation
}
```
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:160
+// usually be the first declaration in current translation unit with the
+// exception of template specialization. For those we return the previous
+// declaration instead of the first one, since it will be template decl itself
----------------
function template is tricky, I may be not aware of the context, what's our plan for supporting it? could you give an concrete example? it seems that the current unit test doesn't cover it.
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:172
+
+/// Moves definition of a function to its declaration location.
+/// Before:
----------------
I believe it also works for class methods?
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:183
+/// a.h:
+/// void foo() { return ; }
+///
----------------
now we get a potential ODR violation in this example, maybe choose a different example?
================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DefineInline.cpp:224
+
+ Expected<Effect> apply(const Selection &Sel) override {
+ return llvm::createStringError(llvm::inconvertibleErrorCode(),
----------------
The tweak is under development, do we need to hide it until it is completed?
================
Comment at: clang-tools-extra/clangd/unittests/TweakTests.cpp:25
#include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
#include "clang/Tooling/Core/Replacement.h"
----------------
the header seems irrelevant to me.
================
Comment at: clang-tools-extra/clangd/unittests/TweakTests.cpp:709
+ EXPECT_UNAVAILABLE(R"cpp(
+ #include "a.h"
+ void bar();
----------------
The `a.h` seems to be non-existed unless you explicitly set it via `ExtraFiles["a.h"]`?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D65433/new/
https://reviews.llvm.org/D65433
More information about the cfe-commits
mailing list