<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 13, 2016, at 11:34 PM, NAKAMURA Takumi <<a href="mailto:geek4civic@gmail.com" class="">geek4civic@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">I guess it would break layering violation.</div></div></blockquote><div><br class=""></div><div>Not sure what you mean, what is the layering violation ? </div><div>I don’t see an issue with a tool binary linking both against the libclang C API and a C++ library. I could add yet another tool binary to link just against the C++ library but I preferred the simplicity of merging the functionality into the existing one and avoid maintaining yet another one.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">libclang exports just C API and it involves clangIndex, but coremain requires clangIndex and other dependent modules.</div><div class=""><br class=""></div><div class="">I think you should do;</div><div class="">  - Export C++ API in libclang. (But I don't expect it would work for win32)</div><div class="">  - Link libclang as static. Then c-index-test became the test that didn't test "libclang".</div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Sun, Feb 14, 2016 at 3:43 PM Argyrios Kyrtzidis via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: akirtzidis<br class="">
Date: Sun Feb 14 00:39:11 2016<br class="">
New Revision: 260842<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=260842&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=260842&view=rev</a><br class="">
Log:<br class="">
[index] Enhance c-index-test tool and have it link and test the clangIndex library directly.<br class="">
<br class="">
Added:<br class="">
    cfe/trunk/test/Index/Core/<br class="">
    cfe/trunk/test/Index/Core/index-source.m<br class="">
    cfe/trunk/tools/c-index-test/core_main.cpp<br class="">
Modified:<br class="">
    cfe/trunk/include/clang/Index/IndexSymbol.h<br class="">
    cfe/trunk/lib/Index/IndexSymbol.cpp<br class="">
    cfe/trunk/tools/c-index-test/CMakeLists.txt<br class="">
    cfe/trunk/tools/c-index-test/c-index-test.c<br class="">
<br class="">
Modified: cfe/trunk/include/clang/Index/IndexSymbol.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexSymbol.h?rev=260842&r1=260841&r2=260842&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/IndexSymbol.h?rev=260842&r1=260841&r2=260842&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/include/clang/Index/IndexSymbol.h (original)<br class="">
+++ cfe/trunk/include/clang/Index/IndexSymbol.h Sun Feb 14 00:39:11 2016<br class="">
@@ -11,6 +11,7 @@<br class="">
 #define LLVM_CLANG_INDEX_INDEXSYMBOL_H<br class="">
<br class="">
 #include "clang/Basic/LLVM.h"<br class="">
+#include "llvm/ADT/STLExtras.h"<br class="">
 #include "llvm/Support/DataTypes.h"<br class="">
<br class="">
 namespace clang {<br class="">
@@ -107,6 +108,13 @@ struct SymbolInfo {<br class="">
<br class="">
 SymbolInfo getSymbolInfo(const Decl *D);<br class="">
<br class="">
+void applyForEachSymbolRole(SymbolRoleSet Roles,<br class="">
+                            llvm::function_ref<void(SymbolRole)> Fn);<br class="">
+void printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS);<br class="">
+StringRef getSymbolKindString(SymbolKind K);<br class="">
+StringRef getTemplateKindStr(SymbolCXXTemplateKind TK);<br class="">
+StringRef getSymbolLanguageString(SymbolLanguage K);<br class="">
+<br class="">
 } // namespace index<br class="">
 } // namespace clang<br class="">
<br class="">
<br class="">
Modified: cfe/trunk/lib/Index/IndexSymbol.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexSymbol.cpp?rev=260842&r1=260841&r2=260842&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexSymbol.cpp?rev=260842&r1=260841&r2=260842&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/lib/Index/IndexSymbol.cpp (original)<br class="">
+++ cfe/trunk/lib/Index/IndexSymbol.cpp Sun Feb 14 00:39:11 2016<br class="">
@@ -185,3 +185,102 @@ SymbolInfo index::getSymbolInfo(const De<br class="">
<br class="">
   return Info;<br class="">
 }<br class="">
