Add the initial TypoExpr AST node for delayed typo correction.
llvm-svn: 220692
This commit is contained in:
parent
d2287c3942
commit
e1f49d545d
|
@ -2240,6 +2240,7 @@ DEF_TRAVERSE_STMT(CapturedStmt, { TRY_TO(TraverseDecl(S->getCapturedDecl())); })
|
|||
|
||||
DEF_TRAVERSE_STMT(CXXOperatorCallExpr, {})
|
||||
DEF_TRAVERSE_STMT(OpaqueValueExpr, {})
|
||||
DEF_TRAVERSE_STMT(TypoExpr, {})
|
||||
DEF_TRAVERSE_STMT(CUDAKernelCallExpr, {})
|
||||
|
||||
// These operators (all of them) do not need any action except
|
||||
|
|
|
@ -4846,6 +4846,24 @@ public:
|
|||
return child_range(SubExprs, SubExprs+NumSubExprs);
|
||||
}
|
||||
};
|
||||
|
||||
/// TypoExpr - Internal placeholder for expressions where typo correction
|
||||
/// still needs to be performed and/or an error diagnostic emitted.
|
||||
class TypoExpr : public Expr {
|
||||
public:
|
||||
TypoExpr(QualType T)
|
||||
: Expr(TypoExprClass, T, VK_LValue, OK_Ordinary,
|
||||
/*isTypeDependent*/ true,
|
||||
/*isValueDependent*/ true,
|
||||
/*isInstantiationDependent*/ true,
|
||||
/*containsUnexpandedParameterPack*/ false) {
|
||||
assert(T->isDependentType() && "TypoExpr given a non-dependent type");
|
||||
}
|
||||
|
||||
child_range children() { return child_range(); }
|
||||
SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); }
|
||||
SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); }
|
||||
};
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2262,6 +2262,7 @@ DEF_TRAVERSE_STMT(CapturedStmt, { TRY_TO(TraverseDecl(S->getCapturedDecl())); })
|
|||
|
||||
DEF_TRAVERSE_STMT(CXXOperatorCallExpr, {})
|
||||
DEF_TRAVERSE_STMT(OpaqueValueExpr, {})
|
||||
DEF_TRAVERSE_STMT(TypoExpr, {})
|
||||
DEF_TRAVERSE_STMT(CUDAKernelCallExpr, {})
|
||||
|
||||
// These operators (all of them) do not need any action except
|
||||
|
|
|
@ -163,6 +163,7 @@ def ShuffleVectorExpr : DStmt<Expr>;
|
|||
def ConvertVectorExpr : DStmt<Expr>;
|
||||
def BlockExpr : DStmt<Expr>;
|
||||
def OpaqueValueExpr : DStmt<Expr>;
|
||||
def TypoExpr : DStmt<Expr>;
|
||||
|
||||
// Microsoft Extensions.
|
||||
def MSPropertyRefExpr : DStmt<Expr>;
|
||||
|
|
|
@ -149,6 +149,9 @@ public:
|
|||
/// in the consumer.
|
||||
TypoCorrection getNextCorrection();
|
||||
|
||||
ASTContext &getContext() const { return SemaRef.Context; }
|
||||
const LookupResult &getLookupResult() const { return Result; }
|
||||
|
||||
private:
|
||||
class NamespaceSpecifierSet {
|
||||
struct SpecifierInfo {
|
||||
|
|
|
@ -2886,6 +2886,7 @@ bool Expr::HasSideEffects(const ASTContext &Ctx) const {
|
|||
case PackExpansionExprClass:
|
||||
case SubstNonTypeTemplateParmPackExprClass:
|
||||
case FunctionParmPackExprClass:
|
||||
case TypoExprClass:
|
||||
llvm_unreachable("shouldn't see dependent / unresolved nodes here");
|
||||
|
||||
case DeclRefExprClass:
|
||||
|
|
|
@ -124,10 +124,11 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
|
|||
case Expr::ObjCPropertyRefExprClass:
|
||||
// C++ [expr.typeid]p1: The result of a typeid expression is an lvalue of...
|
||||
case Expr::CXXTypeidExprClass:
|
||||
// Unresolved lookups get classified as lvalues.
|
||||
// Unresolved lookups and uncorrected typos get classified as lvalues.
|
||||
// FIXME: Is this wise? Should they get their own kind?
|
||||
case Expr::UnresolvedLookupExprClass:
|
||||
case Expr::UnresolvedMemberExprClass:
|
||||
case Expr::TypoExprClass:
|
||||
case Expr::CXXDependentScopeMemberExprClass:
|
||||
case Expr::DependentScopeDeclRefExprClass:
|
||||
// ObjC instance variables are lvalues
|
||||
|
|
|
@ -8625,6 +8625,7 @@ static ICEDiag CheckICE(const Expr* E, const ASTContext &Ctx) {
|
|||
case Expr::CXXDeleteExprClass:
|
||||
case Expr::CXXPseudoDestructorExprClass:
|
||||
case Expr::UnresolvedLookupExprClass:
|
||||
case Expr::TypoExprClass:
|
||||
case Expr::DependentScopeDeclRefExprClass:
|
||||
case Expr::CXXConstructExprClass:
|
||||
case Expr::CXXStdInitializerListExprClass:
|
||||
|
|
|
@ -2627,6 +2627,7 @@ recurse:
|
|||
case Expr::ParenListExprClass:
|
||||
case Expr::LambdaExprClass:
|
||||
case Expr::MSPropertyRefExprClass:
|
||||
case Expr::TypoExprClass: // This should no longer exist in the AST by now.
|
||||
llvm_unreachable("unexpected statement kind");
|
||||
|
||||
// FIXME: invent manglings for all these.
|
||||
|
|
|
@ -2166,6 +2166,11 @@ void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
|
|||
PrintExpr(Node->getSourceExpr());
|
||||
}
|
||||
|
||||
void StmtPrinter::VisitTypoExpr(TypoExpr *Node) {
|
||||
// TODO: Print something reasonable for a TypoExpr, if necessary.
|
||||
assert(false && "Cannot print TypoExpr nodes");
|
||||
}
|
||||
|
||||
void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
|
||||
OS << "__builtin_astype(";
|
||||
PrintExpr(Node->getSrcExpr());
|
||||
|
|
|
@ -1242,6 +1242,10 @@ void StmtProfiler::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
|
|||
VisitExpr(E);
|
||||
}
|
||||
|
||||
void StmtProfiler::VisitTypoExpr(const TypoExpr *E) {
|
||||
VisitExpr(E);
|
||||
}
|
||||
|
||||
void StmtProfiler::VisitObjCStringLiteral(const ObjCStringLiteral *S) {
|
||||
VisitExpr(S);
|
||||
}
|
||||
|
|
|
@ -1068,6 +1068,7 @@ CanThrowResult Sema::canThrow(const Expr *E) {
|
|||
case Expr::UnaryExprOrTypeTraitExprClass:
|
||||
case Expr::UnresolvedLookupExprClass:
|
||||
case Expr::UnresolvedMemberExprClass:
|
||||
case Expr::TypoExprClass:
|
||||
// FIXME: Can any of the above throw? If so, when?
|
||||
return CT_Cannot;
|
||||
|
||||
|
|
|
@ -7321,6 +7321,12 @@ TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
|
|||
return E;
|
||||
}
|
||||
|
||||
template<typename Derived>
|
||||
ExprResult
|
||||
TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
|
||||
return E;
|
||||
}
|
||||
|
||||
template<typename Derived>
|
||||
ExprResult
|
||||
TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
|
||||
|
|
|
@ -1588,6 +1588,10 @@ void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
|
|||
E->Loc = ReadSourceLocation(Record, Idx);
|
||||
}
|
||||
|
||||
void ASTStmtReader::VisitTypoExpr(TypoExpr *E) {
|
||||
llvm_unreachable("Cannot read TypoExpr nodes");
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Microsoft Expressions and Statements
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -1588,6 +1588,12 @@ void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
|
|||
Code = serialization::EXPR_OPAQUE_VALUE;
|
||||
}
|
||||
|
||||
void ASTStmtWriter::VisitTypoExpr(TypoExpr *E) {
|
||||
VisitExpr(E);
|
||||
// TODO: Figure out sane writer behavior for a TypoExpr, if necessary
|
||||
assert(false && "Cannot write TypoExpr nodes");
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// CUDA Expressions and Statements.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -760,6 +760,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|||
case Stmt::ExpressionTraitExprClass:
|
||||
case Stmt::UnresolvedLookupExprClass:
|
||||
case Stmt::UnresolvedMemberExprClass:
|
||||
case Stmt::TypoExprClass:
|
||||
case Stmt::CXXNoexceptExprClass:
|
||||
case Stmt::PackExpansionExprClass:
|
||||
case Stmt::SubstNonTypeTemplateParmPackExprClass:
|
||||
|
|
|
@ -469,6 +469,7 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent,
|
|||
case Stmt::SubstNonTypeTemplateParmPackExprClass:
|
||||
case Stmt::FunctionParmPackExprClass:
|
||||
case Stmt::UnresolvedLookupExprClass:
|
||||
case Stmt::TypoExprClass: // A typo could actually be a DeclRef or a MemberRef
|
||||
K = CXCursor_DeclRefExpr;
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue