[PATCH v4 0/8] Initial implementation of delayed typo correction.
Kaelyn Takata
rikka at google.com
Thu Jul 31 13:20:25 PDT 2014
This patch set adds a new node to the AST called a TypoExpr. It is used as a
placeholder to delay typo correction until a full expression is being finalized
(via Sema::ActOnFinishFullExpr), at which point a TreeTransform is run to
replace each TypoExpr by performing typo correction. This allows, for example,
to delay typo correction on a call to a class method until after the arguments
have been parsed, instead of trying to do the typo correction while looking up
the member before the parser has even reached the opening parenthesis. The
patches have been broken up such that clang builds and the tests pass after
each patch in the sequence has been applied. The first patch is included in
here despite being a simple, mechanical moving around of code (instead of
committing it directly) because it is unnecessary/useless outside of the rest
of the patch set.
v2:
* Unmunge a couple of patches that accidentally got merged together
(primarily #5 had incorrectly gotten squashed into #4).
* Pass unique_ptrs by value instead of by reference.
v3:
* Have the TypoCorrectionConsumer remember all TypoCorrections it has
returned instead of just the last one, and add the ability to restart/replay
returning those TypoCorrections.
* Rework TransformTypos to try all combinations of typo corrections when
multiple TypoExpr nodes are present within the same Expr.
* Add a helper method to TypoExpr to free the unique_ptr members once the
TypoExpr has been processed e.g by TransformTypos.
* A few other small changes in response to review feedback of patches 2 and 5.
v4:
* Rebase against ToT and resolve all merge conflicts and related changes.
* Remove layering violation in the AST library by having Sema keep track of
the Sema-specific state associated with each TypoExpr.
* Make the typo count tracking in an ExpressionEvaluationContext to be more
accurate by taking advantage of the TypoExpr state being tracked by Sema.
* Keep track of the callees that were OverloadExprs which are subsequently
resolved by TreeTransform<T>::RebuildCallExpr, and use that information when
emitting typo correction diagnostics to select the right decl for the
diagnostic note.
* Remove the overload resolution code for members that are the callee in a
CallExpr from the MemberExprTypoRecovery callback now that it is no longer
needed to emit notes on the correct decl of an overloaded method.
* Make the TypoCorrections passed to the various callbacks be const references
and have the TypoCorrectionConsumer return the current and new
TypoCorrection by const reference so that they remain immutable and replays
of the typo correction stream are always identical, now that modifying the
TypoCorrection in the recovery callback is no longer necessary to emit
correct diagnostic notes.
* Remove the expression stack tracking in the TypoExpr tree transform now that
the parent Expr no longer needs to be passed to the recovery callback.
* Submit the previous patch 7, "Add another keyword-selection flag to
CorrectionCandidateCallback", separately with its own test (r214109).
* A few other small changes in response to review feedback of patches 6 and 9.
Note that dealing with TypoExprs that weren't handled by a call to
ActOnFinishFullExpr is still missing. It will be coming in a subsequent patch
since I don't have a good reproduction for having LookupMemberExpr create a
TypoExpr that isn't subsequently dealt with by ActOnFinishFullExpr, while such
cases are common when having DiagnoseEmptyLookup call CorrectTypoDelayed on
behalf of ActOnFinishFullExpr.
(I skipped re-mailing patch 1, "Move TypoCorrectionConsumer into a header",
since it hasn't changed since the first versions of this patchset.)
Kaelyn Takata (8):
Move TypoCorrectionConsumer into a header.
Add the initial TypoExpr AST node for delayed typo correction.
Pass around CorrectionCandidateCallbacks as unique_ptrs so
TypoCorrectionConsumer can keep the callback around as long as
needed.
Have TypoCorrectionConsumer remember the TypoCorrections it returned.
Start adding the infrastructure for handling TypoExprs.
Add simple way for a CorrectionCandidateCallback to reject exact
matches of the typo.
Add a callback for recovering using a typo correction.
Wire up LookupMemberExpr to use the new TypoExpr.
include/clang/AST/DataRecursiveASTVisitor.h | 1 +
include/clang/AST/Expr.h | 18 +
include/clang/AST/RecursiveASTVisitor.h | 1 +
include/clang/Basic/StmtNodes.td | 1 +
include/clang/Parse/Parser.h | 5 +-
include/clang/Sema/Sema.h | 75 +++-
include/clang/Sema/SemaInternal.h | 181 ++++++++-
include/clang/Sema/TypoCorrection.h | 38 +-
lib/AST/Expr.cpp | 1 +
lib/AST/ExprClassification.cpp | 3 +-
lib/AST/ExprConstant.cpp | 1 +
lib/AST/ItaniumMangle.cpp | 1 +
lib/AST/StmtPrinter.cpp | 5 +
lib/AST/StmtProfile.cpp | 4 +
lib/Parse/ParseExpr.cpp | 8 +-
lib/Parse/ParseStmt.cpp | 6 +-
lib/Parse/ParseTentative.cpp | 8 +-
lib/Parse/Parser.cpp | 8 +-
lib/Sema/SemaCXXScopeSpec.cpp | 9 +-
lib/Sema/SemaDecl.cpp | 57 ++-
lib/Sema/SemaDeclCXX.cpp | 27 +-
lib/Sema/SemaDeclObjC.cpp | 21 +-
lib/Sema/SemaExceptionSpec.cpp | 1 +
lib/Sema/SemaExpr.cpp | 44 ++-
lib/Sema/SemaExprCXX.cpp | 149 +++++++
lib/Sema/SemaExprMember.cpp | 131 ++++++-
lib/Sema/SemaExprObjC.cpp | 18 +-
lib/Sema/SemaInit.cpp | 4 +-
lib/Sema/SemaLambda.cpp | 4 +-
lib/Sema/SemaLookup.cpp | 587 +++++++++++++---------------
lib/Sema/SemaOpenMP.cpp | 7 +-
lib/Sema/SemaOverload.cpp | 23 +-
lib/Sema/SemaTemplate.cpp | 17 +-
lib/Sema/SemaTemplateVariadic.cpp | 8 +-
lib/Sema/TreeTransform.h | 6 +
lib/Serialization/ASTReaderStmt.cpp | 4 +
lib/Serialization/ASTWriterStmt.cpp | 6 +
lib/StaticAnalyzer/Core/ExprEngine.cpp | 1 +
test/SemaCXX/arrow-operator.cpp | 5 +-
test/SemaCXX/typo-correction-delayed.cpp | 32 ++
test/SemaCXX/typo-correction-pt2.cpp | 2 +-
test/SemaCXX/typo-correction.cpp | 10 +-
tools/libclang/CXCursor.cpp | 1 +
43 files changed, 1057 insertions(+), 482 deletions(-)
create mode 100644 test/SemaCXX/typo-correction-delayed.cpp
--
2.0.0.526.g5318336
More information about the cfe-commits
mailing list