+<br class="">
+void index::applyForEachSymbolRole(SymbolRoleSet Roles,<br class="">
+                                   llvm::function_ref<void(SymbolRole)> Fn) {<br class="">
+#define APPLY_FOR_ROLE(Role) \<br class="">
+  if (Roles & (unsigned)SymbolRole::Role) \<br class="">
+    Fn(SymbolRole::Role)<br class="">
+<br class="">
+  APPLY_FOR_ROLE(Declaration);<br class="">
+  APPLY_FOR_ROLE(Definition);<br class="">
+  APPLY_FOR_ROLE(Reference);<br class="">
+  APPLY_FOR_ROLE(Read);<br class="">
+  APPLY_FOR_ROLE(Write);<br class="">
+  APPLY_FOR_ROLE(Call);<br class="">
+  APPLY_FOR_ROLE(Dynamic);<br class="">
+  APPLY_FOR_ROLE(AddressOf);<br class="">
+  APPLY_FOR_ROLE(Implicit);<br class="">
+  APPLY_FOR_ROLE(RelationChildOf);<br class="">
+  APPLY_FOR_ROLE(RelationBaseOf);<br class="">
+  APPLY_FOR_ROLE(RelationOverrideOf);<br class="">
+  APPLY_FOR_ROLE(RelationReceivedBy);<br class="">
+<br class="">
+#undef APPLY_FOR_ROLE<br class="">
+}<br class="">
+<br class="">
+void index::printSymbolRoles(SymbolRoleSet Roles, raw_ostream &OS) {<br class="">
+  bool VisitedOnce = false;<br class="">
+  applyForEachSymbolRole(Roles, [&](SymbolRole Role) {<br class="">
+    if (VisitedOnce)<br class="">
+      OS << '/';<br class="">
+    else<br class="">
+      VisitedOnce = true;<br class="">
+    switch (Role) {<br class="">
+    case SymbolRole::Declaration: OS << "Decl"; break;<br class="">
+    case SymbolRole::Definition: OS << "Def"; break;<br class="">
+    case SymbolRole::Reference: OS << "Ref"; break;<br class="">
+    case SymbolRole::Read: OS << "Read"; break;<br class="">
+    case SymbolRole::Write: OS << "Writ"; break;<br class="">
+    case SymbolRole::Call: OS << "Call"; break;<br class="">
+    case SymbolRole::Dynamic: OS << "Dyn"; break;<br class="">
+    case SymbolRole::AddressOf: OS << "Addr"; break;<br class="">
+    case SymbolRole::Implicit: OS << "Impl"; break;<br class="">
+    case SymbolRole::RelationChildOf: OS << "RelChild"; break;<br class="">
+    case SymbolRole::RelationBaseOf: OS << "RelBase"; break;<br class="">
+    case SymbolRole::RelationOverrideOf: OS << "RelOver"; break;<br class="">
+    case SymbolRole::RelationReceivedBy: OS << "RelRec"; break;<br class="">
+    }<br class="">
+  });<br class="">
+}<br class="">
+<br class="">
+StringRef index::getSymbolKindString(SymbolKind K) {<br class="">
+  switch (K) {<br class="">
+  case SymbolKind::Unknown: return "<unknown>";<br class="">
+  case SymbolKind::Module: return "module";<br class="">
+  case SymbolKind::Macro: return "macro";<br class="">
+  case SymbolKind::Enum: return "enum";<br class="">
+  case SymbolKind::Struct: return "struct";<br class="">
+  case SymbolKind::Union: return "union";<br class="">
+  case SymbolKind::Typedef: return "typedef";<br class="">
+  case SymbolKind::Function: return "function";<br class="">
+  case SymbolKind::Variable: return "variable";<br class="">
+  case SymbolKind::Field: return "field";<br class="">
+  case SymbolKind::EnumConstant: return "enumerator";<br class="">
+  case SymbolKind::ObjCClass: return "objc-class";<br class="">
+  case SymbolKind::ObjCProtocol: return "objc-protocol";<br class="">
+  case SymbolKind::ObjCCategory: return "objc-category";<br class="">
+  case SymbolKind::ObjCInstanceMethod: return "objc-instance-method";<br class="">
+  case SymbolKind::ObjCClassMethod: return "objc-class-method";<br class="">
+  case SymbolKind::ObjCProperty: return "objc-property";<br class="">
+  case SymbolKind::ObjCIvar: return "objc-ivar";<br class="">
+  case SymbolKind::CXXClass: return "c++-class";<br class="">
+  case SymbolKind::CXXNamespace: return "namespace";<br class="">
+  case SymbolKind::CXXNamespaceAlias: return "namespace-alias";<br class="">
+  case SymbolKind::CXXStaticVariable: return "c++-static-var";<br class="">
+  case SymbolKind::CXXStaticMethod: return "c++-static-method";<br class="">
+  case SymbolKind::CXXInstanceMethod: return "c++-instance-method";<br class="">
+  case SymbolKind::CXXConstructor: return "constructor";<br class="">
+  case SymbolKind::CXXDestructor: return "destructor";<br class="">
+  case SymbolKind::CXXConversionFunction: return "coversion-func";<br class="">
+  case SymbolKind::CXXTypeAlias: return "type-alias";<br class="">
+  case SymbolKind::CXXInterface: return "c++-__interface";<br class="">
+  }<br class="">
+}<br class="">
+<br class="">
+StringRef index::getTemplateKindStr(SymbolCXXTemplateKind TK) {<br class="">
+  switch (TK) {<br class="">
+  case SymbolCXXTemplateKind::NonTemplate: return "NT";<br class="">
+  case SymbolCXXTemplateKind::Template : return "T";<br class="">
+  case SymbolCXXTemplateKind::TemplatePartialSpecialization : return "TPS";<br class="">
+  case SymbolCXXTemplateKind::TemplateSpecialization: return "TS";<br class="">
+  }<br class="">
+}<br class="">
+<br class="">
+StringRef index::getSymbolLanguageString(SymbolLanguage K) {<br class="">
+  switch (K) {<br class="">
+  case SymbolLanguage::C: return "C";<br class="">
+  case SymbolLanguage::ObjC: return "ObjC";<br class="">
+  case SymbolLanguage::CXX: return "C++";<br class="">
+  }<br class="">
+}<br class="">
<br class="">
Added: cfe/trunk/test/Index/Core/index-source.m<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-source.m?rev=260842&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-source.m?rev=260842&view=auto</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/test/Index/Core/index-source.m (added)<br class="">
+++ cfe/trunk/test/Index/Core/index-source.m Sun Feb 14 00:39:11 2016<br class="">
@@ -0,0 +1,8 @@<br class="">
+// RUN: c-index-test core -print-source-symbols -- %s | FileCheck %s<br class="">
+<br class="">
+@interface Base<br class="">
+// CHECK: [[@LINE-1]]:12 | objc-class/ObjC | Base | c:objc(cs)Base | Decl | rel: 0<br class="">
+-(void)meth;<br class="">
+// CHECK: [[@LINE-1]]:1 | objc-instance-method/ObjC | meth | c:objc(cs)Base(im)meth | Decl/Dyn/RelChild | rel: 1<br class="">
+// CHECK-NEXT: RelChild | Base | c:objc(cs)Base<br class="">
+@end<br class="">
<br class="">
Modified: cfe/trunk/tools/c-index-test/CMakeLists.txt<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/CMakeLists.txt?rev=260842&r1=260841&r2=260842&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/CMakeLists.txt?rev=260842&r1=260841&r2=260842&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/tools/c-index-test/CMakeLists.txt (original)<br class="">
+++ cfe/trunk/tools/c-index-test/CMakeLists.txt Sun Feb 14 00:39:11 2016<br class="">
@@ -1,5 +1,10 @@<br class="">
+set(LLVM_LINK_COMPONENTS<br class="">
+  support<br class="">
+)<br class="">
+<br class="">
 add_clang_executable(c-index-test<br class="">
   c-index-test.c<br class="">
+  core_main.cpp<br class="">
   )<br class="">
