1*67e74705SXin Li //===--- SemaFixItUtils.h - Sema FixIts -----------------------------------===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li // 10*67e74705SXin Li // This file defines helper classes for generation of Sema FixItHints. 11*67e74705SXin Li // 12*67e74705SXin Li //===----------------------------------------------------------------------===// 13*67e74705SXin Li #ifndef LLVM_CLANG_SEMA_SEMAFIXITUTILS_H 14*67e74705SXin Li #define LLVM_CLANG_SEMA_SEMAFIXITUTILS_H 15*67e74705SXin Li 16*67e74705SXin Li #include "clang/AST/Expr.h" 17*67e74705SXin Li 18*67e74705SXin Li namespace clang { 19*67e74705SXin Li 20*67e74705SXin Li enum OverloadFixItKind { 21*67e74705SXin Li OFIK_Undefined = 0, 22*67e74705SXin Li OFIK_Dereference, 23*67e74705SXin Li OFIK_TakeAddress, 24*67e74705SXin Li OFIK_RemoveDereference, 25*67e74705SXin Li OFIK_RemoveTakeAddress 26*67e74705SXin Li }; 27*67e74705SXin Li 28*67e74705SXin Li class Sema; 29*67e74705SXin Li 30*67e74705SXin Li /// The class facilities generation and storage of conversion FixIts. Hints for 31*67e74705SXin Li /// new conversions are added using TryToFixConversion method. The default type 32*67e74705SXin Li /// conversion checker can be reset. 33*67e74705SXin Li struct ConversionFixItGenerator { 34*67e74705SXin Li /// Performs a simple check to see if From type can be converted to To type. 35*67e74705SXin Li static bool compareTypesSimple(CanQualType From, 36*67e74705SXin Li CanQualType To, 37*67e74705SXin Li Sema &S, 38*67e74705SXin Li SourceLocation Loc, 39*67e74705SXin Li ExprValueKind FromVK); 40*67e74705SXin Li 41*67e74705SXin Li /// The list of Hints generated so far. 42*67e74705SXin Li std::vector<FixItHint> Hints; 43*67e74705SXin Li 44*67e74705SXin Li /// The number of Conversions fixed. This can be different from the size 45*67e74705SXin Li /// of the Hints vector since we allow multiple FixIts per conversion. 46*67e74705SXin Li unsigned NumConversionsFixed; 47*67e74705SXin Li 48*67e74705SXin Li /// The type of fix applied. If multiple conversions are fixed, corresponds 49*67e74705SXin Li /// to the kid of the very first conversion. 50*67e74705SXin Li OverloadFixItKind Kind; 51*67e74705SXin Li 52*67e74705SXin Li typedef bool (*TypeComparisonFuncTy) (const CanQualType FromTy, 53*67e74705SXin Li const CanQualType ToTy, 54*67e74705SXin Li Sema &S, 55*67e74705SXin Li SourceLocation Loc, 56*67e74705SXin Li ExprValueKind FromVK); 57*67e74705SXin Li /// The type comparison function used to decide if expression FromExpr of 58*67e74705SXin Li /// type FromTy can be converted to ToTy. For example, one could check if 59*67e74705SXin Li /// an implicit conversion exists. Returns true if comparison exists. 60*67e74705SXin Li TypeComparisonFuncTy CompareTypes; 61*67e74705SXin Li ConversionFixItGeneratorConversionFixItGenerator62*67e74705SXin Li ConversionFixItGenerator(TypeComparisonFuncTy Foo): NumConversionsFixed(0), 63*67e74705SXin Li Kind(OFIK_Undefined), 64*67e74705SXin Li CompareTypes(Foo) {} 65*67e74705SXin Li ConversionFixItGeneratorConversionFixItGenerator66*67e74705SXin Li ConversionFixItGenerator(): NumConversionsFixed(0), 67*67e74705SXin Li Kind(OFIK_Undefined), 68*67e74705SXin Li CompareTypes(compareTypesSimple) {} 69*67e74705SXin Li 70*67e74705SXin Li /// Resets the default conversion checker method. setConversionCheckerConversionFixItGenerator71*67e74705SXin Li void setConversionChecker(TypeComparisonFuncTy Foo) { 72*67e74705SXin Li CompareTypes = Foo; 73*67e74705SXin Li } 74*67e74705SXin Li 75*67e74705SXin Li /// If possible, generates and stores a fix for the given conversion. 76*67e74705SXin Li bool tryToFixConversion(const Expr *FromExpr, 77*67e74705SXin Li const QualType FromQTy, const QualType ToQTy, 78*67e74705SXin Li Sema &S); 79*67e74705SXin Li clearConversionFixItGenerator80*67e74705SXin Li void clear() { 81*67e74705SXin Li Hints.clear(); 82*67e74705SXin Li NumConversionsFixed = 0; 83*67e74705SXin Li } 84*67e74705SXin Li isNullConversionFixItGenerator85*67e74705SXin Li bool isNull() { 86*67e74705SXin Li return (NumConversionsFixed == 0); 87*67e74705SXin Li } 88*67e74705SXin Li }; 89*67e74705SXin Li 90*67e74705SXin Li } // endof namespace clang 91*67e74705SXin Li #endif 92