[cfe-dev] [clang-tools-extra] A Clang extra tool to find missing includes
Vassil Vassilev
vvasilev at cern.ch
Tue Oct 15 06:31:57 PDT 2013
Hi Luke,
That sounds like a very interesting tool to me. Especially for more
interactive use cases like ours.
In cling we would like on a missing/incomplete name to #include the
header file (if exists) that provides the definition.
If you are interested in such use cases I will be happy to discuss,
adapt and use your tool within cling's context.
Vassil
On 9/10/13 8:49 PM, Luke Zarko wrote:
> Crossposting from cfe-commits, as suggested.
>
> The code is up at http://llvm-reviews.chandlerc.com/D1538 .
>
> This is a tool that uses an external database, like a ctags file, to
> suggest missing includes to fix a broken translation unit. It can
> produce diagnostics like:
>
> TESTFILE:6:9: note: Inferring that M names a namespace.
> using ::M::X;
> ^
> TESTFILE:6:12: note: For M::X, include m_x_empty_class.h.
> using ::M::X;
> ^
>
> or:
>
> TESTFILE:6:1: note: For M::Q::Y, include m_q_y_empty_class.h.
> Y a;
> ^
> TESTFILE:6:1: note: Alternately, for N::Q::Y, include
> n_q_y_empty_class.h.
>
> It works by looping for a bounded number of times. On each iteration,
> the broken TU is parsed and passed through semantic analysis. When
> typos are encountered or when an incomplete type is detected where a
> complete type is required, the database is consulted to try and find a
> header with an appropriate declaration or definition. The header is
> inserted into the TU (currently using a fixed formatting rule).
>
> The primary components of the tool and their roles are:
>
> SemaSearchPlugin: An interface to a semantic database providing
> name-to-definition-file queries and limited name-to-kind (here,
> namespace) queries. It's useful to know if some fully-qualified name
> points to a namespace because it allows the tool to 'fake out' missing
> namespace declarations without confusing them with static members
> (Foo::Bar vs ClassFoo::InnerClass::Bar). The tool does this when a
> typo correction hook isn't able to find a name during the
> Sema::LookupNestedNameSpecifierName LookupKind.
>
> CtagsSemaSearchPlugin: A specialization for SemaSearchPlugin that
> works over Exuberant Ctags files. (Parsing these files is handled by
> the readtags library.)
>
> FileTracker: Keeps track of data associated with a particular TU being
> fixed across tool iterations. Holds a MemoryBuffer that contains the
> most recent version of the file that was rewritten (if rewriting
> occurred).
>
> FyiAction: Hooks MaybeDiagnoseMissingCompleteType and CorrectTypo
> calls from Sema.
>
> In the former case, since a complete type has a fully qualified name,
> a simple query can be made on the SemaSearchPlugin (eg, if we see that
> Foo::Bar is incomplete in a context where a complete type is
> necessary, we can query for that fully-qualified name). The database
> may contain multiple entries for a definition site; ranking these is
> the plugin's duty. The highest-ranked suggestion is used to add an
> include, while other suggestions may be displayed as diagnostic notes.
> (The ctags plugin simply returns an unordered vector.)
>
> In the latter case, the mapping between (un)qualified name and
> fully-qualified name is ambiguous. The tool searches DeclContexts from
> innermost to outermost, appending the typo's NestedNameSpecifier as
> appropriate (and taking care to first expand namespace aliases). If it
> fails a lookup in the database, it will then (as a heuristic) look in
> the namespaces of available 'using' declarations. Finally, it will try
> simple unqualified lookup.
>
> FyiDiagnosticHooks: Registers custom diagnostics, acts as a diagnostic
> sink to collect diagnostics (so that intermediate steps in the outer
> tool loop don't litter the terminal), and flags some warnings and
> notes as errors to force the tool to spin around again--for example,
> if the compiler generates a diag::warn_delete_incomplete, the tool
> should treat this as seriously as any other incomplete-type error.
>
> FyiPreprocessorHooks: Listens for file-entered and file-left events,
> watches for inclusion directives, and keeps track of insertion
> positions in target TUs. The rewrite and header-equality mechanisms
> currently assume a particular programming style (system first, then
> qualified-from-project-root) and that the missing headers will be quoted.
>
> FyiActionFactory: Manages the map from filenames to FileTrackers and
> the global iteration count. FyiActionFactory can save out changes to
> files (optionally with new suffixes or after moving the old file to a
> backup).
>
> FindYourIncludes: Contains the tool's entry point.
>
> More information on the various components is available in Doxygen
> comments throughout the source code.
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131015/ebf6c7a5/attachment.html>
More information about the cfe-dev
mailing list