[PATCH] D80521: [clangd] Make use of SourceOrder to find first initializer in DefineOutline
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon May 25 08:33:48 PDT 2020
kadircet created this revision.
kadircet added a reviewer: sammccall.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay, ilya-biryukov.
Herald added a project: clang.
Constructors can have implicit initializers, this was crashing define
outline. Make sure we find the first "written" ctor initializer to figure out
`:` location.
Fixes https://github.com/clangd/clangd/issues/400
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D80521
Files:
clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
clang-tools-extra/clangd/unittests/TweakTests.cpp
Index: clang-tools-extra/clangd/unittests/TweakTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/clangd/unittests/TweakTests.cpp
@@ -2059,21 +2059,57 @@
"void foo(int x, int y = 5, int = 2, int (*foo)(int) = nullptr) ;",
"void foo(int x, int y , int , int (*foo)(int) ) {}",
},
- // Ctor initializers.
+ // Constructors
+ {
+ R"cpp(
+ class Foo {public: Foo(); Foo(int);};
+ class Bar {
+ Ba^r() {}
+ Bar(int x) : f1(x) {}
+ Foo f1;
+ Foo f2 = 2;
+ };)cpp",
+ R"cpp(
+ class Foo {public: Foo(); Foo(int);};
+ class Bar {
+ Bar() ;
+ Bar(int x) : f1(x) {}
+ Foo f1;
+ Foo f2 = 2;
+ };)cpp",
+ "Bar::Bar() {}\n",
+ },
+ // Ctor with initializer.
+ {
+ R"cpp(
+ class Foo {public: Foo(); Foo(int);};
+ class Bar {
+ Bar() {}
+ B^ar(int x) : f1(x), f2(3) {}
+ Foo f1;
+ Foo f2 = 2;
+ };)cpp",
+ R"cpp(
+ class Foo {public: Foo(); Foo(int);};
+ class Bar {
+ Bar() {}
+ Bar(int x) ;
+ Foo f1;
+ Foo f2 = 2;
+ };)cpp",
+ "Bar::Bar(int x) : f1(x), f2(3) {}\n",
+ },
+ // Ctor initializer with attribute.
{
R"cpp(
class Foo {
- int y = 2;
F^oo(int z) __attribute__((weak)) : bar(2){}
int bar;
- int z = 2;
};)cpp",
R"cpp(
class Foo {
- int y = 2;
Foo(int z) __attribute__((weak)) ;
int bar;
- int z = 2;
};)cpp",
"Foo::Foo(int z) __attribute__((weak)) : bar(2){}\n",
},
Index: clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
===================================================================
--- clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp
@@ -323,12 +323,11 @@
SourceLocation InitStart;
// Find the first initializer.
for (const auto *CInit : CD->inits()) {
- // We don't care about in-class initializers.
- if (CInit->isInClassMemberInitializer())
+ // SourceOrder is -1 for implicit initializers.
+ if (CInit->getSourceOrder() != 0)
continue;
- if (InitStart.isInvalid() ||
- SM.isBeforeInTranslationUnit(CInit->getSourceLocation(), InitStart))
- InitStart = CInit->getSourceLocation();
+ InitStart = CInit->getSourceLocation();
+ break;
}
if (InitStart.isValid()) {
auto Toks = TokBuf.expandedTokens(CD->getSourceRange());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80521.266027.patch
Type: text/x-patch
Size: 3003 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200525/0329f471/attachment-0001.bin>
More information about the cfe-commits
mailing list