<br class="">
 if(NOT MSVC)<br class="">
@@ -12,10 +17,12 @@ endif()<br class="">
 if (LLVM_BUILD_STATIC)<br class="">
   target_link_libraries(c-index-test<br class="">
     libclang_static<br class="">
+    clangIndex<br class="">
   )<br class="">
 else()<br class="">
   target_link_libraries(c-index-test<br class="">
     libclang<br class="">
+    clangIndex<br class="">
   )<br class="">
 endif()<br class="">
<br class="">
<br class="">
Modified: cfe/trunk/tools/c-index-test/c-index-test.c<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=260842&r1=260841&r2=260842&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=260842&r1=260841&r2=260842&view=diff</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)<br class="">
+++ cfe/trunk/tools/c-index-test/c-index-test.c Sun Feb 14 00:39:11 2016<br class="">
@@ -23,6 +23,8 @@<br class="">
 #  include <unistd.h><br class="">
 #endif<br class="">
<br class="">
+extern int indextest_core_main(int argc, const char **argv);<br class="">
+<br class="">
 /******************************************************************************/<br class="">
 /* Utility functions.                                                         */<br class="">
 /******************************************************************************/<br class="">
@@ -4410,13 +4412,15 @@ int cindextest_main(int argc, const char<br class="">
  * size). */<br class="">
