summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorKaelyn Uhrain <rikka@google.com>2013-07-02 23:47:44 +0000
committerKaelyn Uhrain <rikka@google.com>2013-07-02 23:47:44 +0000
commit10413a46a0d8abe7d6a14e99ce582dac0ad069e8 (patch)
tree035345bb35cb1d0e02290c611e2188d0629e3e10 /clang/lib/Sema/SemaDecl.cpp
parentb18b0c0f16c63585f69d72bc0991c1c09c813220 (diff)
downloadbcm5719-llvm-10413a46a0d8abe7d6a14e99ce582dac0ad069e8.tar.gz
bcm5719-llvm-10413a46a0d8abe7d6a14e99ce582dac0ad069e8.zip
Allow typo correction to try removing nested name specifiers.
The removal is tried by retrying the failed lookup of a correction candidate with either the MemberContext or SS (CXXScopeSpecifier) or both set to NULL if they weren't already. If the candidate identifier is then looked up successfully, make a note in the candidate that the SourceRange should include any existing nested name specifier even if the candidate isn't adding a different one (i.e. the candidate has a NULL NestedNameSpecifier). Also tweak the diagnostic messages to differentiate between a suggestion that just replaces the identifer but leaves the existing nested name specifier intact and one that replaces the entire qualified identifier, in cases where the suggested replacement is unqualified. llvm-svn: 185487
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 8e863896521..162b5b8c091 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -422,22 +422,29 @@ bool Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II,
CorrectedQuotedStr = "the keyword " + CorrectedQuotedStr;
Diag(IILoc, diag::err_unknown_typename_suggest)
<< II << CorrectedQuotedStr
- << FixItHint::CreateReplacement(SourceRange(IILoc), CorrectedStr);
+ << FixItHint::CreateReplacement(Corrected.getCorrectionRange(),
+ CorrectedStr);
II = NewII;
} else {
NamedDecl *Result = Corrected.getCorrectionDecl();
// We found a similarly-named type or interface; suggest that.
- if (!SS || !SS->isSet())
+ if (!SS || !SS->isSet()) {
Diag(IILoc, diag::err_unknown_typename_suggest)
<< II << CorrectedQuotedStr
- << FixItHint::CreateReplacement(SourceRange(IILoc), CorrectedStr);
- else if (DeclContext *DC = computeDeclContext(*SS, false))
- Diag(IILoc, diag::err_unknown_nested_typename_suggest)
- << II << DC << CorrectedQuotedStr << SS->getRange()
<< FixItHint::CreateReplacement(Corrected.getCorrectionRange(),
CorrectedStr);
- else
+ } else if (DeclContext *DC = computeDeclContext(*SS, false)) {
+ bool droppedSpecifier = Corrected.WillReplaceSpecifier() &&
+ II->getName().equals(CorrectedStr);
+ Diag(IILoc, diag::err_unknown_nested_typename_suggest)
+ << II << DC << droppedSpecifier << CorrectedQuotedStr
+ << SS->getRange()
+ << FixItHint::CreateReplacement(Corrected.getCorrectionRange(),
+ CorrectedStr);
+ }
+ else {
llvm_unreachable("could not have corrected a typo here");
+ }
Diag(Result->getLocation(), diag::note_previous_decl)
<< CorrectedQuotedStr;
@@ -680,16 +687,19 @@ Corrected:
QualifiedDiag = diag::err_unknown_nested_typename_suggest;
}
- if (SS.isEmpty())
+ if (SS.isEmpty()) {
Diag(NameLoc, UnqualifiedDiag)
<< Name << CorrectedQuotedStr
<< FixItHint::CreateReplacement(NameLoc, CorrectedStr);
- else // FIXME: is this even reachable? Test it.
+ } else {// FIXME: is this even reachable? Test it.
+ bool droppedSpecifier = Corrected.WillReplaceSpecifier() &&
+ Name->getName().equals(CorrectedStr);
Diag(NameLoc, QualifiedDiag)
- << Name << computeDeclContext(SS, false) << CorrectedQuotedStr
- << SS.getRange()
+ << Name << computeDeclContext(SS, false) << droppedSpecifier
+ << CorrectedQuotedStr << SS.getRange()
<< FixItHint::CreateReplacement(Corrected.getCorrectionRange(),
CorrectedStr);
+ }
// Update the name, so that the caller has the new name.
Name = Corrected.getCorrectionAsIdentifierInfo();
OpenPOWER on IntegriCloud