Skip to content

Commit 4f19819

Browse files
fix: Correctly emit refs for local extern decls (#362)
1 parent 31ed910 commit 4f19819

File tree

6 files changed

+35
-12
lines changed

6 files changed

+35
-12
lines changed

indexer/Indexer.cc

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -860,24 +860,29 @@ void TuIndexer::saveVarDecl(const clang::VarDecl &varDecl) {
860860
// Individual bindings will be visited by VisitBindingDecl
861861
return;
862862
}
863+
#define GET_SYMBOL \
864+
auto optSymbol = this->symbolFormatter.getVarSymbol(varDecl); \
865+
if (!optSymbol.has_value()) { \
866+
return; \
867+
}
868+
auto loc = varDecl.getLocation();
869+
if (varDecl.isLocalExternDecl()) {
870+
GET_SYMBOL;
871+
this->saveReference(*optSymbol, loc, &varDecl);
872+
return;
873+
}
863874
if (varDecl.isLocalVarDeclOrParm()) {
864-
auto optSymbol = this->symbolFormatter.getLocalVarOrParmSymbol(varDecl);
865-
if (!optSymbol.has_value()) {
866-
return;
867-
}
868-
this->saveDefinition(optSymbol.value(), varDecl.getLocation(),
869-
std::nullopt);
875+
GET_SYMBOL;
876+
this->saveDefinition(*optSymbol, loc, std::nullopt);
870877
}
871878
if (varDecl.isStaticDataMember() || varDecl.isFileVarDecl()) {
879+
GET_SYMBOL;
872880
// Non-static data members are handled by saveFieldDecl
873-
auto optSymbol = this->symbolFormatter.getVarSymbol(varDecl);
874-
if (!optSymbol.has_value()) {
875-
return;
876-
}
877881
scip::SymbolInformation symbolInfo{};
878882
this->getDocComment(varDecl).addTo(symbolInfo);
879-
this->saveDefinition(optSymbol.value(), varDecl.getLocation(), symbolInfo);
883+
this->saveDefinition(*optSymbol, loc, symbolInfo);
880884
}
885+
#undef GET_SYMBOL
881886
}
882887

883888
void TuIndexer::saveVarTemplateDecl(const clang::VarTemplateDecl &) {

indexer/SymbolFormatter.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ SymbolFormatter::getUsingSymbol(const clang::UsingDecl &) {
705705

706706
std::optional<SymbolNameRef>
707707
SymbolFormatter::getVarSymbol(const clang::VarDecl &varDecl) {
708-
if (varDecl.isLocalVarDeclOrParm()) {
708+
if (varDecl.isLocalVarDeclOrParm() && !varDecl.isLocalExternDecl()) {
709709
return this->getLocalVarOrParmSymbol(varDecl);
710710
}
711711
if (varDecl.getDeclName().isEmpty()) {

test/index/fwd_decl/mydefs.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ struct S {};
77
void C::m() { }
88

99
int Global = 3;
10+
11+
int externInt = 30;

test/index/fwd_decl/mydefs.snapshot.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@
1414

1515
int Global = 3;
1616
// ^^^^^^ definition [..] Global.
17+
18+
int externInt = 30;
19+
// ^^^^^^^^^ definition [..] externInt.

test/index/fwd_decl/myuses.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ void doStuff(S *, C *c) {
1010
undo_magic();
1111
}
1212
}
13+
14+
int useExtern() {
15+
extern int externInt;
16+
return externInt;
17+
}

test/index/fwd_decl/myuses.snapshot.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,11 @@
2323
// ^^^^^^^^^^ reference [..] undo_magic(49f6e7a06ebc5aa8).
2424
}
2525
}
26+
27+
int useExtern() {
28+
// ^^^^^^^^^ definition [..] useExtern(b126dc7c1de90089).
29+
extern int externInt;
30+
// ^^^^^^^^^ reference [..] externInt.
31+
return externInt;
32+
// ^^^^^^^^^ reference [..] externInt.
33+
}

0 commit comments

Comments
 (0)