<br class="">
 typedef struct thread_info {<br class="">
+  int (*main_func)(int argc, const char **argv);<br class="">
   int argc;<br class="">
   const char **argv;<br class="">
   int result;<br class="">
 } thread_info;<br class="">
 void thread_runner(void *client_data_v) {<br class="">
   thread_info *client_data = client_data_v;<br class="">
-  client_data->result = cindextest_main(client_data->argc, client_data->argv);<br class="">
+  client_data->result = client_data->main_func(client_data->argc,<br class="">
+                                               client_data->argv);<br class="">
 }<br class="">
<br class="">
 static void flush_atexit(void) {<br class="">
@@ -4435,11 +4439,19 @@ int main(int argc, const char **argv) {<br class="">
   LIBXML_TEST_VERSION<br class="">
 #endif<br class="">
<br class="">
-  if (getenv("CINDEXTEST_NOTHREADS"))<br class="">
-    return cindextest_main(argc, argv);<br class="">
-<br class="">
+  client_data.main_func = cindextest_main;<br class="">
   client_data.argc = argc;<br class="">
   client_data.argv = argv;<br class="">
+<br class="">
+  if (argc > 1 && strcmp(argv[1], "core") == 0) {<br class="">
+    client_data.main_func = indextest_core_main;<br class="">
+    --client_data.argc;<br class="">
+    ++client_data.argv;<br class="">
+  }<br class="">
+<br class="">
+  if (getenv("CINDEXTEST_NOTHREADS"))<br class="">
+    return client_data.main_func(client_data.argc, client_data.argv);<br class="">
+<br class="">
   clang_executeOnThread(thread_runner, &client_data, 0);<br class="">
   return client_data.result;<br class="">
 }<br class="">
<br class="">
Added: cfe/trunk/tools/c-index-test/core_main.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=260842&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/core_main.cpp?rev=260842&view=auto</a><br class="">
==============================================================================<br class="">
--- cfe/trunk/tools/c-index-test/core_main.cpp (added)<br class="">
+++ cfe/trunk/tools/c-index-test/core_main.cpp Sun Feb 14 00:39:11 2016<br class="">
@@ -0,0 +1,197 @@<br class="">
+//===-- core_main.cpp - Core Index Tool testbed ---------------------------===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is distributed under the University of Illinois Open Source<br class="">
+// License. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+#include "clang/Frontend/ASTUnit.h"<br class="">
+#include "clang/Frontend/CompilerInstance.h"<br class="">
+#include "clang/Frontend/CompilerInvocation.h"<br class="">
+#include "clang/Frontend/FrontendAction.h"<br class="">
+#include "clang/Index/IndexingAction.h"<br class="">
+#include "clang/Index/IndexDataConsumer.h"<br class="">
+#include "clang/Index/USRGeneration.h"<br class="">
+#include "llvm/Support/CommandLine.h"<br class="">
+#include "llvm/Support/Signals.h"<br class="">
+#include "llvm/Support/raw_ostream.h"<br class="">
+#include "llvm/Support/PrettyStackTrace.h"<br class="">
+<br class="">
+using namespace clang;<br class="">
+using namespace clang::index;<br class="">
+using namespace llvm;<br class="">
+<br class="">
+extern "C" int indextest_core_main(int argc, const char **argv);<br class="">
+<br class="">
+namespace {<br class="">
+<br class="">
+enum class ActionType {<br class="">
+  None,<br class="">
+  PrintSourceSymbols,<br class="">
+};<br class="">
+<br class="">
+namespace options {<br class="">
+<br class="">
+static cl::OptionCategory IndexTestCoreCategory("index-test-core options");<br class="">
+<br class="">
+static cl::opt<ActionType><br class="">
+Action(cl::desc("Action:"), cl::init(ActionType::None),<br class="">
+       cl::values(<br class="">
+          clEnumValN(ActionType::PrintSourceSymbols,<br class="">
+                     "print-source-symbols", "Print symbols from source"),<br class="">
+          clEnumValEnd),<br class="">
+       cl::cat(IndexTestCoreCategory));<br class="">
+<br class="">
+static cl::extrahelp MoreHelp(<br class="">
+  "\nAdd \"-- <compiler arguments>\" at the end to setup the compiler "<br class="">
+  "invocation\n"<br class="">
+);<br class="">
+<br class="">
+}<br class="">
+} // anonymous namespace<br class="">
+<br class="">
+static void printSymbolInfo(SymbolInfo SymInfo, raw_ostream &OS);<br class="">
+static void printSymbolNameAndUSR(const Decl *D, ASTContext &Ctx,<br class="">
+                                  raw_ostream &OS);<br class="">
+<br class="">
+namespace {<br class="">
+<br class="">
+class PrintIndexDataConsumer : public IndexDataConsumer {<br class="">
+  raw_ostream &OS;<br class="">
+<br class="">
+public:<br class="">
+  PrintIndexDataConsumer(raw_ostream &OS) : OS(OS) {<br class="">
+  }<br class="">
+<br class="">
+  bool handleDeclOccurence(const Decl *D, SymbolRoleSet Roles,<br class="">
+                           ArrayRef<SymbolRelation> Relations,<br class="">
+                           FileID FID, unsigned Offset,<br class="">
+                           ASTNodeInfo ASTNode) override {<br class="">
+    ASTContext &Ctx = D->getASTContext();<br class="">
+    SourceManager &SM = Ctx.getSourceManager();<br class="">
+<br class="">
+    unsigned Line = SM.getLineNumber(FID, Offset);<br class="">
+    unsigned Col = SM.getColumnNumber(FID, Offset);<br class="">
+    OS << Line << ':' << Col << " | ";<br class="">
+<br class="">
+    printSymbolInfo(getSymbolInfo(D), OS);<br class="">
+    OS << " | ";<br class="">
+<br class="">
+    printSymbolNameAndUSR(D, Ctx, OS);<br class="">
+    OS << " | ";<br class="">
+<br class="">
+    printSymbolRoles(Roles, OS);<br class="">
+    OS << " | ";<br class="">
+<br class="">
+    OS << "rel: " << Relations.size() << '\n';<br class="">
+<br class="">
+    for (auto &SymRel : Relations) {<br class="">
+      OS << '\t';<br class="">
+      printSymbolRoles(SymRel.Roles, OS);<br class="">
+      OS << " | ";<br class="">
+      printSymbolNameAndUSR(SymRel.RelatedSymbol, Ctx, OS);<br class="">
+      OS << '\n';<br class="">
+    }<br class="">
+<br class="">
+    return true;<br class="">
+  }<br class="">
+};<br class="">
+<br class="">
+} // anonymous namespace<br class="">
+<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+// Print Source Symbols<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+static bool printSourceSymbols(ArrayRef<const char *> Args) {<br class="">
+  SmallVector<const char *, 4> ArgsWithProgName;<br class="">
+  ArgsWithProgName.push_back("clang");<br class="">
+  ArgsWithProgName.append(Args.begin(), Args.end());<br class="">
+  IntrusiveRefCntPtr<DiagnosticsEngine><br class="">
+    Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));<br class="">
+  IntrusiveRefCntPtr<CompilerInvocation><br class="">
+    CInvok(createInvocationFromCommandLine(ArgsWithProgName, Diags));<br class="">
+  if (!CInvok)<br class="">
+    return true;<br class="">
+<br class="">
+  auto DataConsumer = std::make_shared<PrintIndexDataConsumer>(outs());<br class="">
+  IndexingOptions IndexOpts;<br class="">
+  std::unique_ptr<FrontendAction> IndexAction;<br class="">
+  IndexAction = createIndexingAction(DataConsumer, IndexOpts);<br class="">
+<br class="">
+  auto PCHContainerOps = std::make_shared<PCHContainerOperations>();<br class="">
+  ASTUnit *Unit =<br class="">
+   ASTUnit::LoadFromCompilerInvocationAction(CInvok.get(), PCHContainerOps,<br class="">
+                                             Diags, IndexAction.get());<br class="">
+<br class="">
+  if (!Unit)<br class="">
+    return true;<br class="">
+<br class="">
+  return false;<br class="">
+}<br class="">
+<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+// Helper Utils<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+static void printSymbolInfo(SymbolInfo SymInfo, raw_ostream &OS) {<br class="">
+  OS << getSymbolKindString(SymInfo.Kind);<br class="">
+  if (SymInfo.TemplateKind != SymbolCXXTemplateKind::NonTemplate) {<br class="">
+    OS << '-' << getTemplateKindStr(SymInfo.TemplateKind);<br class="">
+  }<br class="">
+  OS << '/' << getSymbolLanguageString(SymInfo.Lang);<br class="">
+}<br class="">
+<br class="">
+static void printSymbolNameAndUSR(const Decl *D, ASTContext &Ctx,<br class="">
+                                  raw_ostream &OS) {<br class="">
+  if (auto *ND = dyn_cast<NamedDecl>(D)) {<br class="">
+    PrintingPolicy PrintPolicy(Ctx.getLangOpts());<br class="">
+    ND->getDeclName().print(OS, PrintPolicy);<br class="">
+  } else {<br class="">
+    OS << "<no-name>";<br class="">
+  }<br class="">
+  OS << " | ";<br class="">
+<br class="">
+  SmallString<256> USRBuf;<br class="">
+  if (generateUSRForDecl(D, USRBuf)) {<br class="">
+    OS << "<no-usr>";<br class="">
+  } else {<br class="">
+    OS << USRBuf;<br class="">
+  }<br class="">
+}<br class="">
+<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+// Command line processing.<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+int indextest_core_main(int argc, const char **argv) {<br class="">
+  sys::PrintStackTraceOnErrorSignal();<br class="">
+  PrettyStackTraceProgram X(argc, argv);<br class="">
+<br class="">
+  std::vector<const char *> CompArgs;<br class="">
+  const char *const *DoubleDash = std::find(argv, argv + argc, StringRef("--"));<br class="">
+  if (DoubleDash != argv + argc) {<br class="">
+    CompArgs = std::vector<const char *>(DoubleDash + 1, argv + argc);<br class="">
+    argc = DoubleDash - argv;<br class="">
+  }<br class="">
+<br class="">
+  cl::HideUnrelatedOptions(options::IndexTestCoreCategory);<br class="">
+  cl::ParseCommandLineOptions(argc, argv, "index-test-core");<br class="">
+<br class="">
+  if (options::Action == ActionType::None) {<br class="">
+    errs() << "error: action required; pass '-help' for options\n";<br class="">
+    return 1;<br class="">
+  }<br class="">
+<br class="">
+  if (options::Action == ActionType::PrintSourceSymbols) {<br class="">
+    if (CompArgs.empty()) {<br class="">
+      errs() << "error: missing compiler args; pass '-- <compiler arguments>'\n";<br class="">
+      return 1;<br class="">
+    }<br class="">
+    return printSourceSymbols(CompArgs);<br class="">
+  }<br class="">
+<br class="">
+  return 0;<br class="">
+}<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div>
</div></blockquote></div><br class=""></body></html>