* \brief Retrieve the text of the given diagnostic.
*/
CINDEX_LINKAGE CXString clang_getDiagnosticSpelling(CXDiagnostic);
+
+/**
+ * \brief Determine the number of source ranges associated with the given
+ * diagnostic.
+ */
+CINDEX_LINKAGE unsigned clang_getDiagnosticNumRanges(CXDiagnostic);
/**
- * \brief Retrieve the source ranges associated with the diagnostic.
+ * \brief Retrieve a source range associated with the diagnostic.
*
- * These source ranges highlight important elements in the source
+ * A diagnostic's source ranges highlight important elements in the source
* code. On the command line, Clang displays source ranges by
* underlining them with '~' characters.
*
- * \param Diagnostic the diagnostic whose ranges are being extracted.
+ * \param Diagnostic the diagnostic whose range is being extracted.
*
- * \param Ranges [out] will be set to a newly-allocated array
- * containing the source ranges of this diagnostic. These ranges must
- * be freed with \c clang_disposeDiagnosticRanges().
+ * \param Range the zero-based index specifying which range to
*
- * \param NumRanges [out] will be set to the number of source ranges
- * in the \p Ranges array.
- */
-CINDEX_LINKAGE void clang_getDiagnosticRanges(CXDiagnostic Diagnostic,
- CXSourceRange **Ranges,
- unsigned *NumRanges);
-
-/**
- * \brief Free the source ranges returned by \c clang_getDiagnosticRanges().
+ * \returns the requested source range.
*/
-CINDEX_LINKAGE void clang_disposeDiagnosticRanges(CXSourceRange *Ranges,
- unsigned NumRanges);
+CINDEX_LINKAGE CXSourceRange clang_getDiagnosticRange(CXDiagnostic Diagnostic,
+ unsigned Range);
/**
* \brief Determine the number of fix-it hints associated with the
_clang_createTranslationUnit
_clang_createTranslationUnitFromSourceFile
_clang_disposeCodeCompleteResults
-_clang_disposeDiagnosticRanges
_clang_disposeIndex
_clang_disposeString
_clang_disposeTokens
_clang_getDiagnosticFixItReplacement
_clang_getDiagnosticLocation
_clang_getDiagnosticNumFixIts
-_clang_getDiagnosticRanges
+_clang_getDiagnosticNumRanges
+_clang_getDiagnosticRange
_clang_getDiagnosticSeverity
_clang_getDiagnosticSpelling
_clang_getFile
return CIndexer::createCXString(Spelling.str(), true);
}
-void clang_getDiagnosticRanges(CXDiagnostic Diag,
- CXSourceRange **Ranges,
- unsigned *NumRanges) {
- if (Ranges)
- *Ranges = 0;
- if (NumRanges)
- *NumRanges = 0;
+unsigned clang_getDiagnosticNumRanges(CXDiagnostic Diag) {
+ CXStoredDiagnostic *StoredDiag = static_cast<CXStoredDiagnostic *>(Diag);
+ if (!StoredDiag || StoredDiag->Info.getLocation().isInvalid())
+ return 0;
+ return StoredDiag->Info.getNumRanges();
+}
+
+CXSourceRange clang_getDiagnosticRange(CXDiagnostic Diag, unsigned Range) {
CXStoredDiagnostic *StoredDiag = static_cast<CXStoredDiagnostic *>(Diag);
- if (!StoredDiag || !Ranges || !NumRanges ||
- !StoredDiag->Info.getNumRanges() ||
+ if (!StoredDiag || Range >= StoredDiag->Info.getNumRanges() ||
StoredDiag->Info.getLocation().isInvalid())
- return;
+ return clang_getNullRange();
- unsigned N = StoredDiag->Info.getNumRanges();
- *Ranges = (CXSourceRange *)malloc(sizeof(CXSourceRange) * N);
- *NumRanges = N;
- for (unsigned I = 0; I != N; ++I)
- (*Ranges)[I] = translateSourceRange(
- StoredDiag->Info.getLocation().getManager(),
- *StoredDiag->LangOptsPtr,
- StoredDiag->Info.getRange(I));
-}
-
-void clang_disposeDiagnosticRanges(CXSourceRange *Ranges,
- unsigned NumRanges) {
- free(Ranges);
+ return translateSourceRange(StoredDiag->Info.getLocation().getManager(),
+ *StoredDiag->LangOptsPtr,
+ StoredDiag->Info.getRange(Range));
}
unsigned clang_getDiagnosticNumFixIts(CXDiagnostic Diag) {
clang_getInstantiationLocation(clang_getDiagnosticLocation(Diagnostic),
&file, &line, &column, 0);
if (file) {
- CXSourceRange *ranges = 0;
- unsigned num_ranges;
- unsigned i;
+ unsigned i, n;
unsigned printed_any_ranges = 0;
fprintf(out, "%s:%d:%d:", clang_getFileName(file), line, column);
- clang_getDiagnosticRanges(Diagnostic, &ranges, &num_ranges);
- for (i = 0; i != num_ranges; ++i) {
+ n = clang_getDiagnosticNumRanges(Diagnostic);
+ for (i = 0; i != n; ++i) {
CXFile start_file, end_file;
+ CXSourceRange range = clang_getDiagnosticRange(Diagnostic, i);
+
unsigned start_line, start_column, end_line, end_column;
- clang_getInstantiationLocation(clang_getRangeStart(ranges[i]),
+ clang_getInstantiationLocation(clang_getRangeStart(range),
&start_file, &start_line, &start_column,0);
- clang_getInstantiationLocation(clang_getRangeEnd(ranges[i]),
+ clang_getInstantiationLocation(clang_getRangeEnd(range),
&end_file, &end_line, &end_column, 0);
if (start_file != end_file || start_file != file)
end_column+1);
printed_any_ranges = 1;
}
- clang_disposeDiagnosticRanges(ranges, num_ranges);
if (printed_any_ranges)
fprintf(out, ":");