replace a dirty hack with a clean solution. Too bad we can't
use Blocks for our callbacks ;-) llvm-svn: 65083
This commit is contained in:
parent
68abaa984d
commit
cf868c458c
|
@ -283,7 +283,8 @@ public:
|
|||
/// ObjCQualifiedInterfaceType type for the given interface decl and
|
||||
/// the conforming protocol list.
|
||||
QualType getObjCQualifiedInterfaceType(ObjCInterfaceDecl *Decl,
|
||||
ObjCProtocolDecl **ProtocolList, unsigned NumProtocols);
|
||||
ObjCProtocolDecl **ProtocolList,
|
||||
unsigned NumProtocols);
|
||||
|
||||
/// getObjCQualifiedIdType - Return an ObjCQualifiedIdType for a
|
||||
/// given 'id' and conforming protocol list.
|
||||
|
|
|
@ -125,7 +125,9 @@ private:
|
|||
typedef void (*ArgToStringFnTy)(ArgumentKind Kind, intptr_t Val,
|
||||
const char *Modifier, unsigned ModifierLen,
|
||||
const char *Argument, unsigned ArgumentLen,
|
||||
llvm::SmallVectorImpl<char> &Output);
|
||||
llvm::SmallVectorImpl<char> &Output,
|
||||
void *Cookie);
|
||||
void *ArgToStringCookie;
|
||||
ArgToStringFnTy ArgToStringFn;
|
||||
public:
|
||||
explicit Diagnostic(DiagnosticClient *client = 0);
|
||||
|
@ -202,11 +204,13 @@ public:
|
|||
const char *Modifier, unsigned ModLen,
|
||||
const char *Argument, unsigned ArgLen,
|
||||
llvm::SmallVectorImpl<char> &Output) const {
|
||||
ArgToStringFn(Kind, Val, Modifier, ModLen, Argument, ArgLen, Output);
|
||||
ArgToStringFn(Kind, Val, Modifier, ModLen, Argument, ArgLen, Output,
|
||||
ArgToStringCookie);
|
||||
}
|
||||
|
||||
void SetArgToStringFn(ArgToStringFnTy Fn) {
|
||||
void SetArgToStringFn(ArgToStringFnTy Fn, void *Cookie) {
|
||||
ArgToStringFn = Fn;
|
||||
ArgToStringCookie = Cookie;
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
|
@ -175,7 +175,8 @@ namespace clang {
|
|||
static void DummyArgToStringFn(Diagnostic::ArgumentKind AK, intptr_t QT,
|
||||
const char *Modifier, unsigned ML,
|
||||
const char *Argument, unsigned ArgLen,
|
||||
llvm::SmallVectorImpl<char> &Output) {
|
||||
llvm::SmallVectorImpl<char> &Output,
|
||||
void *Cookie) {
|
||||
const char *Str = "<can't format argument>";
|
||||
Output.append(Str, Str+strlen(Str));
|
||||
}
|
||||
|
@ -199,6 +200,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
|
|||
LastDiagLevel = Fatal;
|
||||
|
||||
ArgToStringFn = DummyArgToStringFn;
|
||||
ArgToStringCookie = 0;
|
||||
}
|
||||
|
||||
Diagnostic::~Diagnostic() {
|
||||
|
|
|
@ -24,7 +24,9 @@ using namespace clang;
|
|||
static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t Val,
|
||||
const char *Modifier, unsigned ModLen,
|
||||
const char *Argument, unsigned ArgLen,
|
||||
llvm::SmallVectorImpl<char> &Output) {
|
||||
llvm::SmallVectorImpl<char> &Output,
|
||||
void *Cookie) {
|
||||
ASTContext &Context = *static_cast<ASTContext*>(Cookie);
|
||||
|
||||
std::string S;
|
||||
if (Kind == Diagnostic::ak_qualtype) {
|
||||
|
@ -47,8 +49,14 @@ static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t Val,
|
|||
// it will turn into an attribute mess. People want their "vec4".
|
||||
!isa<VectorType>(DesugaredTy) &&
|
||||
|
||||
// Don't desugar objc types. FIXME: THIS IS A HACK.
|
||||
S != "id" && S != "Class") {
|
||||
// Don't desugar magic Objective-C types.
|
||||
Ty.getUnqualifiedType() != Context.getObjCIdType() &&
|
||||
Ty.getUnqualifiedType() != Context.getObjCSelType() &&
|
||||
Ty.getUnqualifiedType() != Context.getObjCProtoType() &&
|
||||
Ty.getUnqualifiedType() != Context.getObjCClassType() &&
|
||||
|
||||
// Not va_list.
|
||||
Ty.getUnqualifiedType() != Context.getBuiltinVaListType()) {
|
||||
S = "'"+S+"' (aka '";
|
||||
S += DesugaredTy.getAsString();
|
||||
S += "')";
|
||||
|
@ -165,7 +173,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer)
|
|||
FieldCollector.reset(new CXXFieldCollector());
|
||||
|
||||
// Tell diagnostics how to render things from the AST library.
|
||||
PP.getDiagnostics().SetArgToStringFn(ConvertArgToStringFn);
|
||||
PP.getDiagnostics().SetArgToStringFn(ConvertArgToStringFn, &Context);
|
||||
}
|
||||
|
||||
/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
|
||||
|
|
Loading…
Reference in New Issue