r221735 - Create two helpers for running the typo-correction tree transform.
David Blaikie
dblaikie at gmail.com
Tue Nov 11 15:38:09 PST 2014
On Tue, Nov 11, 2014 at 3:26 PM, Kaelyn Takata <rikka at google.com> wrote:
> Author: rikka
> Date: Tue Nov 11 17:26:56 2014
> New Revision: 221735
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221735&view=rev
> Log:
> Create two helpers for running the typo-correction tree transform.
>
> One takes an Expr* and the other is a simple wrapper that takes an
> ExprResult instead, and handles checking whether the ExprResult is
> invalid.
>
> Additionally, allow an optional callback that is run on the full result
> of the tree transform, for filtering potential corrections based on the
> characteristics of the resulting expression once all of the typos have
> been replaced.
>
> Modified:
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=221735&r1=221734&r2=221735&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Tue Nov 11 17:26:56 2014
> @@ -2718,6 +2718,18 @@ public:
> bool EnteringContext = false,
> const ObjCObjectPointerType *OPT =
> nullptr);
>
> + ExprResult
> + CorrectDelayedTyposInExpr(Expr *E,
> + llvm::function_ref<ExprResult(Expr *)> Filter
> =
> + [](Expr *E) -> ExprResult { return E; });
>
Not sure: is it worth pulling this trivial lambda out into a function & use
it for the two sites here? (maybe "ExprResult::makeExprResult(Expr*)" ...
though that seems almost silly ("make" functions feel like they should be
doing template argument deduction, but that's just because that's their
most common use))
(if you're keeping it as a lambda, you could write it as "[](Expr *E) {
return ExprResult(E); }" if you think that's better
> +
> + ExprResult
> + CorrectDelayedTyposInExpr(ExprResult ER,
> + llvm::function_ref<ExprResult(Expr *)> Filter
> =
> + [](Expr *E) -> ExprResult { return E; }) {
> + return ER.isInvalid() ? ER : CorrectDelayedTyposInExpr(ER.get(),
> Filter);
> + }
> +
> void diagnoseTypo(const TypoCorrection &Correction,
> const PartialDiagnostic &TypoDiag,
> bool ErrorRecovery = true);
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=221735&r1=221734&r2=221735&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Nov 11 17:26:56 2014
> @@ -5919,6 +5919,7 @@ namespace {
> class TransformTypos : public TreeTransform<TransformTypos> {
> typedef TreeTransform<TransformTypos> BaseTransform;
>
> + llvm::function_ref<ExprResult(Expr *)> ExprFilter;
> llvm::SmallSetVector<TypoExpr *, 2> TypoExprs;
> llvm::SmallDenseMap<TypoExpr *, ExprResult, 2> TransformCache;
> llvm::SmallDenseMap<OverloadExpr *, Expr *, 4> OverloadResolution;
> @@ -5987,7 +5988,8 @@ class TransformTypos : public TreeTransf
> }
>
> public:
> - TransformTypos(Sema &SemaRef) : BaseTransform(SemaRef) {}
> + TransformTypos(Sema &SemaRef, llvm::function_ref<ExprResult(Expr *)>
> &&Filter)
>
Pass Filter by value if you're going to copy it anyway?
> + : BaseTransform(SemaRef), ExprFilter(std::move(Filter)) {}
>
> ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
> MultiExprArg Args,
> @@ -6012,6 +6014,9 @@ public:
> res = TransformExpr(E);
> error = Trap.hasErrorOccurred();
>
> + if (!(error || res.isInvalid()))
> + res = ExprFilter(res.get());
> +
> // Exit if either the transform was valid or if there were no
> TypoExprs
> // to transform that still have any untried correction candidates..
> if (!(error || res.isInvalid()) ||
> @@ -6060,6 +6065,25 @@ public:
> };
> }
>
> +ExprResult Sema::CorrectDelayedTyposInExpr(
> + Expr *E, llvm::function_ref<ExprResult(Expr *)> Filter) {
> + // If the current evaluation context indicates there are uncorrected
> typos
> + // and the current expression isn't guaranteed to not have typos, try to
> + // resolve any TypoExpr nodes that might be in the expression.
> + if (!ExprEvalContexts.empty() && ExprEvalContexts.back().NumTypos &&
> + (E->isTypeDependent() || E->isValueDependent() ||
> + E->isInstantiationDependent())) {
> + auto TyposResolved = DelayedTypos.size();
> + auto Result = TransformTypos(*this, std::move(Filter)).Transform(E);
> + TyposResolved -= DelayedTypos.size();
> + if (TyposResolved) {
> + ExprEvalContexts.back().NumTypos -= TyposResolved;
> + return Result;
> + }
> + }
> + return E;
> +}
> +
> ExprResult Sema::ActOnFinishFullExpr(Expr *FE, SourceLocation CC,
> bool DiscardedValue,
> bool IsConstexpr,
> @@ -6106,21 +6130,9 @@ ExprResult Sema::ActOnFinishFullExpr(Exp
> return ExprError();
> }
>
> - // If the current evaluation context indicates there are uncorrected
> typos
> - // and the current expression isn't guaranteed to not have typos, try to
> - // resolve any TypoExpr nodes that might be in the expression.
> - if (ExprEvalContexts.back().NumTypos &&
> - (FullExpr.get()->isTypeDependent() ||
> - FullExpr.get()->isValueDependent() ||
> - FullExpr.get()->isInstantiationDependent())) {
> - auto TyposResolved = DelayedTypos.size();
> - FullExpr = TransformTypos(*this).Transform(FullExpr.get());
> - TyposResolved -= DelayedTypos.size();
> - if (TyposResolved)
> - ExprEvalContexts.back().NumTypos -= TyposResolved;
> - if (FullExpr.isInvalid())
> - return ExprError();
> - }
> + FullExpr = CorrectDelayedTyposInExpr(FullExpr.get());
> + if (FullExpr.isInvalid())
> + return ExprError();
>
> CheckCompletedExpr(FullExpr.get(), CC, IsConstexpr);
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141111/675f537f/attachment.html>
More information about the cfe-commits
mailing list