Clean up the CIndex interface to diagnostic ranges. Thanks, Daniel!

llvm-svn: 95602
This commit is contained in:
Douglas Gregor 2010-02-08 23:11:56 +00:00
parent ebc970e4eb
commit 4b8fd6d3d3
4 changed files with 36 additions and 51 deletions

View File

@ -446,32 +446,28 @@ CINDEX_LINKAGE CXSourceLocation clang_getDiagnosticLocation(CXDiagnostic);
* \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.
* \returns the requested source range.
*/
CINDEX_LINKAGE void clang_getDiagnosticRanges(CXDiagnostic Diagnostic,
CXSourceRange **Ranges,
unsigned *NumRanges);
/**
* \brief Free the source ranges returned by \c clang_getDiagnosticRanges().
*/
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

View File

@ -4,7 +4,6 @@ _clang_createIndex
_clang_createTranslationUnit
_clang_createTranslationUnitFromSourceFile
_clang_disposeCodeCompleteResults
_clang_disposeDiagnosticRanges
_clang_disposeIndex
_clang_disposeString
_clang_disposeTokens
@ -32,7 +31,8 @@ _clang_getDiagnosticFixItRemoval
_clang_getDiagnosticFixItReplacement
_clang_getDiagnosticLocation
_clang_getDiagnosticNumFixIts
_clang_getDiagnosticRanges
_clang_getDiagnosticNumRanges
_clang_getDiagnosticRange
_clang_getDiagnosticSeverity
_clang_getDiagnosticSpelling
_clang_getFile

View File

@ -106,33 +106,23 @@ CXString clang_getDiagnosticSpelling(CXDiagnostic Diag) {
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 || !Ranges || !NumRanges ||
!StoredDiag->Info.getNumRanges() ||
StoredDiag->Info.getLocation().isInvalid())
return;
if (!StoredDiag || StoredDiag->Info.getLocation().isInvalid())
return 0;
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));
return StoredDiag->Info.getNumRanges();
}
void clang_disposeDiagnosticRanges(CXSourceRange *Ranges,
unsigned NumRanges) {
free(Ranges);
CXSourceRange clang_getDiagnosticRange(CXDiagnostic Diag, unsigned Range) {
CXStoredDiagnostic *StoredDiag = static_cast<CXStoredDiagnostic *>(Diag);
if (!StoredDiag || Range >= StoredDiag->Info.getNumRanges() ||
StoredDiag->Info.getLocation().isInvalid())
return clang_getNullRange();
return translateSourceRange(StoredDiag->Info.getLocation().getManager(),
*StoredDiag->LangOptsPtr,
StoredDiag->Info.getRange(Range));
}
unsigned clang_getDiagnosticNumFixIts(CXDiagnostic Diag) {

View File

@ -196,20 +196,20 @@ static void PrintDiagnosticCallback(CXDiagnostic Diagnostic,
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)
@ -219,7 +219,6 @@ static void PrintDiagnosticCallback(CXDiagnostic Diagnostic,
end_column+1);
printed_any_ranges = 1;
}
clang_disposeDiagnosticRanges(ranges, num_ranges);
if (printed_any_ranges)
fprintf(out, ":");