diff options
-rw-r--r-- | include/clang/Sema/ExternalSemaSource.h | 17 | ||||
-rw-r--r-- | include/clang/Sema/MultiplexExternalSemaSource.h | 9 | ||||
-rw-r--r-- | lib/Sema/MultiplexExternalSemaSource.cpp | 16 | ||||
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 8 | ||||
-rw-r--r-- | unittests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | unittests/Makefile | 2 |
6 files changed, 52 insertions, 1 deletions
diff --git a/include/clang/Sema/ExternalSemaSource.h b/include/clang/Sema/ExternalSemaSource.h index a626a090f6..fd32d7f007 100644 --- a/include/clang/Sema/ExternalSemaSource.h +++ b/include/clang/Sema/ExternalSemaSource.h @@ -14,6 +14,7 @@ #define LLVM_CLANG_SEMA_EXTERNAL_SEMA_SOURCE_H #include "clang/AST/ExternalASTSource.h" +#include "clang/Sema/TypoCorrection.h" #include "clang/Sema/Weak.h" #include "llvm/ADT/MapVector.h" #include <utility> @@ -187,6 +188,22 @@ public: virtual void ReadLateParsedTemplates( llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {} + /// \copydoc Sema::CorrectTypo + /// \note LookupKind must correspond to a valid Sema::LookupNameKind + /// + /// ExternalSemaSource::CorrectTypo is always given the first chance to + /// correct a typo (really, to offer suggestions to repair a failed lookup). + /// It will even be called when SpellChecking is turned off or after a + /// fatal error has already been detected. + virtual TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, + int LookupKind, Scope *S, CXXScopeSpec *SS, + CorrectionCandidateCallback &CCC, + DeclContext *MemberContext, + bool EnteringContext, + const ObjCObjectPointerType *OPT) { + return TypoCorrection(); + } + // isa/cast/dyn_cast support static bool classof(const ExternalASTSource *Source) { return Source->SemaSource; diff --git a/include/clang/Sema/MultiplexExternalSemaSource.h b/include/clang/Sema/MultiplexExternalSemaSource.h index 033400743b..bb7ba239ca 100644 --- a/include/clang/Sema/MultiplexExternalSemaSource.h +++ b/include/clang/Sema/MultiplexExternalSemaSource.h @@ -331,6 +331,15 @@ public: virtual void ReadLateParsedTemplates( llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap); + /// \copydoc ExternalSemaSource::CorrectTypo + /// \note Returns the first nonempty correction. + virtual TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, + int LookupKind, Scope *S, CXXScopeSpec *SS, + CorrectionCandidateCallback &CCC, + DeclContext *MemberContext, + bool EnteringContext, + const ObjCObjectPointerType *OPT); + // isa/cast/dyn_cast support static bool classof(const MultiplexExternalSemaSource*) { return true; } //static bool classof(const ExternalSemaSource*) { return true; } diff --git a/lib/Sema/MultiplexExternalSemaSource.cpp b/lib/Sema/MultiplexExternalSemaSource.cpp index de790e9a2d..43bafd3482 100644 --- a/lib/Sema/MultiplexExternalSemaSource.cpp +++ b/lib/Sema/MultiplexExternalSemaSource.cpp @@ -273,3 +273,19 @@ void MultiplexExternalSemaSource::ReadLateParsedTemplates( for (size_t i = 0; i < Sources.size(); ++i) Sources[i]->ReadLateParsedTemplates(LPTMap); } + +TypoCorrection MultiplexExternalSemaSource::CorrectTypo( + const DeclarationNameInfo &Typo, + int LookupKind, Scope *S, CXXScopeSpec *SS, + CorrectionCandidateCallback &CCC, + DeclContext *MemberContext, + bool EnteringContext, + const ObjCObjectPointerType *OPT) { + for (size_t I = 0, E = Sources.size(); I < E; ++I) { + if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC, + MemberContext, + EnteringContext, OPT)) + return C; + } + return TypoCorrection(); +} diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index e95ffce054..d0bb9f6abe 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -3872,6 +3872,14 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, DeclContext *MemberContext, bool EnteringContext, const ObjCObjectPointerType *OPT) { + // Always let the ExternalSource have the first chance at correction, even + // if we would otherwise have given up. + if (ExternalSource) { + if (TypoCorrection Correction = ExternalSource->CorrectTypo( + TypoName, LookupKind, S, SS, CCC, MemberContext, EnteringContext, OPT)) + return Correction; + } + if (Diags.hasFatalErrorOccurred() || !getLangOpts().SpellChecking) return TypoCorrection(); diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index fed775ef02..479b36f84c 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -19,4 +19,5 @@ if(CLANG_ENABLE_REWRITER) add_subdirectory(AST) add_subdirectory(Tooling) add_subdirectory(Format) + add_subdirectory(Sema) endif() diff --git a/unittests/Makefile b/unittests/Makefile index e01a6ac463..542863e591 100644 --- a/unittests/Makefile +++ b/unittests/Makefile @@ -23,7 +23,7 @@ PARALLEL_DIRS += Format endif ifeq ($(ENABLE_CLANG_REWRITER),1) -PARALLEL_DIRS += ASTMatchers AST Tooling +PARALLEL_DIRS += ASTMatchers AST Tooling Sema endif ifeq ($(ENABLE_CLANG_STATIC_ANALYZER),1) |