CIndex: Fix diagnostic callback to not return SourceLocations with a reference to a temporary LangOptions object.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94928 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2010-01-30 23:31:49 +00:00
Родитель 35b8440f61
Коммит 4914612675
2 изменённых файлов: 21 добавлений и 11 удалений

Просмотреть файл

@ -27,7 +27,7 @@ namespace {
/// \brief The storage behind a CXDiagnostic
struct CXStoredDiagnostic {
/// \brief The translation unit this diagnostic came from.
const LangOptions &LangOpts;
const LangOptions *LangOptsPtr;
/// \brief The severity level of this diagnostic.
Diagnostic::Level Level;
@ -44,15 +44,23 @@ CIndexDiagnosticClient::~CIndexDiagnosticClient() { }
void CIndexDiagnosticClient::BeginSourceFile(const LangOptions &LangOpts,
const Preprocessor *PP) {
this->LangOpts = LangOpts;
assert(!LangOptsPtr && "Invalid state!");
LangOptsPtr = &LangOpts;
}
void CIndexDiagnosticClient::EndSourceFile() {
assert(LangOptsPtr && "Invalid state!");
LangOptsPtr = 0;
}
void CIndexDiagnosticClient::HandleDiagnostic(Diagnostic::Level DiagLevel,
const DiagnosticInfo &Info) {
if (!Callback)
return;
CXStoredDiagnostic Stored = { this->LangOpts, DiagLevel, Info };
assert((LangOptsPtr || Info.getLocation().isInvalid()) &&
"Missing language options with located diagnostic!");
CXStoredDiagnostic Stored = { this->LangOptsPtr, DiagLevel, Info };
Callback(&Stored, ClientData);
}
@ -84,7 +92,7 @@ CXSourceLocation clang_getDiagnosticLocation(CXDiagnostic Diag) {
return clang_getNullLocation();
return translateSourceLocation(StoredDiag->Info.getLocation().getManager(),
StoredDiag->LangOpts,
*StoredDiag->LangOptsPtr,
StoredDiag->Info.getLocation());
}
@ -118,7 +126,7 @@ void clang_getDiagnosticRanges(CXDiagnostic Diag,
for (unsigned I = 0; I != N; ++I)
(*Ranges)[I] = translateSourceRange(
StoredDiag->Info.getLocation().getManager(),
StoredDiag->LangOpts,
*StoredDiag->LangOptsPtr,
StoredDiag->Info.getRange(I));
}
@ -167,7 +175,7 @@ CXString clang_getDiagnosticFixItInsertion(CXDiagnostic Diag,
if (Location && StoredDiag->Info.getLocation().isValid())
*Location = translateSourceLocation(
StoredDiag->Info.getLocation().getManager(),
StoredDiag->LangOpts,
*StoredDiag->LangOptsPtr,
Hint.InsertionLoc);
return CIndexer::createCXString(Hint.CodeToInsert);
}
@ -182,7 +190,7 @@ CXSourceRange clang_getDiagnosticFixItRemoval(CXDiagnostic Diag,
const CodeModificationHint &Hint
= StoredDiag->Info.getCodeModificationHint(FixIt);
return translateSourceRange(StoredDiag->Info.getLocation().getManager(),
StoredDiag->LangOpts,
*StoredDiag->LangOptsPtr,
Hint.RemoveRange);
}
@ -205,7 +213,7 @@ CXString clang_getDiagnosticFixItReplacement(CXDiagnostic Diag,
= StoredDiag->Info.getCodeModificationHint(FixIt);
if (Range)
*Range = translateSourceRange(StoredDiag->Info.getLocation().getManager(),
StoredDiag->LangOpts,
*StoredDiag->LangOptsPtr,
Hint.RemoveRange);
return CIndexer::createCXString(Hint.CodeToInsert);
}

Просмотреть файл

@ -34,18 +34,20 @@ class Preprocessor;
class CIndexDiagnosticClient : public DiagnosticClient {
CXDiagnosticCallback Callback;
CXClientData ClientData;
LangOptions LangOpts;
const LangOptions *LangOptsPtr;
public:
CIndexDiagnosticClient(CXDiagnosticCallback Callback,
CXClientData ClientData)
: Callback(Callback), ClientData(ClientData), LangOpts() { }
: Callback(Callback), ClientData(ClientData), LangOptsPtr(0) { }
virtual ~CIndexDiagnosticClient();
virtual void BeginSourceFile(const LangOptions &LangOpts,
const Preprocessor *PP);
virtual void EndSourceFile();
virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
const DiagnosticInfo &Info);
};