SemaFixItUtils.h revision f3546eeef1eed4661b77b93b91a29be1bf5f7d0b
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  SmallVector<FixItHint, 1> 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