/// \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;
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);
}
return clang_getNullLocation();
return translateSourceLocation(StoredDiag->Info.getLocation().getManager(),
- StoredDiag->LangOpts,
+ *StoredDiag->LangOptsPtr,
StoredDiag->Info.getLocation());
}
for (unsigned I = 0; I != N; ++I)
(*Ranges)[I] = translateSourceRange(
StoredDiag->Info.getLocation().getManager(),
- StoredDiag->LangOpts,
+ *StoredDiag->LangOptsPtr,
StoredDiag->Info.getRange(I));
}
if (Location && StoredDiag->Info.getLocation().isValid())
*Location = translateSourceLocation(
StoredDiag->Info.getLocation().getManager(),
- StoredDiag->LangOpts,
+ *StoredDiag->LangOptsPtr,
Hint.InsertionLoc);
return CIndexer::createCXString(Hint.CodeToInsert);
}
const CodeModificationHint &Hint
= StoredDiag->Info.getCodeModificationHint(FixIt);
return translateSourceRange(StoredDiag->Info.getLocation().getManager(),
- StoredDiag->LangOpts,
+ *StoredDiag->LangOptsPtr,
Hint.RemoveRange);
}
= StoredDiag->Info.getCodeModificationHint(FixIt);
if (Range)
*Range = translateSourceRange(StoredDiag->Info.getLocation().getManager(),
- StoredDiag->LangOpts,
+ *StoredDiag->LangOptsPtr,
Hint.RemoveRange);
return CIndexer::createCXString(Hint.CodeToInsert);
}
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);
};