[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:
Fariborz Jahanian 2013-05-08 22:14:28 +00:00
Родитель 1c8f270a75
Коммит ad91e5431f
2 изменённых файлов: 37 добавлений и 21 удалений

Просмотреть файл

@ -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"