зеркало из https://github.com/microsoft/clang-1.git
[doc parsing]: Also do typo correction for
dynamically registered commands. // rdar://12381408 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181477 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
1c8f270a75
Коммит
ad91e5431f
|
@ -43,30 +43,41 @@ const CommandInfo *CommandTraits::getCommandInfo(unsigned CommandID) const {
|
|||
return getRegisteredCommandInfo(CommandID);
|
||||
}
|
||||
|
||||
const CommandInfo *
|
||||
CommandTraits::getTypoCorrectCommandInfo(StringRef Typo) const {
|
||||
static void
|
||||
HelperTypoCorrectCommandInfo(SmallVectorImpl<const CommandInfo *> &BestCommand,
|
||||
StringRef Typo, const CommandInfo *Command) {
|
||||
const unsigned MaxEditDistance = 1;
|
||||
unsigned BestEditDistance = MaxEditDistance + 1;
|
||||
StringRef Name = Command->Name;
|
||||
|
||||
unsigned MinPossibleEditDistance = abs((int)Name.size() - (int)Typo.size());
|
||||
if (MinPossibleEditDistance > 0 &&
|
||||
Typo.size() / MinPossibleEditDistance < 1)
|
||||
return;
|
||||
unsigned EditDistance = Typo.edit_distance(Name, true, MaxEditDistance);
|
||||
if (EditDistance > MaxEditDistance)
|
||||
return;
|
||||
if (EditDistance == BestEditDistance)
|
||||
BestCommand.push_back(Command);
|
||||
else if (EditDistance < BestEditDistance) {
|
||||
BestCommand.clear();
|
||||
BestCommand.push_back(Command);
|
||||
BestEditDistance = EditDistance;
|
||||
}
|
||||
}
|
||||
|
||||
const CommandInfo *
|
||||
CommandTraits::getTypoCorrectCommandInfo(StringRef Typo) const {
|
||||
SmallVector<const CommandInfo *, 2> BestCommand;
|
||||
|
||||
int NumOfCommands = sizeof(Commands) / sizeof(CommandInfo);
|
||||
for (int i = 0; i < NumOfCommands; i++) {
|
||||
StringRef Name = Commands[i].Name;
|
||||
unsigned MinPossibleEditDistance = abs((int)Name.size() - (int)Typo.size());
|
||||
if (MinPossibleEditDistance > 0 &&
|
||||
Typo.size() / MinPossibleEditDistance < 1)
|
||||
continue;
|
||||
unsigned EditDistance = Typo.edit_distance(Name, true, MaxEditDistance);
|
||||
if (EditDistance > MaxEditDistance)
|
||||
continue;
|
||||
if (EditDistance == BestEditDistance)
|
||||
BestCommand.push_back(&Commands[i]);
|
||||
else if (EditDistance < BestEditDistance) {
|
||||
BestCommand.clear();
|
||||
BestCommand.push_back(&Commands[i]);
|
||||
BestEditDistance = EditDistance;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < NumOfCommands; i++)
|
||||
HelperTypoCorrectCommandInfo(BestCommand, Typo, &Commands[i]);
|
||||
|
||||
for (unsigned i = 0, e = RegisteredCommands.size(); i != e; ++i)
|
||||
if (!RegisteredCommands[i]->IsUnknownCommand)
|
||||
HelperTypoCorrectCommandInfo(BestCommand, Typo, RegisteredCommands[i]);
|
||||
|
||||
return (BestCommand.size() != 1) ? NULL : BestCommand[0];
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -Wdocumentation -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wdocumentation -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wdocumentation -fcomment-block-commands=foobar -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wdocumentation -fcomment-block-commands=foobar -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
|
||||
|
||||
// expected-warning@+1 {{parameter 'ZZZZZZZZZZ' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
|
||||
/// \param ZZZZZZZZZZ Blah blah.
|
||||
|
@ -63,6 +63,10 @@ void test_deprecated_9(int a);
|
|||
/// \retur int in FooBar
|
||||
int FooBar();
|
||||
|
||||
// expected-warning@+1 {{unknown command tag name 'fooba'; did you mean 'foobar'?}}
|
||||
/// \fooba bbb IS_DOXYGEN_END
|
||||
int gorf();
|
||||
|
||||
// CHECK: fix-it:"{{.*}}":{5:12-5:22}:"a"
|
||||
// CHECK: fix-it:"{{.*}}":{9:12-9:15}:"aaa"
|
||||
// CHECK: fix-it:"{{.*}}":{13:13-13:23}:"T"
|
||||
|
@ -75,3 +79,4 @@ int FooBar();
|
|||
// CHECK: fix-it:"{{.*}}":{50:27-50:27}:" __attribute__((deprecated))"
|
||||
// CHECK: fix-it:"{{.*}}":{58:30-58:30}:" MY_ATTR_DEPRECATED"
|
||||
// CHECK: fix-it:"{{.*}}":{63:6-63:11}:"return"
|
||||
// CHECK: fix-it:"{{.*}}":{67:6-67:11}:"foobar"
|
||||
|
|
Загрузка…
Ссылка в новой задаче