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