• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===--- TypoCorrection.h - Class for typo correction results ---*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the TypoCorrection class, which stores the results of
11 // Sema's typo correction (Sema::CorrectTypo).
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CLANG_SEMA_TYPOCORRECTION_H
16 #define LLVM_CLANG_SEMA_TYPOCORRECTION_H
17 
18 #include "clang/AST/DeclCXX.h"
19 
20 namespace clang {
21 
22 /// @brief Simple class containing the result of Sema::CorrectTypo
23 class TypoCorrection {
24 public:
25   TypoCorrection(const DeclarationName &Name, NamedDecl *NameDecl,
26                  NestedNameSpecifier *NNS=NULL, unsigned distance=0)
CorrectionName(Name)27       : CorrectionName(Name),
28         CorrectionNameSpec(NNS),
29         CorrectionDecl(NameDecl),
30         EditDistance(distance) {}
31 
32   TypoCorrection(NamedDecl *Name, NestedNameSpecifier *NNS=NULL,
33                  unsigned distance=0)
34       : CorrectionName(Name->getDeclName()),
35         CorrectionNameSpec(NNS),
36         CorrectionDecl(Name),
37         EditDistance(distance)  {}
38 
39   TypoCorrection(DeclarationName Name, NestedNameSpecifier *NNS=NULL,
40                  unsigned distance=0)
CorrectionName(Name)41       : CorrectionName(Name),
42         CorrectionNameSpec(NNS),
43         CorrectionDecl(NULL),
44         EditDistance(distance)  {}
45 
TypoCorrection()46   TypoCorrection()
47       : CorrectionName(), CorrectionNameSpec(NULL), CorrectionDecl(NULL),
48         EditDistance(0) {}
49 
50   /// \brief Gets the DeclarationName of the typo correction
getCorrection()51   DeclarationName getCorrection() const { return CorrectionName; }
getCorrectionAsIdentifierInfo()52   IdentifierInfo* getCorrectionAsIdentifierInfo() const {
53     return CorrectionName.getAsIdentifierInfo();
54   }
55 
56   /// \brief Gets the NestedNameSpecifier needed to use the typo correction
getCorrectionSpecifier()57   NestedNameSpecifier* getCorrectionSpecifier() const {
58     return CorrectionNameSpec;
59   }
setCorrectionSpecifier(NestedNameSpecifier * NNS)60   void setCorrectionSpecifier(NestedNameSpecifier* NNS) {
61     CorrectionNameSpec = NNS;
62   }
63 
64   /// \brief Gets the "edit distance" of the typo correction from the typo
getEditDistance()65   unsigned getEditDistance() const { return EditDistance; }
66 
67   /// \brief Gets the pointer to the declaration of the typo correction
getCorrectionDecl()68   NamedDecl* getCorrectionDecl() const {
69     return isKeyword() ? NULL : CorrectionDecl;
70   }
71   template <class DeclClass>
getCorrectionDeclAs()72   DeclClass *getCorrectionDeclAs() const {
73     return dyn_cast_or_null<DeclClass>(getCorrectionDecl());
74   }
75 
setCorrectionDecl(NamedDecl * CDecl)76   void setCorrectionDecl(NamedDecl *CDecl) {
77     CorrectionDecl = CDecl;
78     if (!CorrectionName)
79       CorrectionName = CDecl->getDeclName();
80   }
81 
82   std::string getAsString(const LangOptions &LO) const;
getQuoted(const LangOptions & LO)83   std::string getQuoted(const LangOptions &LO) const {
84     return "'" + getAsString(LO) + "'";
85   }
86 
87   operator bool() const { return bool(CorrectionName); }
88 
KeywordDecl()89   static inline NamedDecl *KeywordDecl() { return (NamedDecl*)-1; }
isKeyword()90   bool isKeyword() const { return CorrectionDecl == KeywordDecl(); }
91 
92   // Returns true if the correction either is a keyword or has a known decl.
isResolved()93   bool isResolved() const { return CorrectionDecl != NULL; }
94 
95 private:
96   // Results.
97   DeclarationName CorrectionName;
98   NestedNameSpecifier *CorrectionNameSpec;
99   NamedDecl *CorrectionDecl;
100   unsigned EditDistance;
101 };
102 
103 }
104 
105 #endif
106