I need to analyze Objective-C static code, mainly AST, after looking into the possible tools I found out that Clang tool from LLVM can dump the AST, so I used the terminal to test it using this command:
clang -cc1 -ast-dump ~/SomeTest.m
but I'm getting this error:
In file included from /Users/myusername/SomeTest.m:9:
/Users/myusername/SomeTest.h:9:9: fatal error: 'UIKit/UIKit.h' file not found
#import <UIKit/UIKit.h>
^
typedef __int128_t __int128_t;
typedef __uint128_t __uint128_t;
typedef SEL *SEL;
typedef id id;
typedef Class *Class;
struct __va_list_tag {
unsigned int gp_offset;
unsigned int fp_offset;
void *overflow_arg_area;
void *reg_save_area;
};
typedef struct __va_list_tag __va_list_tag;
typedef __va_list_tag __builtin_va_list[1];
@interface just4testViewController@end
@implementation just4testViewController
- (void) dealloc (CompoundStmt 0x7f86b183b110 </Users/myusername/SomeTest.m:14:1, line:16:1>)
- (void) didReceiveMemoryWarning (CompoundStmt 0x7f86b183b2a0 </Users/myusername/SomeTest.m:19:1, line:24:1>)
- (void) viewDidUnload (CompoundStmt 0x7f86b183b430 </Users/myusername/SomeTest.m:37:1, line:41:1>)
- (id) shouldAutorotateToInterfaceOrientation:(id)interfaceOrientation (CompoundStmt 0x7f86b183b648 </Users/myusername/SomeTest.m:44:1, line:47:1>)
@end
1 error generated.
Any idea why I'm getting this? I don't mind using any tool to extract AST from Objective-C code as long as it is reliable and provide documentation for the output
The compiler does not find the UIKit framework. You have to tell it to use it:
OP says I don't mind using any tool to extract AST from Objective-C code ...
Our DMS Software Reengingineering Toolkit can do this for Objective-C.
For this command line to the DMS-generated parser "domainparser":
this Objective C file "test.m":
produces this output with an AST:
Because the tree's shape is isomorphic to the grammar we use, the grammar is the documentation. See a previous SO answer for how we do this and yet produce an AST.
This is a code fragment taken from a popular library; it is just a fragment because otherwise the tree would be enormous. I also cheated a tiny bit, by leaving out the #imports, which let me run an easily configured parser. DMS will parse files containing #includes and retain the directive or retain the include text, depend on how its parser is configured.
This is for ObjectiveC, not ObjectiveC++. We're working on that :-}
DMS provides a lot of additional support for program analysis that operates on the ASTs it produces.
Try
-Xclang -ast-dump
instead of-cc1 -ast-dump
. (Standard disclaimer: anything using-Xclang
or-cc1
is using an unstable interface to the compiler.)