// Copyright (C) 2018 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef HEADER_CHECKER_ABI_DUMPER_FAKE_DECL_SOURCE_H_ #define HEADER_CHECKER_ABI_DUMPER_FAKE_DECL_SOURCE_H_ #include <clang/Frontend/CompilerInstance.h> #include <clang/Sema/ExternalSemaSource.h> #include <clang/Sema/Sema.h> namespace header_checker { namespace dumper { // This class creates fake declarations when the compiler queries for unknown // types. class FakeDeclSource : public clang::ExternalSemaSource { private: const clang::CompilerInstance &ci_; clang::CXXRecordDecl *CreateCXXRecordDecl(const clang::DeclarationName &name, clang::DeclContext *decl_context); clang::ClassTemplateDecl * CreateClassTemplateDecl(clang::CXXRecordDecl *cxx_record_decl, clang::DeclContext *decl_context); clang::NamespaceDecl *CreateNamespaceDecl(const clang::DeclarationName &name, clang::DeclContext *decl_context); // This method creates a declaration in decl_context according to the lookup // name kind and the declaration name kind. If this method doesn't support the // kinds, it returns nullptr. clang::NamedDecl *CreateDecl(clang::Sema::LookupNameKind kind, const clang::DeclarationNameInfo &name, clang::DeclContext *decl_context); // Return the DeclContext for CorrectTypo to create a declaration in. clang::DeclContext *ResolveDeclContext(clang::DeclContext *member_context, clang::Scope *scope, clang::NestedNameSpecifier *nns); public: FakeDeclSource(const clang::CompilerInstance &ci); clang::TypoCorrection CorrectTypo(const clang::DeclarationNameInfo &typo, int lookup_kind, clang::Scope *scope, clang::CXXScopeSpec *scope_spec, clang::CorrectionCandidateCallback &ccc, clang::DeclContext *member_context, bool entering_context, const clang::ObjCObjectPointerType *opt) override; bool LookupUnqualified(clang::LookupResult &result, clang::Scope *scope) override; }; } // namespace dumper } // namespace header_checker #endif // HEADER_CHECKER_ABI_DUMPER_FAKE_DECL_SOURCE_H_