[cfe-commits] r96425 - in /cfe/trunk: include/clang-c/Index.h tools/CIndex/CIndex.cpp tools/c-index-test/c-index-test.c

Ted Kremenek kremenek at apple.com
Tue Feb 16 16:41:32 PST 2010


Author: kremenek
Date: Tue Feb 16 18:41:32 2010
New Revision: 96425

URL: http://llvm.org/viewvc/llvm-project?rev=96425&view=rev
Log:
Change clang_getCursorKindSpelling() to return a CXString
instead of a 'const char *'.

Modified:
    cfe/trunk/include/clang-c/Index.h
    cfe/trunk/tools/CIndex/CIndex.cpp
    cfe/trunk/tools/c-index-test/c-index-test.c

Modified: cfe/trunk/include/clang-c/Index.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=96425&r1=96424&r2=96425&view=diff

==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Tue Feb 16 18:41:32 2010
@@ -1221,7 +1221,7 @@
  */
 
 /* for debug/testing */
-CINDEX_LINKAGE const char *clang_getCursorKindSpelling(enum CXCursorKind Kind);
+CINDEX_LINKAGE CXString clang_getCursorKindSpelling(enum CXCursorKind Kind);
 CINDEX_LINKAGE void clang_getDefinitionSpellingAndExtent(CXCursor,
                                           const char **startBuf,
                                           const char **endBuf,

Modified: cfe/trunk/tools/CIndex/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.cpp?rev=96425&r1=96424&r2=96425&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndex.cpp Tue Feb 16 18:41:32 2010
@@ -1369,80 +1369,114 @@
 
   if (clang_isDeclaration(C.kind))
     return getDeclSpelling(getCursorDecl(C));
-  
+
   return createCXString("");
 }
 
-const char *clang_getCursorKindSpelling(enum CXCursorKind Kind) {
+CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
   switch (Kind) {
-  case CXCursor_FunctionDecl: return "FunctionDecl";
-  case CXCursor_TypedefDecl: return "TypedefDecl";
-  case CXCursor_EnumDecl: return "EnumDecl";
-  case CXCursor_EnumConstantDecl: return "EnumConstantDecl";
-  case CXCursor_StructDecl: return "StructDecl";
-  case CXCursor_UnionDecl: return "UnionDecl";
-  case CXCursor_ClassDecl: return "ClassDecl";
-  case CXCursor_FieldDecl: return "FieldDecl";
-  case CXCursor_VarDecl: return "VarDecl";
-  case CXCursor_ParmDecl: return "ParmDecl";
-  case CXCursor_ObjCInterfaceDecl: return "ObjCInterfaceDecl";
-  case CXCursor_ObjCCategoryDecl: return "ObjCCategoryDecl";
-  case CXCursor_ObjCProtocolDecl: return "ObjCProtocolDecl";
-  case CXCursor_ObjCPropertyDecl: return "ObjCPropertyDecl";
-  case CXCursor_ObjCIvarDecl: return "ObjCIvarDecl";
-  case CXCursor_ObjCInstanceMethodDecl: return "ObjCInstanceMethodDecl";
-  case CXCursor_ObjCClassMethodDecl: return "ObjCClassMethodDecl";
-  case CXCursor_ObjCImplementationDecl: return "ObjCImplementationDecl";
-  case CXCursor_ObjCCategoryImplDecl: return "ObjCCategoryImplDecl";
-  case CXCursor_UnexposedDecl: return "UnexposedDecl";
-  case CXCursor_ObjCSuperClassRef: return "ObjCSuperClassRef";
-  case CXCursor_ObjCProtocolRef: return "ObjCProtocolRef";
-  case CXCursor_ObjCClassRef: return "ObjCClassRef";
-  case CXCursor_TypeRef: return "TypeRef";
-  case CXCursor_UnexposedExpr: return "UnexposedExpr";
-  case CXCursor_DeclRefExpr: return "DeclRefExpr";
-  case CXCursor_MemberRefExpr: return "MemberRefExpr";
-  case CXCursor_CallExpr: return "CallExpr";
-  case CXCursor_ObjCMessageExpr: return "ObjCMessageExpr";
-  case CXCursor_UnexposedStmt: return "UnexposedStmt";
-  case CXCursor_InvalidFile: return "InvalidFile";
-  case CXCursor_NoDeclFound: return "NoDeclFound";
-  case CXCursor_NotImplemented: return "NotImplemented";
-  case CXCursor_TranslationUnit: return "TranslationUnit";
+  case CXCursor_FunctionDecl:
+      return createCXString("FunctionDecl");
+  case CXCursor_TypedefDecl:
+      return createCXString("TypedefDecl");
+  case CXCursor_EnumDecl:
+      return createCXString("EnumDecl");
+  case CXCursor_EnumConstantDecl:
+      return createCXString("EnumConstantDecl");
+  case CXCursor_StructDecl:
+      return createCXString("StructDecl");
+  case CXCursor_UnionDecl:
+      return createCXString("UnionDecl");
+  case CXCursor_ClassDecl:
+      return createCXString("ClassDecl");
+  case CXCursor_FieldDecl:
+      return createCXString("FieldDecl");
+  case CXCursor_VarDecl:
+      return createCXString("VarDecl");
+  case CXCursor_ParmDecl:
+      return createCXString("ParmDecl");
+  case CXCursor_ObjCInterfaceDecl:
+      return createCXString("ObjCInterfaceDecl");
+  case CXCursor_ObjCCategoryDecl:
+      return createCXString("ObjCCategoryDecl");
+  case CXCursor_ObjCProtocolDecl:
+      return createCXString("ObjCProtocolDecl");
+  case CXCursor_ObjCPropertyDecl:
+      return createCXString("ObjCPropertyDecl");
+  case CXCursor_ObjCIvarDecl:
+      return createCXString("ObjCIvarDecl");
+  case CXCursor_ObjCInstanceMethodDecl:
+      return createCXString("ObjCInstanceMethodDecl");
+  case CXCursor_ObjCClassMethodDecl:
+      return createCXString("ObjCClassMethodDecl");
+  case CXCursor_ObjCImplementationDecl:
+      return createCXString("ObjCImplementationDecl");
+  case CXCursor_ObjCCategoryImplDecl:
+      return createCXString("ObjCCategoryImplDecl");
+  case CXCursor_UnexposedDecl:
+      return createCXString("UnexposedDecl");
+  case CXCursor_ObjCSuperClassRef:
+      return createCXString("ObjCSuperClassRef");
+  case CXCursor_ObjCProtocolRef:
+      return createCXString("ObjCProtocolRef");
+  case CXCursor_ObjCClassRef:
+      return createCXString("ObjCClassRef");
+  case CXCursor_TypeRef:
+      return createCXString("TypeRef");
+  case CXCursor_UnexposedExpr:
+      return createCXString("UnexposedExpr");
+  case CXCursor_DeclRefExpr:
+      return createCXString("DeclRefExpr");
+  case CXCursor_MemberRefExpr:
+      return createCXString("MemberRefExpr");
+  case CXCursor_CallExpr:
+      return createCXString("CallExpr");
+  case CXCursor_ObjCMessageExpr:
+      return createCXString("ObjCMessageExpr");
+  case CXCursor_UnexposedStmt:
+      return createCXString("UnexposedStmt");
+  case CXCursor_InvalidFile:
+      return createCXString("InvalidFile");
+  case CXCursor_NoDeclFound:
+      return createCXString("NoDeclFound");
+  case CXCursor_NotImplemented:
+      return createCXString("NotImplemented");
+  case CXCursor_TranslationUnit:
+      return createCXString("TranslationUnit");
   }
-  
+
   llvm_unreachable("Unhandled CXCursorKind");
-  return NULL;
+  return createCXString(NULL);
 }
 
-enum CXChildVisitResult GetCursorVisitor(CXCursor cursor, 
-                                         CXCursor parent, 
+enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
+                                         CXCursor parent,
                                          CXClientData client_data) {
   CXCursor *BestCursor = static_cast<CXCursor *>(client_data);
   *BestCursor = cursor;
   return CXChildVisit_Recurse;
 }
-  
+
 CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
   if (!TU)
     return clang_getNullCursor();
-  
+
   ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU);
 
   SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
   CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
   if (SLoc.isValid()) {
     SourceRange RegionOfInterest(SLoc, SLoc.getFileLocWithOffset(1));
-    
+
     // FIXME: Would be great to have a "hint" cursor, then walk from that
     // hint cursor upward until we find a cursor whose source range encloses
     // the region of interest, rather than starting from the translation unit.
     CXCursor Parent = clang_getTranslationUnitCursor(CXXUnit);
-    CursorVisitor CursorVis(CXXUnit, GetCursorVisitor, &Result, 
+    CursorVisitor CursorVis(CXXUnit, GetCursorVisitor, &Result,
                             Decl::MaxPCHLevel, RegionOfInterest);
     CursorVis.VisitChildren(Parent);
   }
-  return Result;  
+  return Result;
 }
 
 CXCursor clang_getNullCursor(void) {

Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=96425&r1=96424&r2=96425&view=diff

==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Tue Feb 16 18:41:32 2010
@@ -28,7 +28,7 @@
 extern char *basename(const char *);
 #endif
 
-static void PrintDiagnosticCallback(CXDiagnostic Diagnostic, 
+static void PrintDiagnosticCallback(CXDiagnostic Diagnostic,
                                     CXClientData ClientData);
 
 
@@ -40,12 +40,12 @@
 
 static unsigned CreateTranslationUnit(CXIndex Idx, const char *file,
                                       CXTranslationUnit *TU) {
-  
+
   *TU = clang_createTranslationUnit(Idx, file, PrintDiagnosticCallback, stderr);
   if (!TU) {
     fprintf(stderr, "Unable to load translation unit from '%s'!\n", file);
     return 0;
-  }  
+  }
   return 1;
 }
 
@@ -66,20 +66,20 @@
   int prefix_len = strlen("-remap-file=");
   *unsaved_files = 0;
   *num_unsaved_files = 0;
-  
+
   /* Count the number of remapped files. */
   for (arg = start_arg; arg < argc; ++arg) {
     if (strncmp(argv[arg], "-remap-file=", prefix_len))
       break;
-    
+
     ++*num_unsaved_files;
   }
-  
+
   if (*num_unsaved_files == 0)
     return 0;
-  
+
   *unsaved_files
-  = (struct CXUnsavedFile *)malloc(sizeof(struct CXUnsavedFile) * 
+  = (struct CXUnsavedFile *)malloc(sizeof(struct CXUnsavedFile) *
                                    *num_unsaved_files);
   for (arg = start_arg, i = 0; i != *num_unsaved_files; ++i, ++arg) {
     struct CXUnsavedFile *unsaved = *unsaved_files + i;
@@ -90,14 +90,14 @@
     FILE *to_file;
     const char *semi = strchr(arg_string, ';');
     if (!semi) {
-      fprintf(stderr, 
+      fprintf(stderr,
               "error: -remap-file=from;to argument is missing semicolon\n");
       free_remapped_files(*unsaved_files, i);
       *unsaved_files = 0;
       *num_unsaved_files = 0;
       return -1;
     }
-    
+
     /* Open the file that we're remapping to. */
     to_file = fopen(semi + 1, "r");
     if (!to_file) {
@@ -108,12 +108,12 @@
       *num_unsaved_files = 0;
       return -1;
     }
-    
+
     /* Determine the length of the file we're remapping to. */
     fseek(to_file, 0, SEEK_END);
     unsaved->Length = ftell(to_file);
     fseek(to_file, 0, SEEK_SET);
-    
+
     /* Read the contents of the file we're remapping to. */
     contents = (char *)malloc(unsaved->Length + 1);
     if (fread(contents, 1, unsaved->Length, to_file) != unsaved->Length) {
@@ -127,10 +127,10 @@
     }
     contents[unsaved->Length] = 0;
     unsaved->Contents = contents;
-    
+
     /* Close the file. */
     fclose(to_file);
-    
+
     /* Copy the file name that we're remapping from. */
     filename_len = semi - arg_string;
     filename = (char *)malloc(filename_len + 1);
@@ -138,7 +138,7 @@
     filename[filename_len] = 0;
     unsaved->Filename = filename;
   }
-  
+
   return 0;
 }
 
@@ -147,17 +147,23 @@
 /******************************************************************************/
 
 static void PrintCursor(CXCursor Cursor) {
-  if (clang_isInvalid(Cursor.kind))
-    printf("Invalid Cursor => %s", clang_getCursorKindSpelling(Cursor.kind));
+  if (clang_isInvalid(Cursor.kind)) {
+    CXString ks = clang_getCursorKindSpelling(Cursor.kind);
+    printf("Invalid Cursor => %s", clang_getCString(ks));
+    clang_disposeString(ks);
+  }
   else {
-    CXString string;
+    CXString string, ks;
     CXCursor Referenced;
     unsigned line, column;
+
+    ks = clang_getCursorKindSpelling(Cursor.kind);
     string = clang_getCursorSpelling(Cursor);
-    printf("%s=%s", clang_getCursorKindSpelling(Cursor.kind),
-                      clang_getCString(string));
+    printf("%s=%s", clang_getCString(ks),
+                    clang_getCString(string));
+    clang_disposeString(ks);
     clang_disposeString(string);
-    
+
     Referenced = clang_getCursorReferenced(Cursor);
     if (!clang_equalCursors(Referenced, clang_getNullCursor())) {
       CXSourceLocation Loc = clang_getCursorLocation(Referenced);
@@ -170,18 +176,18 @@
   }
 }
 
-static const char* GetCursorSource(CXCursor Cursor) {  
+static const char* GetCursorSource(CXCursor Cursor) {
   CXSourceLocation Loc = clang_getCursorLocation(Cursor);
   CXString source;
   CXFile file;
   clang_getInstantiationLocation(Loc, &file, 0, 0, 0);
   source = clang_getFileName(file);
-  if (!source.Spelling) {
+  if (!clang_getCString(source)) {
     clang_disposeString(source);
     return "<invalid loc>";
   }
   else {
-    const char *b = basename(source.Spelling);
+    const char *b = basename(clang_getCString(source));
     clang_disposeString(source);
     return b;
   }
@@ -193,18 +199,18 @@
 
 typedef void (*PostVisitTU)(CXTranslationUnit);
 
-static void PrintDiagnosticCallback(CXDiagnostic Diagnostic, 
+static void PrintDiagnosticCallback(CXDiagnostic Diagnostic,
                                     CXClientData ClientData) {
   FILE *out = (FILE *)ClientData;
   CXFile file;
   unsigned line, column;
   CXString text;
   enum CXDiagnosticSeverity severity = clang_getDiagnosticSeverity(Diagnostic);
-  
+
   /* Ignore diagnostics that should be ignored. */
   if (severity == CXDiagnostic_Ignored)
     return;
-  
+
   /* Print file:line:column. */
   clang_getInstantiationLocation(clang_getDiagnosticLocation(Diagnostic),
                                  &file, &line, &column, 0);
@@ -212,22 +218,22 @@
     unsigned i, n;
     unsigned printed_any_ranges = 0;
     CXString fname;
-    
+
     fname = clang_getFileName(file);
-    fprintf(out, "%s:%d:%d:", fname.Spelling, line, column);
+    fprintf(out, "%s:%d:%d:", clang_getCString(fname), line, column);
     clang_disposeString(fname);
-  
+
     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(range),
                                      &start_file, &start_line, &start_column,0);
       clang_getInstantiationLocation(clang_getRangeEnd(range),
                                      &end_file, &end_line, &end_column, 0);
-      
+
       if (start_file != end_file || start_file != file)
         continue;
 
@@ -236,10 +242,10 @@
     }
     if (printed_any_ranges)
       fprintf(out, ":");
-    
+
     fprintf(out, " ");
   }
-  
+
   /* Print warning/error/etc. */
   switch (severity) {
   case CXDiagnostic_Ignored: assert(0 && "impossible"); break;
@@ -248,14 +254,14 @@
   case CXDiagnostic_Error: fprintf(out, "error: "); break;
   case CXDiagnostic_Fatal: fprintf(out, "fatal error: "); break;
   }
-  
+
   text = clang_getDiagnosticSpelling(Diagnostic);
   if (clang_getCString(text))
     fprintf(out, "%s\n", clang_getCString(text));
   else
     fprintf(out, "<no diagnostic text>\n");
   clang_disposeString(text);
-  
+
   if (file) {
     unsigned i, num_fixits = clang_getDiagnosticNumFixIts(Diagnostic);
     for (i = 0; i != num_fixits; ++i) {
@@ -265,7 +271,7 @@
         CXFile insertion_file;
         unsigned insertion_line, insertion_column;
         text = clang_getDiagnosticFixItInsertion(Diagnostic, i, &insertion_loc);
-        clang_getInstantiationLocation(insertion_loc, &insertion_file, 
+        clang_getInstantiationLocation(insertion_loc, &insertion_file,
                                        &insertion_line, &insertion_column, 0);
         if (insertion_file == file)
           fprintf(out, "FIX-IT: Insert \"%s\" at %d:%d\n",
@@ -291,7 +297,7 @@
         }
         break;
       }
-          
+
       case CXFixIt_Replacement: {
         CXFile start_file, end_file;
         unsigned start_line, start_column, end_line, end_column;
@@ -325,7 +331,7 @@
   CXSourceRange extent = clang_getCursorExtent(C);
   CXFile begin_file, end_file;
   unsigned begin_line, begin_column, end_line, end_column;
-  
+
   clang_getInstantiationLocation(clang_getRangeStart(extent),
                                  &begin_file, &begin_line, &begin_column, 0);
   clang_getInstantiationLocation(clang_getRangeEnd(extent),
@@ -344,7 +350,7 @@
 } VisitorData;
 
 
-enum CXChildVisitResult FilteredPrintingVisitor(CXCursor Cursor, 
+enum CXChildVisitResult FilteredPrintingVisitor(CXCursor Cursor,
                                                 CXCursor Parent,
                                                 CXClientData ClientData) {
   VisitorData *Data = (VisitorData *)ClientData;
@@ -356,14 +362,14 @@
            GetCursorSource(Cursor), line, column);
     PrintCursor(Cursor);
     PrintCursorExtent(Cursor);
-    printf("\n");    
+    printf("\n");
     return CXChildVisit_Recurse;
   }
-  
+
   return CXChildVisit_Continue;
 }
 
-static enum CXChildVisitResult FunctionScanVisitor(CXCursor Cursor, 
+static enum CXChildVisitResult FunctionScanVisitor(CXCursor Cursor,
                                                    CXCursor Parent,
                                                    CXClientData ClientData) {
   const char *startBuf, *endBuf;
@@ -386,19 +392,19 @@
     CXSourceLocation Loc;
     CXFile file;
     CXString source;
-    
+
     if (*startBuf == '\n') {
       startBuf++;
       curLine++;
       curColumn = 1;
     } else if (*startBuf != '\t')
       curColumn++;
-          
+
     Loc = clang_getCursorLocation(Cursor);
     clang_getInstantiationLocation(Loc, &file, 0, 0, 0);
-    
+
     source = clang_getFileName(file);
-    if (source.Spelling) {
+    if (clang_getCString(source)) {
       CXSourceLocation RefLoc
         = clang_getLocation(Data->TU, file, curLine, curColumn);
       Ref = clang_getCursor(Data->TU, RefLoc);
@@ -414,7 +420,7 @@
     clang_disposeString(source);
     startBuf++;
   }
-  
+
   return CXChildVisit_Continue;
 }
 
@@ -427,18 +433,19 @@
   VisitorData *Data = (VisitorData *)ClientData;
   if (!Data->Filter || (C.kind == *(enum CXCursorKind *)Data->Filter)) {
     CXString USR = clang_getCursorUSR(C);
-    if (!USR.Spelling) {
+    if (!clang_getCString(USR)) {
       clang_disposeString(USR);
       return CXChildVisit_Continue;
     }
-    printf("// %s: %s %s", FileCheckPrefix, GetCursorSource(C), USR.Spelling);
+    printf("// %s: %s %s", FileCheckPrefix, GetCursorSource(C),
+                           clang_getCString(USR));
     PrintCursorExtent(C);
     printf("\n");
     clang_disposeString(USR);
-    
+
     return CXChildVisit_Recurse;
-  }  
-  
+  }
+
   return CXChildVisit_Continue;
 }
 
@@ -448,28 +455,28 @@
 
 void InclusionVisitor(CXFile includedFile, CXSourceLocation *includeStack,
                       unsigned includeStackLen, CXClientData data) {
-  
+
   unsigned i;
   CXString fname;
 
   fname = clang_getFileName(includedFile);
-  printf("file: %s\nincluded by:\n", fname.Spelling);
+  printf("file: %s\nincluded by:\n", clang_getCString(fname));
   clang_disposeString(fname);
-  
+
   for (i = 0; i < includeStackLen; ++i) {
     CXFile includingFile;
     unsigned line, column;
     clang_getInstantiationLocation(includeStack[i], &includingFile, &line,
                                    &column, 0);
     fname = clang_getFileName(includingFile);
-    printf("  %s:%d:%d\n", fname.Spelling, line, column);
+    printf("  %s:%d:%d\n", clang_getCString(fname), line, column);
     clang_disposeString(fname);
   }
   printf("\n");
 }
 
 void PrintInclusionStack(CXTranslationUnit TU) {
-  clang_getInclusions(TU, InclusionVisitor, NULL);  
+  clang_getInclusions(TU, InclusionVisitor, NULL);
 }
 
 /******************************************************************************/
@@ -480,15 +487,15 @@
                              const char *filter, const char *prefix,
                              CXCursorVisitor Visitor,
                              PostVisitTU PV) {
-  
+
   if (prefix)
-    FileCheckPrefix = prefix;  
+    FileCheckPrefix = prefix;
 
   if (Visitor) {
     enum CXCursorKind K = CXCursor_NotImplemented;
     enum CXCursorKind *ck = &K;
     VisitorData Data;
-  
+
     /* Perform some simple filtering. */
     if (!strcmp(filter, "all") || !strcmp(filter, "local")) ck = NULL;
     else if (!strcmp(filter, "none")) K = (enum CXCursorKind) ~0;
@@ -502,12 +509,12 @@
       fprintf(stderr, "Unknown filter for -test-load-tu: %s\n", filter);
       return 1;
     }
-  
+
     Data.TU = TU;
     Data.Filter = ck;
     clang_visitChildren(clang_getTranslationUnitCursor(TU), Visitor, &Data);
   }
-  
+
   if (PV)
     PV(TU);
 
@@ -521,9 +528,9 @@
   CXIndex Idx;
   CXTranslationUnit TU;
   int result;
-  Idx = clang_createIndex(/* excludeDeclsFromPCH */ 
+  Idx = clang_createIndex(/* excludeDeclsFromPCH */
                           !strcmp(filter, "local") ? 1 : 0);
-  
+
   if (!CreateTranslationUnit(Idx, file, &TU)) {
     clang_disposeIndex(Idx);
     return 1;
@@ -544,7 +551,7 @@
   struct CXUnsavedFile *unsaved_files = 0;
   int num_unsaved_files = 0;
   int result;
-  
+
   Idx = clang_createIndex(/* excludeDeclsFromPCH */
                           !strcmp(filter, "local") ? 1 : 0);
 
@@ -556,8 +563,8 @@
     return -1;
   }
 
-  TU = clang_createTranslationUnitFromSourceFile(Idx, 0, 
-                                                 argc - num_unsaved_files, 
+  TU = clang_createTranslationUnitFromSourceFile(Idx, 0,
+                                                 argc - num_unsaved_files,
                                                  argv + num_unsaved_files,
                                                  num_unsaved_files,
                                                  unsaved_files,
@@ -601,20 +608,20 @@
   CXFile file;
   unsigned line = 1, col = 1;
   unsigned start_line = 1, start_col = 1;
-  
+
   if (!(Idx = clang_createIndex(/* excludeDeclsFromPCH */ 1))) {
     fprintf(stderr, "Could not create Index\n");
     return 1;
   }
-  
+
   if (!CreateTranslationUnit(Idx, ast_file, &TU))
     return 1;
-  
+
   if ((fp = fopen(source_file, "r")) == NULL) {
     fprintf(stderr, "Could not open '%s'\n", source_file);
     return 1;
   }
-  
+
   file = clang_getFile(TU, source_file);
   for (;;) {
     CXCursor cursor;
@@ -642,7 +649,7 @@
 
     prevCursor = cursor;
   }
-  
+
   fclose(fp);
   return 0;
 }
@@ -654,7 +661,7 @@
 /* Parse file:line:column from the input string. Returns 0 on success, non-zero
    on failure. If successful, the pointer *filename will contain newly-allocated
    memory (that will be owned by the caller) to store the file name. */
-int parse_file_line_column(const char *input, char **filename, unsigned *line, 
+int parse_file_line_column(const char *input, char **filename, unsigned *line,
                            unsigned *column, unsigned *second_line,
                            unsigned *second_column) {
   /* Find the second colon. */
@@ -678,11 +685,11 @@
     /* Parse the next line or column. */
     values[num_values - i - 1] = strtol(last_colon + 1, &endptr, 10);
     if (*endptr != 0 && *endptr != ':') {
-      fprintf(stderr, "could not parse %s in '%s'\n", 
+      fprintf(stderr, "could not parse %s in '%s'\n",
               (i % 2 ? "column" : "line"), input);
       return 1;
     }
-    
+
     if (i + 1 == num_values)
       break;
 
@@ -691,9 +698,9 @@
     while (prev_colon != input && *prev_colon != ':')
       --prev_colon;
     if (prev_colon == input) {
-      fprintf(stderr, "could not parse %s in '%s'\n", 
+      fprintf(stderr, "could not parse %s in '%s'\n",
               (i % 2 == 0? "column" : "line"), input);
-      return 1;    
+      return 1;
     }
 
     last_colon = prev_colon;
@@ -701,7 +708,7 @@
 
   *line = values[0];
   *column = values[1];
-  
+
   if (second_line && second_column) {
     *second_line = values[2];
     *second_column = values[3];
@@ -739,30 +746,30 @@
   case CXCompletionChunk_HorizontalSpace: return "HorizontalSpace";
   case CXCompletionChunk_VerticalSpace: return "VerticalSpace";
   }
-  
+
   return "Unknown";
 }
 
 void print_completion_string(CXCompletionString completion_string, FILE *file) {
   int I, N;
-  
+
   N = clang_getNumCompletionChunks(completion_string);
   for (I = 0; I != N; ++I) {
     const char *text = 0;
     enum CXCompletionChunkKind Kind
       = clang_getCompletionChunkKind(completion_string, I);
-    
+
     if (Kind == CXCompletionChunk_Optional) {
       fprintf(file, "{Optional ");
       print_completion_string(
-                clang_getCompletionChunkCompletionString(completion_string, I), 
+                clang_getCompletionChunkCompletionString(completion_string, I),
                               file);
       fprintf(file, "}");
       continue;
     }
-    
+
     text = clang_getCompletionChunkText(completion_string, I);
-    fprintf(file, "{%s %s}", 
+    fprintf(file, "{%s %s}",
             clang_getCompletionChunkKindSpelling(Kind),
             text? text : "");
   }
@@ -771,8 +778,11 @@
 void print_completion_result(CXCompletionResult *completion_result,
                              CXClientData client_data) {
   FILE *file = (FILE *)client_data;
-  fprintf(file, "%s:", 
-          clang_getCursorKindSpelling(completion_result->CursorKind));
+  CXString ks = clang_getCursorKindSpelling(completion_result->CursorKind);
+
+  fprintf(file, "%s:", clang_getCString(ks));
+  clang_disposeString(ks);
+
   print_completion_string(completion_result->CompletionString, file);
   fprintf(file, "\n");
 }
@@ -789,7 +799,7 @@
   CXCodeCompleteResults *results = 0;
 
   input += strlen("-code-completion-at=");
-  if ((errorCode = parse_file_line_column(input, &filename, &line, &column, 
+  if ((errorCode = parse_file_line_column(input, &filename, &line, &column,
                                           0, 0)))
     return errorCode;
 
@@ -797,9 +807,9 @@
     return -1;
 
   CIdx = clang_createIndex(0);
-  results = clang_codeComplete(CIdx, 
-                               argv[argc - 1], argc - num_unsaved_files - 3, 
-                               argv + num_unsaved_files + 2, 
+  results = clang_codeComplete(CIdx,
+                               argv[argc - 1], argc - num_unsaved_files - 3,
+                               argv + num_unsaved_files + 2,
                                num_unsaved_files, unsaved_files,
                                filename, line, column,
                                PrintDiagnosticCallback, stderr);
@@ -813,7 +823,7 @@
 
   clang_disposeIndex(CIdx);
   free(filename);
-  
+
   free_remapped_files(unsaved_files, num_unsaved_files);
 
   return 0;
@@ -835,26 +845,26 @@
   CursorSourceLocation *Locations = 0;
   unsigned NumLocations = 0, Loc;
 
-  /* Count the number of locations. */ 
+  /* Count the number of locations. */
   while (strstr(argv[NumLocations+1], "-cursor-at=") == argv[NumLocations+1])
     ++NumLocations;
-  
+
   /* Parse the locations. */
   assert(NumLocations > 0 && "Unable to count locations?");
   Locations = (CursorSourceLocation *)malloc(
                                   NumLocations * sizeof(CursorSourceLocation));
   for (Loc = 0; Loc < NumLocations; ++Loc) {
     const char *input = argv[Loc + 1] + strlen("-cursor-at=");
-    if ((errorCode = parse_file_line_column(input, &Locations[Loc].filename, 
-                                            &Locations[Loc].line, 
+    if ((errorCode = parse_file_line_column(input, &Locations[Loc].filename,
+                                            &Locations[Loc].line,
                                             &Locations[Loc].column, 0, 0)))
       return errorCode;
   }
-  
-  if (parse_remapped_files(argc, argv, NumLocations + 1, &unsaved_files, 
+
+  if (parse_remapped_files(argc, argv, NumLocations + 1, &unsaved_files,
                            &num_unsaved_files))
     return -1;
-  
+
   CIdx = clang_createIndex(0);
   TU = clang_createTranslationUnitFromSourceFile(CIdx, argv[argc - 1],
                                   argc - num_unsaved_files - 2 - NumLocations,
@@ -867,20 +877,20 @@
     fprintf(stderr, "unable to parse input\n");
     return -1;
   }
-  
+
   for (Loc = 0; Loc < NumLocations; ++Loc) {
     CXFile file = clang_getFile(TU, Locations[Loc].filename);
     if (!file)
       continue;
-    
-    Cursor = clang_getCursor(TU, 
-                             clang_getLocation(TU, file, Locations[Loc].line, 
-                                               Locations[Loc].column)); 
+
+    Cursor = clang_getCursor(TU,
+                             clang_getLocation(TU, file, Locations[Loc].line,
+                                               Locations[Loc].column));
     PrintCursor(Cursor);
     printf("\n");
     free(Locations[Loc].filename);
   }
-  
+
   clang_disposeTranslationUnit(TU);
   clang_disposeIndex(CIdx);
   free(Locations);
@@ -928,7 +938,7 @@
     free(filename);
     free_remapped_files(unsaved_files, num_unsaved_files);
     return -1;
-  }  
+  }
   errorCode = 0;
 
   file = clang_getFile(TU, filename);
@@ -940,18 +950,18 @@
 
   startLoc = clang_getLocation(TU, file, line, column);
   if (clang_equalLocations(clang_getNullLocation(), startLoc)) {
-    fprintf(stderr, "invalid source location %s:%d:%d\n", filename, line, 
+    fprintf(stderr, "invalid source location %s:%d:%d\n", filename, line,
             column);
     errorCode = -1;
-    goto teardown;    
+    goto teardown;
   }
 
   endLoc = clang_getLocation(TU, file, second_line, second_column);
   if (clang_equalLocations(clang_getNullLocation(), endLoc)) {
-    fprintf(stderr, "invalid source location %s:%d:%d\n", filename, 
+    fprintf(stderr, "invalid source location %s:%d:%d\n", filename,
             second_line, second_column);
     errorCode = -1;
-    goto teardown;    
+    goto teardown;
   }
 
   range = clang_getRange(startLoc, endLoc);
@@ -971,7 +981,7 @@
     case CXToken_Literal: kind = "Literal"; break;
     case CXToken_Comment: kind = "Comment"; break;
     }
-    clang_getInstantiationLocation(clang_getRangeStart(extent), 
+    clang_getInstantiationLocation(clang_getRangeStart(extent),
                                    0, &start_line, &start_column, 0);
     clang_getInstantiationLocation(clang_getRangeEnd(extent),
                                    0, &end_line, &end_column, 0);
@@ -1059,7 +1069,7 @@
   else if (argc > 2 && strcmp(argv[1], "-test-inclusion-stack-tu") == 0)
     return perform_test_load_tu(argv[2], "all", NULL, NULL,
                                 PrintInclusionStack);
-    
+
   print_usage();
   return 1;
 }





More information about the cfe-commits mailing list