Objective-C头文件解析

6
我需要解析一些Objective-C头文件。
  • 我尝试使用Doxygen并解析XML输出,但它不完全支持没有注释的Objective C头文件(在属性中定义宏时会出错,请参见Doxygen not properly recognizing properties
  • 我也尝试使用appledoc,但XML输出不够完整(例如,类的继承信息没有),并且在属性上有与宏相同的问题。
  • 我还尝试解析库Objective C元数据的输出(使用otool),但注意到元数据不保留方法的类型(因此您会得到method:(id)param:(id)

有人知道一个好工具能做到我想要的吗?我怀疑clang会帮助我,但到目前为止,-ast-dump和类似选项只是尝试为我没有源代码的源生成AST。

2个回答

16

你也许可以使用libclang。libclang是一个编程接口,旨在实现语法高亮和代码补全等工具。

clang -ast-dump 对我很有用。(请注意,-ast-dump不受驱动程序支持,因此您需要进行一些额外的工作来传递驱动程序通常处理的标志。您可以使用 clang -### ... 看看驱动程序正在做什么。)

% clang -cc1 -ast-dump -fblocks -x objective-c /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h
[...]
|-ObjCInterfaceDecl 0x1023727c0 <line:50:1, line:96:2> NSObject
| |-ObjCProtocol 0x102371350 'NSObject'
[...]

1
就是这样。我不知道为什么以前不起作用,但现在它可以工作了。我现在遇到的一个问题是一些导入不起作用(例如 #import <Foundation/Foundation.h> 这样的东西),但正如你所说,我将不得不向驱动程序传递参数。 - Edu Garcia

-6

我认为使用clang听起来太难了。我会只用正则表达式。

相反,我会编写一个简单的shell脚本包装Doxygen,注释掉有问题的语法。

这应该很容易改变:

@property(nonatomic, retain) BOOL myProperty NS_AVAILABLE_IOS(3_2);

To:

@property(nonatomic, retain) BOOL myProperty /*NS_AVAILABLE_IOS(3_2)*/;

你甚至可以将像 NS_DEPRECATED() 这样的内容转换为 @deprecated 注释。

2
不,正则表达式无法解决此问题,原因在此答案中已经列出:https://dev59.com/X3I-5IYBdhLWcg3wq6do - bbum
@bbum 我不会只用正则表达式,我会使用正则表达式和其他脚本语言的混合。我有多年使用正则表达式解析编程语言的经验,在这种情况下可以做到并且很容易。 - Abhi Beckert
2
我保证,无论您应用哪种正则表达式和脚本语言的组合,我都可以找到一个完全有效的ObjC语法位,它会打破它,直到您最终重新发明整个符合标准的编译器……;) - bbum
@bbum,它不需要涵盖所有ObjC的语法,只需要涵盖头文件和doxygen无法处理的特定部分。根据问题,只有5或6个编译器宏会导致问题。这并不是一个需要大费周折去解决的问题。 - Abhi Beckert
3
直到另一件事情出现造成阻碍,这并不是一个大问题。我已经历过这样的情况。曾经参与维护糟糕的正则表达式堆栈,用于解析系统头文件以生成PyObjC和其他桥接所使用的语言桥接元数据,结果变得非常混乱。现在改用clang,效果好多了 - 很多很多。 - bbum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接