r221735 - Create two helpers for running the typo-correction tree transform.

Kaelyn Takata rikka at google.com
Tue Nov 11 15:26:56 PST 2014


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; });
+
+  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)
+      : 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);
 





More information about the cfe-commits mailing list