14#ifndef LLVM_CLANG_SEMA_TYPOCORRECTION_H
15#define LLVM_CLANG_SEMA_TYPOCORRECTION_H
23#include "llvm/ADT/ArrayRef.h"
24#include "llvm/ADT/SmallVector.h"
25#include "llvm/Support/Casting.h"
38class NestedNameSpecifier;
61 unsigned CharDistance = 0,
unsigned QualifierDistance = 0)
62 : CorrectionName(Name), CorrectionNameSpec(NNS),
63 CharDistance(CharDistance), QualifierDistance(QualifierDistance) {
65 CorrectionDecls.push_back(NameDecl);
69 unsigned CharDistance = 0)
70 : CorrectionName(Name->getDeclName()), CorrectionNameSpec(NNS),
71 CharDistance(CharDistance) {
73 CorrectionDecls.push_back(Name);
77 unsigned CharDistance = 0)
78 : CorrectionName(Name), CorrectionNameSpec(NNS),
79 CharDistance(CharDistance) {}
92 return CorrectionNameSpec;
96 CorrectionNameSpec = NNS;
97 ForceSpecifierReplacement = !!NNS;
101 ForceSpecifierReplacement = ForceReplacement;
105 return ForceSpecifierReplacement;
109 QualifierDistance = ED;
113 CallbackDistance = ED;
147 return hasCorrectionDecl() ? *(CorrectionDecls.begin()) :
nullptr;
153 return D ?
D->getUnderlyingDecl() :
nullptr;
155 template <
class DeclClass>
162 CorrectionDecls.clear();
167 CorrectionDecls.clear();
173 CorrectionDecls.clear();
174 CorrectionDecls.insert(CorrectionDecls.begin(), Decls.begin(), Decls.end());
188 explicit operator bool()
const {
return bool(CorrectionName); }
195 CorrectionDecls.clear();
196 CorrectionDecls.push_back(
nullptr);
197 ForceSpecifierReplacement =
true;
203 return !CorrectionDecls.empty() && CorrectionDecls.front() ==
nullptr;
207 template<std::
size_t StrLen>
216 return CorrectionDecls.size() > 1;
222 if (ForceSpecifierReplacement && SS && !SS->
isEmpty())
227 return CorrectionRange;
233 return isKeyword() ? CorrectionDecls.end() : CorrectionDecls.begin();
241 return isKeyword() ? CorrectionDecls.end() : CorrectionDecls.begin();
254 ExtraDiagnostics.push_back(std::move(PD));
257 return ExtraDiagnostics;
261 bool hasCorrectionDecl()
const {
262 return (!
isKeyword() && !CorrectionDecls.empty());
266 DeclarationName CorrectionName;
267 NestedNameSpecifier CorrectionNameSpec = std::nullopt;
268 SmallVector<NamedDecl *, 1> CorrectionDecls;
269 unsigned CharDistance = 0;
270 unsigned QualifierDistance = 0;
271 unsigned CallbackDistance = 0;
272 SourceRange CorrectionRange;
273 bool ForceSpecifierReplacement =
false;
274 bool RequiresImport =
false;
276 std::vector<PartialDiagnostic> ExtraDiagnostics;
321 virtual std::unique_ptr<CorrectionCandidateCallback>
clone() = 0;
359 std::unique_ptr<CorrectionCandidateCallback>
clone()
override {
360 return std::make_unique<DefaultFilterCCC>(*
this);
376 std::unique_ptr<CorrectionCandidateCallback>
clone()
override {
377 return std::make_unique<DeclFilterCCC>(*
this);
387 bool HasExplicitTemplateArgs,
391 std::unique_ptr<CorrectionCandidateCallback>
clone()
override {
392 return std::make_unique<FunctionCallFilterCCC>(*
this);
397 bool HasExplicitTemplateArgs;
416 std::unique_ptr<CorrectionCandidateCallback>
clone()
override {
417 return std::make_unique<NoTypoCorrectionCCC>(*
this);
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::SourceLocation class and associated facilities.
Represents a C++ nested-name-specifier or a global scope specifier.
SourceLocation getBeginLoc() const
bool isEmpty() const
No scope specifier.
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
CorrectionCandidateCallback(const IdentifierInfo *Typo=nullptr, NestedNameSpecifier TypoNNS=std::nullopt)
bool WantExpressionKeywords
NestedNameSpecifier TypoNNS
void setTypoName(const IdentifierInfo *II)
virtual unsigned RankCandidate(const TypoCorrection &candidate)
Method used by Sema::CorrectTypo to assign an "edit distance" rank to a candidate (where a lower valu...
virtual bool ValidateCandidate(const TypoCorrection &candidate)
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
const IdentifierInfo * Typo
bool MatchesTypo(const TypoCorrection &candidate)
bool WantFunctionLikeCasts
void setTypoNNS(NestedNameSpecifier NNS)
virtual ~CorrectionCandidateCallback()=default
static const unsigned InvalidDistance
bool WantRemainingKeywords
virtual std::unique_ptr< CorrectionCandidateCallback > clone()=0
Clone this CorrectionCandidateCallback.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
std::unique_ptr< CorrectionCandidateCallback > clone() override
Clone this CorrectionCandidateCallback.
DeclFilterCCC(const IdentifierInfo *Typo=nullptr, NestedNameSpecifier TypoNNS=std::nullopt)
bool ValidateCandidate(const TypoCorrection &candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
std::unique_ptr< CorrectionCandidateCallback > clone() override
Clone this CorrectionCandidateCallback.
DefaultFilterCCC(const IdentifierInfo *Typo=nullptr, NestedNameSpecifier TypoNNS=std::nullopt)
bool ValidateCandidate(const TypoCorrection &candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
std::unique_ptr< CorrectionCandidateCallback > clone() override
Clone this CorrectionCandidateCallback.
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
This represents a decl that may have a name.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
std::unique_ptr< CorrectionCandidateCallback > clone() override
Clone this CorrectionCandidateCallback.
bool ValidateCandidate(const TypoCorrection &candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
Sema - This implements semantic analysis and AST building for C.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
Simple class containing the result of Sema::CorrectTypo.
IdentifierInfo * getCorrectionAsIdentifierInfo() const
TypoCorrection(DeclarationName Name, NestedNameSpecifier NNS=std::nullopt, unsigned CharDistance=0)
ArrayRef< PartialDiagnostic > getExtraDiagnostics() const
static const unsigned InvalidDistance
void addCorrectionDecl(NamedDecl *CDecl)
Add the given NamedDecl to the list of NamedDecls that are the declarations associated with the Decla...
void setCorrectionSpecifier(NestedNameSpecifier NNS)
void setCorrectionDecls(ArrayRef< NamedDecl * > Decls)
Clears the list of NamedDecls and adds the given set.
std::string getAsString(const LangOptions &LO) const
static const unsigned MaximumDistance
bool requiresImport() const
Returns whether this typo correction is correcting to a declaration that was declared in a module tha...
const_decl_iterator begin() const
void setCorrectionRange(CXXScopeSpec *SS, const DeclarationNameInfo &TypoName)
TypoCorrection(const DeclarationName &Name, NamedDecl *NameDecl, NestedNameSpecifier NNS=std::nullopt, unsigned CharDistance=0, unsigned QualifierDistance=0)
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
bool isKeyword(const char(&Str)[StrLen]) const
SourceRange getCorrectionRange() const
void setQualifierDistance(unsigned ED)
void WillReplaceSpecifier(bool ForceReplacement)
void setCallbackDistance(unsigned ED)
SmallVectorImpl< NamedDecl * >::const_iterator const_decl_iterator
static unsigned NormalizeEditDistance(unsigned ED)
DeclClass * getCorrectionDeclAs() const
const_decl_iterator end() const
DeclarationName getCorrection() const
Gets the DeclarationName of the typo correction.
unsigned getEditDistance(bool Normalized=true) const
Gets the "edit distance" of the typo correction from the typo.
void ClearCorrectionDecls()
Clears the list of NamedDecls.
static const unsigned CallbackDistanceWeight
static const unsigned QualifierDistanceWeight
SmallVectorImpl< NamedDecl * >::iterator decl_iterator
void setCorrectionDecl(NamedDecl *CDecl)
Clears the list of NamedDecls before adding the new one.
void setRequiresImport(bool Req)
TypoCorrection(NamedDecl *Name, NestedNameSpecifier NNS=std::nullopt, unsigned CharDistance=0)
std::string getQuoted(const LangOptions &LO) const
bool isOverloaded() const
static const unsigned CharDistanceWeight
bool WillReplaceSpecifier() const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
void addExtraDiagnostic(PartialDiagnostic PD)
Extra diagnostics are printed after the first diagnostic for the typo.
void makeKeyword()
Mark this TypoCorrection as being a keyword.
The JSON file list parser is used to communicate input to InstallAPI.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.