• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_SEMAFIXITUTILS_H
14 #define LLVM_CLANG_SEMA_SEMAFIXITUTILS_H
15 
16 #include "clang/AST/Expr.h"
17 
18 namespace clang {
19 
20 enum OverloadFixItKind {
21   OFIK_Undefined = 0,
22   OFIK_Dereference,
23   OFIK_TakeAddress,
24   OFIK_RemoveDereference,
25   OFIK_RemoveTakeAddress
26 };
27 
28 class 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.
33 struct 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 
ConversionFixItGeneratorConversionFixItGenerator62   ConversionFixItGenerator(TypeComparisonFuncTy Foo): NumConversionsFixed(0),
63                                                       Kind(OFIK_Undefined),
64                                                       CompareTypes(Foo) {}
65 
ConversionFixItGeneratorConversionFixItGenerator66   ConversionFixItGenerator(): NumConversionsFixed(0),
67                               Kind(OFIK_Undefined),
68                               CompareTypes(compareTypesSimple) {}
69 
70   /// Resets the default conversion checker method.
setConversionCheckerConversionFixItGenerator71   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 
clearConversionFixItGenerator80   void clear() {
81     Hints.clear();
82     NumConversionsFixed = 0;
83   }
84 
isNullConversionFixItGenerator85   bool isNull() {
86     return (NumConversionsFixed == 0);
87   }
88 };
89 
90 } // endof namespace clang
91 #endif
92