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


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95602 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports
index 8af1897..2c73819 100644
--- a/tools/CIndex/CIndex.exports
+++ b/tools/CIndex/CIndex.exports
@@ -4,7 +4,6 @@
 _clang_createTranslationUnit
 _clang_createTranslationUnitFromSourceFile
 _clang_disposeCodeCompleteResults
-_clang_disposeDiagnosticRanges
 _clang_disposeIndex
 _clang_disposeString
 _clang_disposeTokens
@@ -32,7 +31,8 @@
 _clang_getDiagnosticFixItReplacement
 _clang_getDiagnosticLocation
 _clang_getDiagnosticNumFixIts
-_clang_getDiagnosticRanges
+_clang_getDiagnosticNumRanges
+_clang_getDiagnosticRange
 _clang_getDiagnosticSeverity
 _clang_getDiagnosticSpelling
 _clang_getFile
diff --git a/tools/CIndex/CIndexDiagnostic.cpp b/tools/CIndex/CIndexDiagnostic.cpp
index 87b9f66..d26094f 100644
--- a/tools/CIndex/CIndexDiagnostic.cpp
+++ b/tools/CIndex/CIndexDiagnostic.cpp
@@ -106,33 +106,23 @@
   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) {
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 658412c..423fa93 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -196,20 +196,20 @@
   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 @@
               end_column+1);
       printed_any_ranges = 1;
     }
-    clang_disposeDiagnosticRanges(ranges, num_ranges);
     if (printed_any_ranges)
       fprintf(out, ":");