forked from OSchip/llvm-project
Add the partially implemented PartialDiagnostic class.
llvm-svn: 80106
This commit is contained in:
parent
45a6b06a45
commit
6885d33753
|
@ -378,6 +378,7 @@
|
|||
1A869AA70BA21ABA008DA07A /* LiteralSupport.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = LiteralSupport.cpp; sourceTree = "<group>"; };
|
||||
1AA1D91610125DE30078DEBC /* RecordLayoutBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = RecordLayoutBuilder.cpp; path = lib/AST/RecordLayoutBuilder.cpp; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1AA1D91710125DE30078DEBC /* RecordLayoutBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = RecordLayoutBuilder.h; path = lib/AST/RecordLayoutBuilder.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1AB290021045858B00FE33D8 /* PartialDiagnostic.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; path = PartialDiagnostic.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1ABC36930C7A4BDC006DB0AB /* CGBuiltin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = CGBuiltin.cpp; path = lib/CodeGen/CGBuiltin.cpp; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1ADF47AE0F782C3200E48A8A /* SemaTemplateInstantiateDecl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = SemaTemplateInstantiateDecl.cpp; path = lib/Sema/SemaTemplateInstantiateDecl.cpp; sourceTree = "<group>"; tabWidth = 2; };
|
||||
1AE4EE3B103B89CA00888A23 /* TreeTransform.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = TreeTransform.h; path = lib/Sema/TreeTransform.h; sourceTree = "<group>"; tabWidth = 2; };
|
||||
|
@ -1365,6 +1366,7 @@
|
|||
9063F2280F9E911F002F7251 /* OnDiskHashTable.h */,
|
||||
DE8824560ED1244600CBC30A /* OperatorKinds.def */,
|
||||
DE8824530ED1243E00CBC30A /* OperatorKinds.h */,
|
||||
1AB290021045858B00FE33D8 /* PartialDiagnostic.h */,
|
||||
DEAABDF70F5F477C0098928A /* PrettyStackTrace.h */,
|
||||
DED7D7350A524295003AD0FB /* SourceLocation.h */,
|
||||
DED7D7360A524295003AD0FB /* SourceManager.h */,
|
||||
|
|
|
@ -24,11 +24,12 @@ namespace llvm {
|
|||
}
|
||||
|
||||
namespace clang {
|
||||
class DiagnosticClient;
|
||||
class SourceRange;
|
||||
class DiagnosticBuilder;
|
||||
class DiagnosticClient;
|
||||
class IdentifierInfo;
|
||||
class LangOptions;
|
||||
class PartialDiagnostic;
|
||||
class SourceRange;
|
||||
|
||||
// Import the diagnostic enums themselves.
|
||||
namespace diag {
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
#ifndef LLVM_CLANG_PARTIALDIAGNOSTIC_H
|
||||
#define LLVM_CLANG_PARTIALDIAGNOSTIC_H
|
||||
|
||||
#include "clang/AST/Type.h"
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
class PartialDiagnostic {
|
||||
unsigned DiagID;
|
||||
|
||||
struct Storage {
|
||||
Storage() : NumDiagArgs(0), NumDiagRanges(0) { }
|
||||
|
||||
enum {
|
||||
/// MaxArguments - The maximum number of arguments we can hold. We
|
||||
/// currently only support up to 10 arguments (%0-%9).
|
||||
/// A single diagnostic with more than that almost certainly has to
|
||||
/// be simplified anyway.
|
||||
MaxArguments = 10
|
||||
};
|
||||
|
||||
/// NumDiagArgs - This contains the number of entries in Arguments.
|
||||
unsigned char NumDiagArgs;
|
||||
|
||||
/// NumDiagRanges - This is the number of ranges in the DiagRanges array.
|
||||
unsigned char NumDiagRanges;
|
||||
|
||||
/// DiagArgumentsKind - This is an array of ArgumentKind::ArgumentKind enum
|
||||
/// values, with one for each argument. This specifies whether the argument
|
||||
/// is in DiagArgumentsStr or in DiagArguments.
|
||||
unsigned char DiagArgumentsKind[MaxArguments];
|
||||
|
||||
/// DiagArgumentsVal - The values for the various substitution positions.
|
||||
/// This is used when the argument is not an std::string. The specific value
|
||||
/// is mangled into an intptr_t and the intepretation depends on exactly
|
||||
/// what sort of argument kind it is.
|
||||
mutable intptr_t DiagArgumentsVal[MaxArguments];
|
||||
|
||||
/// DiagRanges - The list of ranges added to this diagnostic. It currently
|
||||
/// only support 10 ranges, could easily be extended if needed.
|
||||
mutable const SourceRange *DiagRanges[10];
|
||||
};
|
||||
|
||||
mutable Storage *DiagStorage;
|
||||
|
||||
void AddTaggedVal(intptr_t V, Diagnostic::ArgumentKind Kind) const {
|
||||
assert(DiagStorage->NumDiagArgs < Storage::MaxArguments &&
|
||||
"Too many arguments to diagnostic!");
|
||||
DiagStorage->DiagArgumentsKind[DiagStorage->NumDiagArgs] = Kind;
|
||||
DiagStorage->DiagArgumentsVal[DiagStorage->NumDiagArgs++] = V;
|
||||
}
|
||||
|
||||
void AddSourceRange(const SourceRange &R) const {
|
||||
assert(DiagStorage->NumDiagRanges <
|
||||
llvm::array_lengthof(DiagStorage->DiagRanges) &&
|
||||
"Too many arguments to diagnostic!");
|
||||
DiagStorage->DiagRanges[DiagStorage->NumDiagRanges++] = &R;
|
||||
}
|
||||
|
||||
void operator=(const PartialDiagnostic &); // DO NOT IMPLEMENT
|
||||
|
||||
public:
|
||||
explicit PartialDiagnostic(unsigned DiagID)
|
||||
: DiagID(DiagID), DiagStorage(new Storage) { }
|
||||
|
||||
PartialDiagnostic(const PartialDiagnostic &Other)
|
||||
: DiagStorage(Other.DiagStorage) {
|
||||
Other.DiagStorage = 0;
|
||||
}
|
||||
|
||||
~PartialDiagnostic() {
|
||||
delete DiagStorage;
|
||||
}
|
||||
|
||||
friend const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
|
||||
QualType T) {
|
||||
PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()),
|
||||
Diagnostic::ak_qualtype);
|
||||
return PD;
|
||||
}
|
||||
|
||||
friend inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
|
||||
const SourceRange &R) {
|
||||
PD.AddSourceRange(R);
|
||||
return PD;
|
||||
}
|
||||
};
|
||||
|
||||
PartialDiagnostic PDiag(unsigned DiagID) {
|
||||
return PartialDiagnostic(DiagID);
|
||||
}
|
||||
|
||||
|
||||
} // end namespace clang
|
||||
#endif
|
Loading…
Reference in New Issue