Skip to content

Commit a02b43b

Browse files
committed
Add an API to let ClangD work here.
1 parent fa3fc1a commit a02b43b

File tree

2 files changed

+10
-16
lines changed

2 files changed

+10
-16
lines changed

clang-tools-extra/clangd/CompileCommands.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -458,20 +458,6 @@ llvm::ArrayRef<ArgStripper::Rule> ArgStripper::rulesFor(llvm::StringRef Arg) {
458458
PrevAlias[Self] = T;
459459
NextAlias[T] = Self;
460460
};
461-
// Also grab prefixes for each option, these are not fully exposed.
462-
llvm::ArrayRef<llvm::StringLiteral> Prefixes[DriverID::LastOption];
463-
464-
#define PREFIX(NAME, VALUE) \
465-
static constexpr llvm::StringLiteral NAME##_init[] = VALUE; \
466-
static constexpr llvm::ArrayRef<llvm::StringLiteral> NAME( \
467-
NAME##_init, std::size(NAME##_init) - 1);
468-
#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \
469-
FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, \
470-
METAVAR, VALUES) \
471-
Prefixes[DriverID::OPT_##ID] = PREFIX;
472-
#include "clang/Driver/Options.inc"
473-
#undef OPTION
474-
#undef PREFIX
475461

476462
struct {
477463
DriverID ID;
@@ -498,7 +484,9 @@ llvm::ArrayRef<ArgStripper::Rule> ArgStripper::rulesFor(llvm::StringRef Arg) {
498484
llvm::SmallVector<Rule> Rules;
499485
// Iterate over each alias, to add rules for parsing it.
500486
for (unsigned A = ID; A != DriverID::OPT_INVALID; A = NextAlias[A]) {
501-
if (!Prefixes[A].size()) // option groups.
487+
llvm::SmallVector<llvm::StringRef, 4> Prefixes;
488+
DriverTable.appendOptionPrefixes(A, Prefixes);
489+
if (Prefixes.empty()) // option groups.
502490
continue;
503491
auto Opt = DriverTable.getOption(A);
504492
// Exclude - and -foo pseudo-options.
@@ -507,7 +495,7 @@ llvm::ArrayRef<ArgStripper::Rule> ArgStripper::rulesFor(llvm::StringRef Arg) {
507495
auto Modes = getModes(Opt);
508496
std::pair<unsigned, unsigned> ArgCount = getArgCount(Opt);
509497
// Iterate over each spelling of the alias, e.g. -foo vs --foo.
510-
for (StringRef Prefix : Prefixes[A]) {
498+
for (StringRef Prefix : Prefixes) {
511499
llvm::SmallString<64> Buf(Prefix);
512500
Buf.append(Opt.getName());
513501
llvm::StringRef Spelling = Result->try_emplace(Buf).first->getKey();

llvm/include/llvm/Option/OptTable.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,12 @@ class OptTable {
197197
: I.getPrefix(StrTable, PrefixesTable, 0);
198198
}
199199

200+
void appendOptionPrefixes(OptSpecifier id,
201+
SmallVectorImpl<StringRef> &Prefixes) const {
202+
const Info &I = getInfo(id);
203+
I.appendPrefixes(StrTable, PrefixesTable, Prefixes);
204+
}
205+
200206
/// Lookup the prefixed name of the given option.
201207
StringRef getOptionPrefixedName(OptSpecifier id) const {
202208
return getInfo(id).getPrefixedName(StrTable);

0 commit comments

Comments
 (0)