From cc31f6a45f825f73f45c2c860bd2846a8f81c5cc Mon Sep 17 00:00:00 2001
From: Saleem Abdulrasool <compnerd@compnerd.org>
Date: Thu, 12 Nov 2015 03:57:16 +0000
Subject: [PATCH] libclang: add new StringSet type

This allows the return of a set of CXStrings from libclang.  This is setup work
for an upcoming change to permit returning multiple mangled symbols.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@252852 91177308-0d34-0410-b5e6-96231b3b80d8
---
 include/clang-c/CXString.h      | 10 ++++++++++
 tools/libclang/CXString.cpp     | 15 +++++++++++++++
 tools/libclang/CXString.h       |  2 ++
 tools/libclang/libclang.exports |  1 +
 4 files changed, 28 insertions(+)

diff --git a/include/clang-c/CXString.h b/include/clang-c/CXString.h
index a649cdf82fc..68ab7bc5244 100644
--- a/include/clang-c/CXString.h
+++ b/include/clang-c/CXString.h
@@ -40,6 +40,11 @@ typedef struct {
   unsigned private_flags;
 } CXString;
 
+typedef struct {
+  CXString *Strings;
+  unsigned Count;
+} CXStringSet;
+
 /**
  * \brief Retrieve the character data associated with the given string.
  */
@@ -50,6 +55,11 @@ CINDEX_LINKAGE const char *clang_getCString(CXString string);
  */
 CINDEX_LINKAGE void clang_disposeString(CXString string);
 
+/**
+ * \brief Free the given string set.
+ */
+CINDEX_LINKAGE void clang_disposeStringSet(CXStringSet *set);
+
 /**
  * @}
  */
diff --git a/tools/libclang/CXString.cpp b/tools/libclang/CXString.cpp
index dec8ebcd98e..ca9989bc21c 100644
--- a/tools/libclang/CXString.cpp
+++ b/tools/libclang/CXString.cpp
@@ -112,6 +112,15 @@ CXString createCXString(CXStringBuf *buf) {
   return Str;
 }
 
+CXStringSet *createSet(const std::vector<std::string> &Strings) {
+  CXStringSet *Set = new CXStringSet;
+  Set->Count = Strings.size();
+  Set->Strings = new CXString[Set->Count];
+  for (unsigned SI = 0, SE = Set->Count; SI < SE; ++SI)
+    Set->Strings[SI] = createDup(Strings[SI]);
+  return Set;
+}
+
 
 //===----------------------------------------------------------------------===//
 // String pools.
@@ -175,5 +184,11 @@ void clang_disposeString(CXString string) {
       break;
   }
 }
+
+void clang_disposeStringSet(CXStringSet *set) {
+  delete[] set->Strings;
+  delete set;
+}
+
 } // end: extern "C"
 
diff --git a/tools/libclang/CXString.h b/tools/libclang/CXString.h
index 72ac0cf4691..6473eb2d710 100644
--- a/tools/libclang/CXString.h
+++ b/tools/libclang/CXString.h
@@ -68,6 +68,8 @@ CXString createRef(std::string String) = delete;
 /// \brief Create a CXString object that is backed by a string buffer.
 CXString createCXString(CXStringBuf *buf);
 
+CXStringSet *createSet(const std::vector<std::string> &Strings);
+
 /// \brief A string pool used for fast allocation/deallocation of strings.
 class CXStringPool {
 public:
diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports
index fd157bc4951..352ba5766ae 100644
--- a/tools/libclang/libclang.exports
+++ b/tools/libclang/libclang.exports
@@ -120,6 +120,7 @@ clang_disposeOverriddenCursors
 clang_disposeCXPlatformAvailability
 clang_disposeSourceRangeList
 clang_disposeString
+clang_disposeStringSet
 clang_disposeTokens
 clang_disposeTranslationUnit
 clang_enableStackTraces
-- 
GitLab