xref: /aosp_15_r20/external/clang/include/clang/Sema/SemaFixItUtils.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
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