From dd66277c36af442460c60dc993b41b831ee28973 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 28 Jan 2019 14:01:55 +0000 Subject: [clangd] Suggest adding missing includes for incomplete type diagnostics. Summary: This enables clangd to intercept compiler diagnostics and attach fixes (e.g. by querying index). This patch adds missing includes for incomplete types e.g. member access into class with only forward declaration. This would allow adding missing includes for user-typed symbol names that are missing declarations (e.g. typos) in the future. Reviewers: sammccall Reviewed By: sammccall Subscribers: mgorny, ilya-biryukov, javed.absar, MaskRay, jkorous, mgrang, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D56903 llvm-svn: 352361 --- clang-tools-extra/clangd/IncludeFixer.h | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 clang-tools-extra/clangd/IncludeFixer.h (limited to 'clang-tools-extra/clangd/IncludeFixer.h') diff --git a/clang-tools-extra/clangd/IncludeFixer.h b/clang-tools-extra/clangd/IncludeFixer.h new file mode 100644 index 00000000000..740710cf4ea --- /dev/null +++ b/clang-tools-extra/clangd/IncludeFixer.h @@ -0,0 +1,54 @@ +//===--- IncludeFixer.h ------------------------------------------*- C++-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDE_FIXER_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDE_FIXER_H + +#include "Diagnostics.h" +#include "Headers.h" +#include "index/Index.h" +#include "clang/AST/Type.h" +#include "clang/Basic/Diagnostic.h" +#include "llvm/ADT/StringRef.h" +#include + +namespace clang { +namespace clangd { + +/// Attempts to recover from error diagnostics by suggesting include insertion +/// fixes. For example, member access into incomplete type can be fixes by +/// include headers with the definition. +class IncludeFixer { +public: + IncludeFixer(llvm::StringRef File, std::shared_ptr Inserter, + const SymbolIndex &Index, unsigned IndexRequestLimit) + : File(File), Inserter(std::move(Inserter)), Index(Index), + IndexRequestLimit(IndexRequestLimit) {} + + /// Returns include insertions that can potentially recover the diagnostic. + std::vector fix(DiagnosticsEngine::Level DiagLevel, + const clang::Diagnostic &Info) const; + +private: + /// Attempts to recover diagnostic caused by an incomplete type \p T. + std::vector fixIncompleteType(const Type &T) const; + + /// Generates header insertion fixes for \p Sym. + std::vector fixesForSymbol(const Symbol &Sym) const; + + std::string File; + std::shared_ptr Inserter; + const SymbolIndex &Index; + const unsigned IndexRequestLimit; // Make at most 5 index requests. + mutable unsigned IndexRequestCount = 0; +}; + +} // namespace clangd +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_INCLUDE_FIXER_H -- cgit v1.2.3