如何使用libclang获取C / C ++模块信息

时间:2016-01-26 11:35:27

标签: c++ clang clang++ llvm-clang

我正在尝试使用libclang中的模块功能。以下是上下文:

我定义了一个clang模块和一个调用它的源文件:

module.modulemap

module test {
  requires cplusplus
  header "test.h"
}

test.h

#pragma once

static inline int foo() { return 1; }

test.cpp

// Try the following command:
// clang++ -fmodules -fcxx-modules -fmodules-cache-path=./cache_path -c test.cpp
// If you see stuff in the ./cache_path directory, then it works!
#include "test.h"

int main(int, char **) {
  return foo();
}

cache_path首先是空的,然后在命令后我可以看到其中的内容,这样就可以了。

我的问题是当我尝试使用libclang来解析test.cpp文件以获取有关模块的信息时:

#include <stdio.h>
#include "clang-c/Index.h"
/*
compile with:
clang -lclang -o module_parser module_parser.c
*/
static enum CXChildVisitResult 
visitor(CXCursor cursor, CXCursor parent, CXClientData data)
{
  CXSourceLocation loc;
  CXFile file;
  CXString module_import;
  CXModule module;
  CXString module_name;
  CXString module_full_name;
  unsigned line;
  unsigned column;
  unsigned offset;
  if (clang_getCursorKind(cursor) == CXCursor_ModuleImportDecl)
  {
    loc = clang_getCursorLocation(cursor);
    clang_getSpellingLocation(loc,
                              &file,
                              &line,
                              &column,
                              &offset);

    module_import = clang_getCursorSpelling(cursor);
    printf("Module import dec at line: %d \"%s\"\n", line, clang_getCString(module_import));
    clang_disposeString(module_import);
  }
  module = clang_Cursor_getModule(cursor);
  module_name = clang_Module_getName(module);
  module_full_name = clang_Module_getFullName(module);
  printf("Module name %s , full name %s\n", clang_getCString(module_name),
                                            clang_getCString(module_full_name));
  clang_disposeString(module_name);
  clang_disposeString(module_full_name);

  return CXChildVisit_Recurse; // visit complete AST recursivly
}

int main(int argc, char *argv[]) {
  CXIndex Index = clang_createIndex(0, 1);
  const char *args[] = { "-x",
                         "c++",
                         "-fmodules",
                         "-fcxxmodules"//,
                         "-fmodules-cache-path",
                         "cache_path"
                         };
  CXTranslationUnit TU = clang_createTranslationUnitFromSourceFile(Index,
                                                      "test.cpp",
                                                      6,
                                                      args,
                                                      0,
                                                      0);

  clang_visitChildren(clang_getTranslationUnitCursor(TU), visitor, 0);

  clang_disposeTranslationUnit(TU);
  clang_disposeIndex(Index);
  return 0;
}

此代码的输出为:

...
Module name  , full name 
Module name  , full name 
Module name  , full name 
Module name  , full name 
Module name  , full name 
...

首先,似乎clang没有检测到任何类型CXCursor_ModuleImportDecl的游标,然后在任何一个问题上找到一个有效的模块。

我做错了什么?

0 个答案:

没有答案