зеркало из https://github.com/microsoft/clang-1.git
Give the default CorrectionCandidateCallback::ValidateCandidate some
smarts so that it doesn't approve of keywords and/or type names when it knows (based on its flags) that those kinds of corrections are not wanted. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178668 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8f187f62cb
Коммит
20a7cf4d78
|
@ -228,9 +228,11 @@ class CorrectionCandidateCallback {
|
|||
/// candidate is viable, without ranking potentially viable candidates.
|
||||
/// Only ValidateCandidate or RankCandidate need to be overriden by a
|
||||
/// callback wishing to check the viability of correction candidates.
|
||||
virtual bool ValidateCandidate(const TypoCorrection &candidate) {
|
||||
return true;
|
||||
}
|
||||
/// The default predicate always returns true if the candidate is not a type
|
||||
/// name or keyword, true for types if WantTypeSpecifiers is true, and true
|
||||
/// for keywords if WantTypeSpecifiers, WantExpressionKeywords,
|
||||
/// WantCXXNamedCasts, WantRemainingKeywords, or WantObjCSuper is true.
|
||||
virtual bool ValidateCandidate(const TypoCorrection &candidate);
|
||||
|
||||
/// \brief Method used by Sema::CorrectTypo to assign an "edit distance" rank
|
||||
/// to a candidate (where a lower value represents a better candidate), or
|
||||
|
|
|
@ -999,6 +999,7 @@ Parser::isCXXDeclarationSpecifier(Parser::TPResult BracedCastResult,
|
|||
// to types and identifiers, in order to try to recover from errors.
|
||||
CorrectionCandidateCallback TypoCorrection;
|
||||
TypoCorrection.WantRemainingKeywords = false;
|
||||
TypoCorrection.WantTypeSpecifiers = Next.isNot(tok::arrow);
|
||||
switch (TryAnnotateName(false /* no nested name specifier */,
|
||||
&TypoCorrection)) {
|
||||
case ANK_Error:
|
||||
|
|
|
@ -4139,3 +4139,21 @@ std::string TypoCorrection::getAsString(const LangOptions &LO) const {
|
|||
|
||||
return CorrectionName.getAsString();
|
||||
}
|
||||
|
||||
bool CorrectionCandidateCallback::ValidateCandidate(const TypoCorrection &candidate) {
|
||||
if (!candidate.isResolved())
|
||||
return true;
|
||||
|
||||
if (candidate.isKeyword())
|
||||
return WantTypeSpecifiers || WantExpressionKeywords || WantCXXNamedCasts ||
|
||||
WantRemainingKeywords || WantObjCSuper;
|
||||
|
||||
for (TypoCorrection::const_decl_iterator CDecl = candidate.begin(),
|
||||
CDeclEnd = candidate.end();
|
||||
CDecl != CDeclEnd; ++CDecl) {
|
||||
if (!isa<TypeDecl>(*CDecl))
|
||||
return true;
|
||||
}
|
||||
|
||||
return WantTypeSpecifiers;
|
||||
}
|
||||
|
|
|
@ -250,3 +250,13 @@ void f(B &x) {
|
|||
x.Createfoo(0,0); // expected-error {{no member named 'Createfoo' in 'PR13387::B'; did you mean 'CreateFoo'?}}
|
||||
}
|
||||
}
|
||||
|
||||
struct DataStruct {void foo();};
|
||||
struct T {
|
||||
DataStruct data_struct;
|
||||
void f();
|
||||
};
|
||||
// should be void T::f();
|
||||
void f() {
|
||||
data_struct->foo(); // expected-error-re{{use of undeclared identifier 'data_struct'$}}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче