]> granicus.if.org Git - clang/commitdiff
[libclang] Introduce clang_getPresumedLocation which works like clang_getExpansionLoc...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 13 Sep 2011 21:49:08 +0000 (21:49 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 13 Sep 2011 21:49:08 +0000 (21:49 +0000)
but takes into account #line directives coming from preprocessed files.

Patch by Vinay Sajip!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139647 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/Index.h
tools/libclang/CIndex.cpp
tools/libclang/libclang.darwin.exports
tools/libclang/libclang.exports

index f54bd08883dd757d83e9f8eb3aece0863e28a135..07bcf9eec6ed92c77c96add8e90e21bad0b627ae 100644 (file)
@@ -363,6 +363,49 @@ CINDEX_LINKAGE void clang_getExpansionLocation(CXSourceLocation location,
                                                unsigned *column,
                                                unsigned *offset);
 
+/**
+ * \brief Retrieve the file, line, column, and offset represented by
+ * the given source location, as specified in a # line directive.
+ *
+ * Example: given the following source code in a file somefile.c
+ *
+ * #123 "dummy.c" 1
+ *
+ * static int func(void)
+ * {
+ *     return 0;
+ * }
+ *
+ * the location information returned by this function would be
+ *
+ * File: dummy.c Line: 124 Column: 12
+ *
+ * whereas clang_getExpansionLocation would have returned
+ *
+ * File: somefile.c Line: 3 Column: 12
+ *
+ * \param location the location within a source file that will be decomposed
+ * into its parts.
+ *
+ * \param filename [out] if non-NULL, will be set to the filename of the
+ * source location. Note that filenames returned will be for "virtual" files,
+ * which don't necessarily exist on the machine running clang - e.g. when
+ * parsing preprocessed output obtained from a different environment. If
+ * a non-NULL value is passed in, remember to dispose of the returned value
+ * using \c clang_disposeString() once you've finished with it. For an invalid
+ * source location, an empty string is returned.
+ *
+ * \param line [out] if non-NULL, will be set to the line number of the
+ * source location. For an invalid source location, zero is returned.
+ *
+ * \param column [out] if non-NULL, will be set to the column number of the
+ * source location. For an invalid source location, zero is returned.
+ */
+CINDEX_LINKAGE void clang_getPresumedLocation(CXSourceLocation location,
+                                              CXString *filename,
+                                              unsigned *line,
+                                              unsigned *column);
+
 /**
  * \brief Legacy API to retrieve the file, line, column, and offset represented
  * by the given source location.
index 2f8db5dfcef05fc5b372503f7df537c52b649c9f..51749d7849b6b2b14184f92498acd0c7c376da02 100644 (file)
@@ -2861,6 +2861,34 @@ void clang_getExpansionLocation(CXSourceLocation location,
     *offset = SM.getDecomposedLoc(ExpansionLoc).second;
 }
 
+void clang_getPresumedLocation(CXSourceLocation location,
+                               CXString *filename,
+                               unsigned *line,
+                               unsigned *column) {
+  SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data);
+
+  if (!location.ptr_data[0] || Loc.isInvalid()) {
+    if (filename)
+      *filename = createCXString("");
+    if (line)
+      *line = 0;
+    if (column)
+      *column = 0;
+  }
+  else {
+       const SourceManager &SM =
+        *static_cast<const SourceManager*>(location.ptr_data[0]);
+    PresumedLoc PreLoc = SM.getPresumedLoc(Loc);
+
+    if (filename)
+      *filename = createCXString(PreLoc.getFilename());
+    if (line)
+      *line = PreLoc.getLine();
+    if (column)
+      *column = PreLoc.getColumn();
+  }
+}
+
 void clang_getInstantiationLocation(CXSourceLocation location,
                                     CXFile *file,
                                     unsigned *line,
index a858f624c88ec08e2eda2664fc96f4fee4ef9c1f..21ef35b4572f2e06c05f523f19850dfae4e0ab11 100644 (file)
@@ -102,6 +102,7 @@ _clang_getNumOverloadedDecls
 _clang_getOverloadedDecl
 _clang_getOverriddenCursors
 _clang_getPointeeType
+_clang_getPresumedLocation
 _clang_getRange
 _clang_getRangeEnd
 _clang_getRangeStart
index 85e9f0269504b49c8ebaa98e7939261de74160fa..ea7aaf00c8963991b32e41a2b7471500f4c546f3 100644 (file)
@@ -102,6 +102,7 @@ clang_getNumOverloadedDecls
 clang_getOverloadedDecl
 clang_getOverriddenCursors
 clang_getPointeeType
+clang_getPresumedLocation
 clang_getRange
 clang_getRangeEnd
 clang_getRangeStart