<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Hi Luke,<br>
That sounds like a very interesting tool to me. Especially for
more interactive use cases like ours.<br>
In cling we would like on a missing/incomplete name to #include
the header file (if exists) that provides the definition.<br>
<br>
If you are interested in such use cases I will be happy to
discuss, adapt and use your tool within cling's context.<br>
Vassil<br>
On 9/10/13 8:49 PM, Luke Zarko wrote:<br>
</div>
<blockquote
cite="mid:CAJK-SVyuZ0hFAPXq83qP05T=O2vwmj4yHb+_A3SoFsLbAih+rA@mail.gmail.com"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<div dir="ltr">Crossposting from cfe-commits, as suggested.<br>
<br>
The code is up at <a moz-do-not-send="true"
href="http://llvm-reviews.chandlerc.com/D1538">http://llvm-reviews.chandlerc.com/D1538</a>
.<br>
<br>
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:<br>
<br>
TESTFILE:6:9: note: Inferring that M names a namespace.<br>
using ::M::X;<br>
^<br>
TESTFILE:6:12: note: For M::X, include m_x_empty_class.h.<br>
using ::M::X;<br>
^<br>
<br>
or:<br>
<br>
TESTFILE:6:1: note: For M::Q::Y, include m_q_y_empty_class.h.<br>
Y a;<br>
^<br>
TESTFILE:6:1: note: Alternately, for N::Q::Y, include
n_q_y_empty_class.h.<br>
<br>
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).<br>
<br>
The primary components of the tool and their roles are:<br>
<br>
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.<br>
<br>
CtagsSemaSearchPlugin: A specialization for SemaSearchPlugin
that works over Exuberant Ctags files. (Parsing these files is
handled by the readtags library.)<br>
<br>
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).<br>
<br>
FyiAction: Hooks MaybeDiagnoseMissingCompleteType and
CorrectTypo calls from Sema.<br>
<br>
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.)<br>
<br>
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.<br>
<br>
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.<br>
<br>
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.<br>
<br>
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).<br>
<br>
FindYourIncludes: Contains the tool's entry point.<br>
<br>
More information on the various components is available in
Doxygen comments throughout the source code.<br>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
cfe-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a>
</pre>
</blockquote>
<br>
</body>
</html>