【问题标题】:Get AST Nodes of objective-C class without resolving dependencies在不解决依赖关系的情况下获取objective-C类的AST节点
【发布时间】:2019-03-07 18:28:45
【问题描述】:

我正在尝试创建一个重构工具,它允许我从 Objective-c 类中获取语法树,以便我可以更改类的结构并输出符合我的标准的不同版本。我正在查看 Clang 的 Libtooling 以生成 AST,然后从那里获取它,我遇到的问题是我需要以某种方式确保我提供了从该源导入的所有可能标头的所有路径,这就是我想避免。

我想知道是否有一种方法可以为一个类生成 AST,而不必为包含我想要重构的类所拥有的属性的类定义的框架提供路径。

理想情况下,我可以在包含属性、函数等内容的源文件的原始文本中获取节点...这样我就可以遍历该树并更改其结构,以便稍后重新生成我的源文件以所需的方式。

【问题讨论】:

  • 使用 AST Matcher + replacement 怎么样?
  • 这是我迄今为止尝试过的,但在使用此策略时遇到问题,因为编译器无法解决依赖关系,所以我想知道是否有办法获得 AST对于当前源文件,而不必向编译器提供有关我的类中包含的子属性的知识,特别是因为我只需要重组树并重新生成代码。我希望有一个参数可以让我轻松获得 AST。有什么想法@boq?
  • 不是真的...对我来说有趣的问题是为什么 Clang 无法解析您的标头。也许这篇文章有用? stackoverflow.com/a/45239905/5520012
  • 谢谢@boq,我确实觉得我需要,不幸的是,我似乎无法从我正在使用的ClangTool 的类中找到访问该API 的方法。我正在尝试使用本教程 clang.llvm.org/docs/LibASTMatchersTutorial.html 来指导自己,但到目前为止它并没有太大帮助!

标签: objective-c clang llvm-clang automated-refactoring libtooling


【解决方案1】:

在进行更多研究后,我逐渐认识到,我试图做的事情甚至不可能作为基于 LibTooling 的工具 need syntactic and semantic information about a program。可以通过compile_commands.json 文件提供此信息,如文档中所述:

Clang Tooling needs a compilation database to figure out specific build options for each file. Currently it can create a compilation database from the compile_commands.json file

对于 Xcode 项目,这个文件可以这样生成:

xcodebuild -project PROJECT_NAME.xcodeproj | xcpretty -r json-compilation-database --output compile_commands.json

您需要安装xcpretty gem。 (gem install xcpretty)

来源:https://clang.llvm.org/docs/HowToSetupToolingForLLVM.html

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2010-11-10
    相关资源
    最近更新 更多