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