]> granicus.if.org Git - clang/commitdiff
Clean up the CIndex interface to diagnostic ranges. Thanks, Daniel!
authorDouglas Gregor <dgregor@apple.com>
Mon, 8 Feb 2010 23:11:56 +0000 (23:11 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 8 Feb 2010 23:11:56 +0000 (23:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95602 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/Index.h
tools/CIndex/CIndex.exports
tools/CIndex/CIndexDiagnostic.cpp
tools/c-index-test/c-index-test.c

index e5db52ea289ee0cd35ff6698b98c79a8e17584ec..90894e303ee6c6bc6e8423590a6f485d479913a4 100644 (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.
- */
-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
index 8af1897faa3984cacb13c60093db70abd0cbf9e4..2c738190b4ad4cfc0e5747c3a1591d4626349bfd 100644 (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
index 87b9f66a5c5ee8c8ae54011c92f07d1ac51255bd..d26094f7ee6f892954610c1153fc054809ac2150 100644 (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 || 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) {
index 658412c75abb07928ae8cc94ac43325033e7e9df..423fa9343af10c103cc0583c160b9a508a4f040a 100644 (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, ":");