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