|
13 | 13 | #include "clang/AST/DeclTemplate.h" |
14 | 14 | #include "clang/Basic/DiagnosticComment.h" |
15 | 15 | #include "clang/Basic/LLVM.h" |
| 16 | +#include "clang/Basic/SimpleTypoCorrection.h" |
16 | 17 | #include "clang/Basic/SourceManager.h" |
17 | 18 | #include "clang/Lex/Preprocessor.h" |
18 | 19 | #include "llvm/ADT/StringSwitch.h" |
@@ -975,69 +976,22 @@ unsigned Sema::resolveParmVarReference(StringRef Name, |
975 | 976 | return ParamCommandComment::InvalidParamIndex; |
976 | 977 | } |
977 | 978 |
|
978 | | -namespace { |
979 | | -class SimpleTypoCorrector { |
980 | | - const NamedDecl *BestDecl; |
981 | | - |
982 | | - StringRef Typo; |
983 | | - const unsigned MaxEditDistance; |
984 | | - |
985 | | - unsigned BestEditDistance; |
986 | | - unsigned BestIndex; |
987 | | - unsigned NextIndex; |
988 | | - |
989 | | -public: |
990 | | - explicit SimpleTypoCorrector(StringRef Typo) |
991 | | - : BestDecl(nullptr), Typo(Typo), MaxEditDistance((Typo.size() + 2) / 3), |
992 | | - BestEditDistance(MaxEditDistance + 1), BestIndex(0), NextIndex(0) {} |
993 | | - |
994 | | - void addDecl(const NamedDecl *ND); |
995 | | - |
996 | | - const NamedDecl *getBestDecl() const { |
997 | | - if (BestEditDistance > MaxEditDistance) |
998 | | - return nullptr; |
999 | | - |
1000 | | - return BestDecl; |
1001 | | - } |
| 979 | +unsigned |
| 980 | +Sema::correctTypoInParmVarReference(StringRef Typo, |
| 981 | + ArrayRef<const ParmVarDecl *> ParamVars) { |
| 982 | + SimpleTypoCorrection STC(Typo); |
| 983 | + for (unsigned i = 0, e = ParamVars.size(); i != e; ++i) { |
| 984 | + const ParmVarDecl *Param = ParamVars[i]; |
| 985 | + if (!Param) |
| 986 | + continue; |
1002 | 987 |
|
1003 | | - unsigned getBestDeclIndex() const { |
1004 | | - assert(getBestDecl()); |
1005 | | - return BestIndex; |
| 988 | + STC.add(Param->getIdentifier()); |
1006 | 989 | } |
1007 | | -}; |
1008 | | - |
1009 | | -void SimpleTypoCorrector::addDecl(const NamedDecl *ND) { |
1010 | | - unsigned CurrIndex = NextIndex++; |
1011 | | - |
1012 | | - const IdentifierInfo *II = ND->getIdentifier(); |
1013 | | - if (!II) |
1014 | | - return; |
1015 | 990 |
|
1016 | | - StringRef Name = II->getName(); |
1017 | | - unsigned MinPossibleEditDistance = abs((int)Name.size() - (int)Typo.size()); |
1018 | | - if (MinPossibleEditDistance > 0 && |
1019 | | - Typo.size() / MinPossibleEditDistance < 3) |
1020 | | - return; |
| 991 | + if (STC.hasCorrection()) |
| 992 | + return STC.getCorrectionIndex(); |
1021 | 993 |
|
1022 | | - unsigned EditDistance = Typo.edit_distance(Name, true, MaxEditDistance); |
1023 | | - if (EditDistance < BestEditDistance) { |
1024 | | - BestEditDistance = EditDistance; |
1025 | | - BestDecl = ND; |
1026 | | - BestIndex = CurrIndex; |
1027 | | - } |
1028 | | -} |
1029 | | -} // end anonymous namespace |
1030 | | - |
1031 | | -unsigned Sema::correctTypoInParmVarReference( |
1032 | | - StringRef Typo, |
1033 | | - ArrayRef<const ParmVarDecl *> ParamVars) { |
1034 | | - SimpleTypoCorrector Corrector(Typo); |
1035 | | - for (unsigned i = 0, e = ParamVars.size(); i != e; ++i) |
1036 | | - Corrector.addDecl(ParamVars[i]); |
1037 | | - if (Corrector.getBestDecl()) |
1038 | | - return Corrector.getBestDeclIndex(); |
1039 | | - else |
1040 | | - return ParamCommandComment::InvalidParamIndex; |
| 994 | + return ParamCommandComment::InvalidParamIndex; |
1041 | 995 | } |
1042 | 996 |
|
1043 | 997 | namespace { |
@@ -1079,30 +1033,31 @@ bool Sema::resolveTParamReference( |
1079 | 1033 |
|
1080 | 1034 | namespace { |
1081 | 1035 | void CorrectTypoInTParamReferenceHelper( |
1082 | | - const TemplateParameterList *TemplateParameters, |
1083 | | - SimpleTypoCorrector &Corrector) { |
| 1036 | + const TemplateParameterList *TemplateParameters, |
| 1037 | + SimpleTypoCorrection &STC) { |
1084 | 1038 | for (unsigned i = 0, e = TemplateParameters->size(); i != e; ++i) { |
1085 | 1039 | const NamedDecl *Param = TemplateParameters->getParam(i); |
1086 | | - Corrector.addDecl(Param); |
| 1040 | + if (!Param) |
| 1041 | + continue; |
| 1042 | + |
| 1043 | + STC.add(Param->getIdentifier()); |
1087 | 1044 |
|
1088 | 1045 | if (const TemplateTemplateParmDecl *TTP = |
1089 | 1046 | dyn_cast<TemplateTemplateParmDecl>(Param)) |
1090 | | - CorrectTypoInTParamReferenceHelper(TTP->getTemplateParameters(), |
1091 | | - Corrector); |
| 1047 | + CorrectTypoInTParamReferenceHelper(TTP->getTemplateParameters(), STC); |
1092 | 1048 | } |
1093 | 1049 | } |
1094 | 1050 | } // end anonymous namespace |
1095 | 1051 |
|
1096 | 1052 | StringRef Sema::correctTypoInTParamReference( |
1097 | 1053 | StringRef Typo, |
1098 | 1054 | const TemplateParameterList *TemplateParameters) { |
1099 | | - SimpleTypoCorrector Corrector(Typo); |
1100 | | - CorrectTypoInTParamReferenceHelper(TemplateParameters, Corrector); |
1101 | | - if (const NamedDecl *ND = Corrector.getBestDecl()) { |
1102 | | - const IdentifierInfo *II = ND->getIdentifier(); |
1103 | | - assert(II && "SimpleTypoCorrector should not return this decl"); |
1104 | | - return II->getName(); |
1105 | | - } |
| 1055 | + SimpleTypoCorrection STC(Typo); |
| 1056 | + CorrectTypoInTParamReferenceHelper(TemplateParameters, STC); |
| 1057 | + |
| 1058 | + if (auto CorrectedTParamReference = STC.getCorrection()) |
| 1059 | + return *CorrectedTParamReference; |
| 1060 | + |
1106 | 1061 | return StringRef(); |
1107 | 1062 | } |
1108 | 1063 |
|
|
0 commit comments