]> granicus.if.org Git - clang/commitdiff
[doc parsing]: Also do typo correction for
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 8 May 2013 22:14:28 +0000 (22:14 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 8 May 2013 22:14:28 +0000 (22:14 +0000)
dynamically registered commands.
// rdar://12381408

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181477 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/CommentCommandTraits.cpp
test/Sema/warn-documentation-fixits.cpp

index e4cc84afb78edbc130dc60440f81c871f7f865d4..dc4744a53c59a28703ba4308c2a1d73c500a6db8 100644 (file)
@@ -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];
 }
 
index 79bf7698a91eb1cbe3013138850645b0fa7c7a30..707ecb362f86743f50422a14fd4dc1590bf2914b 100644 (file)
@@ -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"